matlab - ćwiczeniaslawek.zut.edu.pl/fileadmin/2012-2013/slawek - matlab - ćwiczenia... ·...
TRANSCRIPT
dr Sławomir Marczyński Matlab - ćwiczenia 1/38
MATLAB – ćwiczenia
Spis treści 1. Podstawy ............................................................................................................................................. 2
1.1. Tworzenie katalogu roboczego, przygotowanie do pracy ............................................................ 2
1.2. Matlab jako kalkulator .................................................................................................................. 2
1.3. Wpisywanie macierzy i wektorów bezpośrednio z konsoli .......................................................... 4
1.4. Tworzenie macierzy przy pomocy funkcji Matlaba ...................................................................... 4
1.4. Najprostsze matematyczne operacje na macierzach ................................................................... 7
1.5. Wizualizacja macierzy ................................................................................................................... 7
2. I/O ........................................................................................................................................................ 9
2.1. Wprowadzanie danych liczbowych do programu Matlab ............................................................ 9
2.2. Zapis wyników ............................................................................................................................ 12
2.3. Czytanie i zapisywanie plików graficznych ................................................................................. 13
2.4. Czytanie plików dźwiękowych .................................................................................................... 14
3. Rozwiązywanie równań ..................................................................................................................... 16
3.1. Równania nieliniowe, fzero ........................................................................................................ 16
3.2. Układy równań liniowych ........................................................................................................... 19
4. Rozwiązywanie równań ODE ............................................................................................................. 22
4.1. Prosty przypadek – oscylator harmoniczny ................................................................................ 22
4.2. Po co tyle funkcji ode? ................................................................................................................ 23
4.3. Trudniejszy problem - wahadło na gumce ................................................................................. 25
4.4. Automatyczne kończenie obliczeń – strzelanie z wiatrówki ...................................................... 29
4.5. Bardzo krótko o chaosie dynamicznym ...................................................................................... 33
5. Wykresy w Matlabie .......................................................................................................................... 35
5.1. Wykresy 2D ................................................................................................................................. 35
5.2. Wykresy 3D ................................................................................................................................. 37
5.2. Animacje ..................................................................................................................................... 38
dr Sławomir Marczyński Matlab - ćwiczenia 2/38
1. Podstawy
1.1. Tworzenie katalogu roboczego, przygotowanie do pracy Utwórz na pulpicie folder Lab, utwórz w nim folder cw-01. Uruchom program Matlab, ustaw jako
katalog roboczy utworzony poprzednio folder cw-01. W programie Matlab wybierz z menu opcję
Command Window Only (jak na poniższej ilustracji). Utworzenie odrębnego katalogu ma dwie zalety:
unikamy konfliktów nazw; łatwo jest utrzymać porządek. Aby uniknąć problemów używamy tylko
tych liter, które są określone w standardzie ASCII. Napisz słowo diary w oknie poleceń i naciśnij enter.
Ilustracja 1. Ustawienie programu Matlab z właściwym dla pierwszych zajęć katalogu roboczym i wybór odpowiedniego ustawienia okien do dalszej pracy z programem.
1.2. Matlab jako kalkulator Matlab może służyć do prostych obliczeń. Sprawdź, czy Matlab prawidłowo obliczy ile jest ,
, , , itd. (Ilustracja 2.)
Zadanie 1. Czy wynik dzielenia dwóch liczb całkowitych będzie zawsze taki sam w języku C
i w Matlabie?
Zadanie 2. Niewymierna liczba jest zapisywana w Matlabie jako pi. A jak w Matlab jest
zapisywana liczba która jest podstawą logarytmów naturalnych?
Zadanie 3. Czym różni się funkcja Matlaba cosd od funkcji cos?
Zadanie 4. Jak obliczyć w Matlabie wyrażoną w stopniach wartość funkcji arcus tangens
dla wartości zmiennej niezależnej równej jeden?
Zadanie 5. Czy polecenie format służy w programie Matlab do formatowanie dysku?
Możemy zapisywać wyniki obliczeń w zmiennych itd. Poleceniem format zmieniamy sposób w jaki
Matlab będzie wyświetlał liczby. Do wypisywania wyników nadaje się też funkcja fprintf, nieco
podobna do znanej z języka C funkcji printf. (Ilustracja 3.) Wydając polecenie help dostajemy opis
możliwości polecenia/funkcji programu Matlab jako tekst w oknie konsoli. Polecenie doc ma
podobne działanie, ale wyświetla dokumentację jako hipertekst. (Ilustracja 4.)
dr Sławomir Marczyński Matlab - ćwiczenia 3/38
Ilustracja 2. Matlab jako kalkulator.
Ilustracja 3. Różne formaty wyświetlania wyników.
Ilustracja 4. Hipertekstowy opis działania polecenia format, jaki widać po wywołaniu doc format. Ten sam tekst można odnaleźć z menu programu Matlab.
dr Sławomir Marczyński Matlab - ćwiczenia 4/38
1.3. Wpisywanie macierzy i wektorów bezpośrednio z konsoli
Ilustracja 5. Wprowadzanie wektorów i macierzy wprost z klawiatury, liczba po liczbie.
Wektory w Matlabie to macierze o jednym wierszu (albo o jednej kolumnie). Macierze wpisuje się
z konsoli tak jak widać to na ilustracji powyżej. Średnik oznacza koniec wiersza macierzy, można też
po prostu nacisnąć enter, co zrobiono przy wprowadzaniu macierzy B. Oczywiście, dla wielkich
macierzy, zawierających miliony elementów, metody te są zupełnie nieprzydatne.
Zadanie 6. Wpisz bezpośrednio z klawiatury macierz
1.4. Tworzenie macierzy przy pomocy funkcji Matlaba
Matlab rozumie zapis 10:5:25 jako zwięzły sposób zapisu ciągu 10, 15, 20, 25. W ten sposób możemy
łatwo tworzyć rozmaite macierze.
Zadanie 7. Używając jedynie notacji z dwukropkiem wprowadź do programu Matlab
macierz:
mającą 99 wierszy i 99 kolumn.
Zadanie 8. Jak usunąć z tej macierzy pierwszy i ostatni wiersz, tak aby otrzymana macierz
miała 97 wierszy i 99 kolumn?
dr Sławomir Marczyński Matlab - ćwiczenia 5/38
Ilustracja 6. Tworzenie macierzy przy pomocy operatora dwukropka.
Poza notacją z dwukropkiem w Matlabie używa się funkcji generujących takie macierze jak macierz
zerowa, jednostkowa, z losowymi elementami, magiczna itd. Używając ich razem z transpozycją i
innymi przestawieniami elementów oraz wydzielającymi przekątne, macierz górna lub dolną itd.,
można względnie łatwo uzyskać macierz jaka nam jest potrzebna. Funkcja gallery tworzy często
używane (do testów) macierze takie jak np. macierz Householdera czy macierz Toeplitz’a itp.
Ilustracja 7. Użycie funkcji ones, diag i fliplr do utworzenia macierzy trójprzekątniowej.
Zadanie 9. Jaka macierz powstanie w Matlabie po wydaniu polecenia diag(n) gdy n = 5 ?
Zadanie 10. Utwórz poleceniem A = rand(100) macierz losową, następnie rozłóż ją na sumę
dwóch macierzy , takich że oraz dla .
dr Sławomir Marczyński Matlab - ćwiczenia 6/38
Zadanie 11. Utwórz poleceniem M = magic(3) kwadrat magiczny, sprawdź wynik poleceń
fliplr(M), flipud(M), triu(M), tril(M), tril(triu(M)), diag(M), diag(diag(M)),
rot90(M). Sprawdź czy jest analogiczna funkcja do rot90, ale z „obrotem w
drugą stronę”?
Zadanie 12. Przy pomocy funkcji gallery utwórz macierz trójdiagonalną o 100 wierszach i
100 kolumnach.
Jeszcze jedną możliwością jest składanie macierzy z podmacierzy, co wyjaśnia kolejna ilustracja. Gdy
w wyniku operacji powiększa się rozmiar macierzy, to dane z już utworzonej wcześniej części mogą
być przepisywane w pamięci komputera. Dlatego sklejanie dużych macierzy z bardzo małych
pojedynczych elementów jest nieefektywne. Do dobrego stylu programowania należy, jeżeli już
musimy np. użyć pętli for, wstępne ustalenie wielkości macierzy wywołaniem funkcji zeros lub ones –
niepotrzebne inicjalizacja bloku pamięci zerami jest znacznie mniej kosztowna niż wielokrotna
realokacja i kopiowanie.
Ilustracja 8. Komponowanie macierzy z podmacierzy.
Zadanie 13. Utwórz, łącząc ze sobą mniejsze macierze, macierz:
Oczywiście zawsze możemy uzyskać macierz w wyniku obliczeń. Możliwe jest także używanie
wyrażenia logicznego do utworzenia zakresu indeksów tablicy. W przykładzie powyżej w macierzy,
będącej iloczynem Kroneckera, zastępujemy zerami wszystkie elementy większe niż 9.
Zadanie 14. Czy istnieje specjalna funkcja Matlaba do tworzenia iloczynu Kroneckera
macierzy?
dr Sławomir Marczyński Matlab - ćwiczenia 7/38
Zadanie 15. Jeżeli macierz M = magic(7), to czym jest M(1,1), M(1,:), M(:,1), M(:,2:) oraz
M(end,2:2:end) ?
Zadanie 16. Co stanie się gdy utworzymy macierz R = rand(6), a potem przypiszemy do jej
drugiego wiersza macierz pustą R(2,:) = [] ?
Ilustracja 9. Używanie operacji matematycznych i warunków logicznych do tworzenia macierzy.
1.4. Najprostsze matematyczne operacje na macierzach
Zadanie 17. Utwórz macierz A = magic(4), macierz B = triu(ones(4)), wektor v = 1:4, oblicz
sumę macierzy A+B, różnicę A-B, pomnóż macierze A*B, sprawdź czy można
pomnożyć A*v oraz v*A; czym różnią się iloczyny v'*v, v*v', v.*v; co oblicza
iloczyn A.*B ?
1.5. Wizualizacja macierzy
Dla dużych macierzy bardziej celowe może być przyglądanie się macierzom nie jako tablicom liczb,
ale jako obrazom w których każdy piksel ma kolor zależny od wartości elementu macierzy, co
pokazuje przykład poniżej.
dr Sławomir Marczyński Matlab - ćwiczenia 8/38
Ilustracja 10. Zastosowanie funkcji imagesc do poglądowego przedstawienia macierzy. Od razu widać że tylko na przekątnej są niezerowe elementy. Podobnie działa funkcja spy, ale pokazuje ona tylko położenie niezerowych elementów.
dr Sławomir Marczyński Matlab - ćwiczenia 9/38
2. I/O
2.1. Wprowadzanie danych liczbowych do programu Matlab Utwórz na pulpicie folder cw-02 w folderze Lab. Skopiuj1 do niego pliki z P:\Matlab\cw-02 ().
Uruchom program Matlab, przejdź do katalogu Lab/cw-02 jako katalogu bieżącego. Wydaj najpierw
polecenie diary 'notes.txt', a potem diary on.
Zadanie 18. Wydaj polecenie dir, czy nazwy plików będą widoczne wraz z rozszerzeniami?
Do czego służą polecenia type dane1.txt, open dane1.txt, edit dane1.txt
oraz load dane1.txt ? Co stanie się gdy, po wydaniu polecenia load dane1.txt,
wydasz polecenia who, whos, size(dane1), length(dane1), plot(dane1),
imagesc(dane1) ?
Ilustracja 11. Czytanie pliku dane1.txt poleceniem load.
Zadanie 19. Obejrzyj zawartość pliku dane2.txt. Przy pomocy funkcji textread przeczytaj
pierwsze 3 linie z pliku dane2.txt jako odpowiednio tablicę s napisów i trzy
wektory x, y, z wartości liczbowych. Czy można poleceniem textread przeczytać
wszystkie dane z tego pliku? Dlaczego texscan bez ograniczenia liczby wierszy
powoduje błąd wykonania w Matlabie? (Ilustracja 12.)
Zadanie 20. Spróbuj wczytać te same pierwsze trzy linie z pliku dane2.txt używając
polecenia uiimport. Który z tych dwóch sposobów będzie działać w Octave?
Zadanie 21. Przeczytaj wszystkie dane z pliku dane2.txt używając funkcji textscan.
1 Jeżeli używasz komputera na pracowni. Jeżeli nie masz dostępu do tego dysku pobierz odpowiedni plik zip ze
strony http://slawek.zut.edu.pl.
dr Sławomir Marczyński Matlab - ćwiczenia 10/38
Zadanie 22. Przeczytaj wszystkie dane z pliku dane3.txt używając funkcji textscan w ten
sposób, aby pominąć tekst komentarza (zapisanego w konwencji C).
Jedno z możliwych rozwiązań jest na ilustracji. (Ilustracja 15.) Aby pominąć komentarze zastosowana
jest opcja CommentStyle; niektóre macierze są tworzone funkcją reshape z wektorów do których
zostały wczytane.
Ilustracja 12. Czytanie danych z pliku dane2.txt funkcją textread i przez kreatora importu uiimport.
Ilustracja 13. Czytanie przy pomocy textscan pliku tekstowego w którym występują różne bloki danych.
dr Sławomir Marczyński Matlab - ćwiczenia 11/38
Ilustracja 14. Plik dane3.txt – zawiera łańcuchy znaków w cudzysłowach, liczby, dodatkowe puste linie i komentarze.
Ilustracja 15. Współpraca funkcji textscan z funkcją reshape i czytanie napisów ujętych w cudzysłowy %q.
Zadanie 23. Użyj funkcji dlmread do wczytania zapisanych w pliku dane4.csv danych jako
macierzy. Co się stało z brakującymi wartościami i czy nie prościej byłoby użyć
funkcji csvread? Jak rozróżnić zero przeczytane z danych od zera wrzuconego
jako wartość zastępcza dla brakujących danych? Czy dobrym pomysłem byłoby
użycie przecinków zamiast średników przy czytaniu plików zapisanych z
przecinkiem dziesiętnym zamiast kropki dziesiętnej?
Zadanie 24. Użyj funkcji importdata aby wczytać dane zapisane w pliku dane4.csv. Czy
brakujące wartości są teraz jednoznacznie określone?
Zadanie 25. Użyj niskopoziomowych funkcji wejścia/wyjścia do przetwarzania pliku
dane4.csv. Kiedy można odnieść korzyść z wywołania funkcji takich jak fgetl
skoro prościej jest użyć importdata ? Jak przeczytać plik, w którym brakujące
wartości zostały zamarkowane znakiem gwiazdki * ?
dr Sławomir Marczyński Matlab - ćwiczenia 12/38
Ilustracja 16. Plik dane4.csv czytany funkcjami dlmread i import data.
2.2. Zapis wyników
Dla każdego sposobu w jaki można wczytać dane do Matlaba istnieje zbliżony w koncepcji sposób
zapisu plików. Dla load to save, dla dlmread to dlmwrite itd. Praktyczne znaczenie, dla
początkujących, mają funkcje save, disp i fprintf.
Zadanie 26. Utwórz macierz o pięciu wierszach i pięciu kolumnach wywołaniem rand(5).
Zapisz tę macierz do pliku Matlaba zgodnego z wersją 4. tego programu. Zapisz
tę macierz do pliku tekstowego o nazwie los.txt. Jak zmieni się plik los.txt gdy
użyjesz opcji –double ? (Ilustracja 17.)
Zadanie 27. Do czego służy funkcja disp w Matlabie? Spróbuj wywołać disp(pi),
disp(magic(3)), disp('napis ćwiczebny'). Czy wynik wywołania disp zależy od
średnika na końcu linii? Czy w wyniku działania disp zmienia się wartość
zmiennej ans ?
Zadanie 28. Użyj funkcji fprintf i pętli for do wypisania tabelki wartości funkcji sinus dla
kątów od do co , tak aby w każdej linii był napis sinus %f = %f, gdzie
zamiast %f powinny być odpowiednie wartości. (Ilustracja 18.)
Zadanie 29. Użyj funkcji fopen, fprintf i fclose aby do pliku log.txt dopisać dane zwracane
przez date i clock. Dane które już były w pliku nie powinny zostać zniszczone.
W jaki sposób można dopisać do tego pliku bieżącą godzinę i minutę pozyskane
wywołaniem fix(clock) ? (Ilustracja 19.)
dr Sławomir Marczyński Matlab - ćwiczenia 13/38
Ilustracja 17. Standardowy zapis (bez double) może być zbyt mało dokładny. Nawet użycie opcji -double nie gwarantuje utraty dokładności wywołanej błędami zaokrągleń przy pisaniu i czytaniu do plików tekstowych.
Ilustracja 18. Zastosowanie funkcji fprintf i pętli for. Jeżeli chcemy wpisać całą pętlę w jednej linii, to do rozdzielenia używamy przecinków.
Ilustracja 19. Dopisywanie na końcu pliku przez podanie 'a' przy otwarciu pliku. Otwierając plik przez fopen('log.txt', 'w') zniszczylibyśmy już w nim istniejące dane.
2.3. Czytanie i zapisywanie plików graficznych
Podstawowe funkcje do czytania i zapisywania plików w formatach JPEG, GIF, PNG i podobnych to
imread i imwrite oraz print. Zamiast imread można wywoływać funkcję importdata, która
automatycznie wybierze właściwy sposób czytania (czyli wywoła imread).
dr Sławomir Marczyński Matlab - ćwiczenia 14/38
Zadanie 30. Użyj funkcji imread do przeczytania pliku dane5.bmp, wyświetl go funkcją
image, oblicz macierz taką że , są współrzędnymi
piksela na obrazie, a macierze , , reprezentują składowe czerwoną,
zieloną i niebieską. Zastąp zerami wszystkie te elementy macierzy które są
mniejsze niż wartości największej. Wyświetl otrzymaną w ten sposób
macierz jako obraz funkc image w odwróconej skali szarości. Zapisz tę
macierz jako plik JPEG, wyeksportuj wykres Figure 1 jako plik PNG.
Ilustracja 20. Przetwarzanie plików grafiki rastrowej.
2.4. Czytanie plików dźwiękowych Zadanie 31. Najpierw użyj funkcji wavread do przeczytania pliku dane6.wav, potem spróbuj
odtworzyć funkcją wavplay. Otwórz ten sam plik funkcją importdata. Spróbuj
teraz odsłuchać ten sam plik przy odtwarzaniu normalnym, dwukrotnie
przyspieszonym i dwukrotnie zwolnionym. Czy dane wczytane przez wavread
były odtworzone we właściwym tempie? Jakie jest domyślne tempo
odtwarzania dla wavplay ?
Ilustracja 21. Odtwarzanie dźwięku w Matlabie (wymaga podłączonych głośników lub słuchawek).
dr Sławomir Marczyński Matlab - ćwiczenia 15/38
Zadanie 32. Wyświetl wykres dźwięku jaki został zarejestrowany pomiędzy 2 a 3 sekundą
nagrania.
Ilustracja 22. Wykres dźwięku zapisanego w pliku dane6.wav.
dr Sławomir Marczyński Matlab - ćwiczenia 16/38
3. Rozwiązywanie równań
Załóż na pulpicie folder Lab/cw-03. Uruchom program Matlab, przejdź do Lab/cw-03 jako do katalogu
roboczego. Uruchom poleceniem diary zapis wydanych poleceń do pliku notes.txt.
3.1. Równania nieliniowe, fzero
Zadanie 33. Rozwiąż równanie znajdując wszystkie pierwiastki mniejsze niż 20.
Aby rozwiązać powyższe zadanie zastosujesz funkcję fzero, ale najpierw narysuj wykres aby ogólnie
zorientować się gdzie mogą być szukane miejsca zerowe.
Ilustracja 23. Wykres funkcji przedstawiających lewą (lhs) i prawą stronę (rhs) równania. Tam gdzie przecinają się ciągłe linie, niebieska i zielona, tam równanie jest spełnione.
Teraz użyj pętli for, aby znaleźć odpowiednie pierwiastki. Zauważ, że pierwsze przecięcie jest blisko
, czyli dla , natomiast kolejne w pobliżu , gdzie
,7 (bo założyliśmy ). Wyniki obliczeń dopisuj do wektora x0. Dla ułatwienia zamiast
wydawać polecenia wprost z konsoli użyj skryptu (nazwij go zadanie33.m).
1 % definicje funkcji 2 % 3 lhs = @(x)(sin(x)); 4 rhs = @(x)(exp(-x)); 5 eq = @(x)(lhs(x) - rhs(x)); 6 7 % zakres wykresu i ilość punktów 8 % 9 a = -1.0; 10 b = 24.0; 11 n = 2500; 12 13 % wykresy funkcji 14 % 15 x = linspace(a,b,n); 16 plot( x,lhs(x), x,rhs(x) ); 17 grid on; 18 title 'sin(x), exp(-x)'; 19 xlabel 'x'; 20 ylabel 'y'; 21 line( xlim, [0,0], 'Color', 'red','LineStyle',':' );
dr Sławomir Marczyński Matlab - ćwiczenia 17/38
22 23 % znajdowanie pierwiastków 24 % 25 x0 = []; 26 for k = 1:7 27 x0 = [x0; fzero( eq, (k-1)*pi) ]; 28 end 29 30 % wyniki jako kolumna liczb i na wykresie 31 % 32 format long 33 disp(x0); 34 hold on; plot(x0,lhs(x0),'or');
Ilustracja 24. Graficzne przedstawienie pierwiastków równania
Zadanie 34. Napisz skrypt, który znajduje wszystkie dodatnie rozwiązania równanie
, wiedząc że sekund, hertzów.
Zadanie to można rozwiązać w podobny sposób jak poprzednie. Ponieważ , to gdy
rozwiązań być nie może. Dlatego szukamy takich pierwiastków , dla których
. Okres sinusoidalnych zmian wynosi , dlatego będziemy badać
funkcję dzieląc każdy taki okres na dziesięć podprzedziałów (funkcja
sinus ma tylko 3 miejsca zerowe na okres). W każdym podprzedziale, dzięki pętli while, używamy
funkcji fzero, której przekazujemy jako pierwszy parametr równanie, a jako drugi parametr zakres.
Blok try-catch służy do wyciszenia sygnalizacji błędu, jakim jest szukanie miejsca zerowego gdzie go
nie ma.
1 % definicja funkcji 2 % 3 T = 10.0; % sekund 4 f = 50.0; % Hz 5 eq = @(t)( exp(-2.0*t/T) .* sin(2.0*pi*f*t) - 0.5 ); 6 7 % zakres wykresu i ilość punktów
dr Sławomir Marczyński Matlab - ćwiczenia 18/38
8 % 9 a = 0; 10 b = -0.5 * T * log(0.5); % obliczone z warunku zadania 11 n = 25000; 12 13 % wykres funkcji 14 % 15 t = linspace(a,b,n); 16 plot( t,eq(t) ); 17 grid on; 18 title 'exp(-2.0*t/T) * sin(2.0*pi*f*t) - 0.5'; 19 xlabel 't'; 20 line( xlim, [0,0], 'Color', 'red','LineStyle',':' ); 21 22 % znajdowanie pierwiastków 23 % 24 t_roots = []; 25 t_start = a; 26 t_delta = 1/f * 0.1; 27 while (t_start < b) 28 try 29 t_roots = [t_roots; fzero( eq, [t_start, t_start+t_delta] )]; 30 catch 31 end 32 t_start = t_start + t_delta; 33 end 34 35 % wyniki 36 % 37 format long 38 disp(t_roots);
Ilustracja 25. Wykres funkcji @(t)( exp(-2.0*t/T) .* sin(2.0*pi*f*t).^2 - 0.5 ).
Zadanie 35. Zmodyfikuj skrypt z poprzedniego zadania tak, aby powstała funkcja
fz(T,freq,treshold), która pozwoli obliczyć zera dla dowolnego podanego
okresu, częstotliwości oscylacji i progu (który nie musi wynosić 0.5).
dr Sławomir Marczyński Matlab - ćwiczenia 19/38
3.2. Układy równań liniowych
Zadanie 36. Oblicz natężenie prądu elektrycznego płynącego przez opornik R3 w obwodzie
elektrycznym (Ilustracja 26). Dane są oporności ,
, i napięcia , .
Ilustracja 26. Obwód elektryczny.
Korzystając z pierwszego i drugiego prawa Kirchhoffa możemy napisać układ trzech równań liniowych
opisujących przepływ prądu przez oporniki:
W metodzie prądów oczkowych mamy mniej równań
a natężenie prądu płynącego przez opornik R3 obliczymy jako .
Równania te możemy zapisać macierzowo jako , gdzie:
,
Jak łatwo zauważyć, macierz w metodzie prądów oczkowych to na przekątnej suma oporów w
danym oczku i z odpowiednim znakiem opory wspólne dla oczek poza przekątną). Odpowiedni skrypt
w Matlabie ma postać:
1 R1 = 10.0E3; % om 2 R2 = 20.0E3; % om 3 R3 = 30.0E3; % om 4 V1 = 1.4; % wolt 5 V2 = 1.5; % wolt 6 7 A = [ R1+R3, -R3 ; -R3, R2+R3 ]; 8 b = [ -V1 ; V2 ]; 9 x = A \ b; 10 I3 = x(2) - x(1); 11 12 fprintf('natezenie pradu plynacego przez R3 wynosi I3 = %f [A]\n', I3)
Zadanie 37. Małgosia, Kuba i Jaś idą na wycieczkę. Muszą zabrać 15 kg sprzętu. Małgosia
postawiła warunek: będzie niosła połowę tego co Jaś. Ile sprzętu będzie niósł
każdy z uczestników wycieczki?
dr Sławomir Marczyński Matlab - ćwiczenia 20/38
To zadanie pozornie jest łatwe, ale przecież mamy tylko dwa równania i trzy niewiadome. Zapisując je
macierzowo mamy:
Takie równanie ma oczywiście nieskończenie wiele rozwiązań. Ale oczywiście nam nie zależy na
nieskończenie wielu – lecz na przynajmniej jednym z nich możliwym do praktycznego zastosowania.
Ilustracja 27. Minimalne rozwiązanie problemu z wycieczką, tj. takie że suma kwadratów obciążeń jest najmniejsza: dla rozwiązania obliczonego przez dzielenie wynosi 125, dla rozwiązania obliczonego z macierzy pseudoodwrotnej jest mniejsza niż 81. Jeżeli przedstawimy rozwiązania w przestrzeni n-wymiarowej (konkretnie w trójwymiarowej), to rozwiązanie otrzymane z macierzy pseudoodwrotnej jest po prostu rozwiązaniem najbliższym początkowi układu współrzędnych.
Zadanie 38. Przy pomocy suwmiarki zmierzono wielokrotnie rozmiary wałka, otrzymując
następujące wartości wyrażone w milimetrach , , ,
, , . Ile wynosi długość ?
(Ilustracja 28)
Ilustracja 28. Wałek.
Moglibyśmy zadanie to rozwiązać odejmując mm, moglibyśmy też odjąć
mm. Jednak najlepiej ułożyć układ sześciu równań z czterema
niewiadomymi:
dr Sławomir Marczyński Matlab - ćwiczenia 21/38
Ten układ nie ma rozwiązania (jest sprzeczny), ale możemy pomnożyć i otrzymać
równanie z macierzą kwadratową, które następnie rozwiązujemy przez dzielenie w lewo, lub
znajdując macierz odwrotną . Możemy też od razu podzielić A \ b. Możemy użyć macierzy
pseudoodwrotnej pinv(A). Końcowy wynik, po zaokrągleniu do dwóch cyfr po przecinku, wynosi
mm.
Trudniejszym zadaniem mogłoby być wyznaczenie niepewności pomiarowej otrzymanego wyniku
(przy założeniu że dane były mierzone z dokładnością mm). Dobrą metodą byłyby obliczenia
Monte Carlo: wielokrotnie, np. milion razy, tworzylibyśmy dane wejściowe zaburzone losowo
i rozwiązywalibyśmy układ równań, aby następnie dokonać analizy statystycznej.
Ilustracja 29. Rozwiązania układu w którym jest więcej równań niż niewiadomych to liczby które gwarantują najmniejsze rozbieżności pomiędzy lewymi a prawymi stronami. Jak widać różne schematy rozwiązywania prowadzą do nieznacznie różnych wyników (dwie ostatnie cyfry znaczące).
dr Sławomir Marczyński Matlab - ćwiczenia 22/38
4. Rozwiązywanie równań ODE
Jednym z trudnych zadań, jakie może napotkać inżynier, jest rozwiązywanie równań różniczkowych
zwyczajnych. Równania takie to powiązanie wielkości aktualnie występujących z różnymi przyrostami
(wyrażonymi przez pochodne). Do ich rozwiązywania analityczne podejście jest nieskuteczne niemal
w każdym praktycznym przypadku i dlatego stosuje się metody przybliżone. Z programem takim jak
Matlab nasze zadanie sprowadza się tylko do podania równań i warunków rozwiązywania – resztę
pracy wykona za nas komputer.
4.1. Prosty przypadek – oscylator harmoniczny Klasycznym problemem, i to nie tylko mechaniki, są drgania harmoniczne tłumione pod wpływem
zewnętrznej siły wymuszającej.
Zadanie 39. Mamy ruch opisany równaniem:
Jak użyć programu Matlab dla zbadania co się dzieje, jeżeli ,
, , , początkowe położenie ,
a prędkość początkowo wynosi zero?
Zaczynamy od rozbicia równania na równania stopnia pierwszego, bo Matlab będzie rozwiązywać
układy równań pierwszego stopnia:
W pliku oscylator.m zapisujemy2 funkcję oscylator, która musi mieć dwa parametry: pierwszy
reprezentuje zmienną niezależną, drugi jest wektorem ze zmiennymi zależnymi (czyli w konkretnym
przypadku są to położenie i prędkość).
function dqdt = oscylator(t,q) omega0 = 1000.0; omega = 2000.0; zeta = 0.1; A = 0.05; dqdt = [ q(2) -2*zeta*omega0*q(2) - omega0^2*q(1)-(omega^2- omega0^2)*A*sin(omega*t) ]; end
Aby wykonać obliczenia wydajemy Matlabowi polecenie:
ode45(@oscylator,[0 0.10],[0.15 0],odeset('OutputSel',1));
2 Nazwa funkcji oscylator musi być zgodna z nazwą pliku oscylator.m. Identyfikator dqdt oznaczający
zwracany wektor, choć jest bezpośrednio po słowie kluczowym function, nie jest nazwą funkcji.
dr Sławomir Marczyński Matlab - ćwiczenia 23/38
Funkcja ode45 zostaje wywołana z czterema parametrami – uchwytem do funkcji oscylator, zakresem
zmiennej niezależnej dla jakiego należy wykonać obliczenia, wektorem wartości początkowych i
opcjami utworzonymi przez odeset (jako 'OutputSel' wybieramy zmienną 1, czyli położenie). Matlab
wykona obliczenia rysując wykres3 obrazujący rozwiązanie.
Ilustracja 30. Drgania tłumione zanikają zastępowane przez drgania wymuszone
4.2. Po co tyle funkcji ode? Matlab oferuje łatwą zmianę algorytmu rozwiązywania równań – wystarczy zamiast np. ode45 użyć
funkcji ode113 lub ode23 – aktualny wykaz znajdziemy w dokumentacji on-line do programu Matlab,
np. pisząc polecenie doc ode45. Po co jednak tyle funkcji ode4 – czy nie wystarczyłaby jedna, ode45?
Na kolejnym rysunku poniżej widzimy zły efekt działania ode45 dla bardzo długich czasów: fałszywy
okres i zanik amplitudy. Fikcyjny okres powstał dzięki aliasingowi – jak to się stało wyjaśnia kolejny
rysunek. Zanik amplitudy powstał wskutek kumulacji błędów numerycznych. Wybór innego schematu
obliczeń (np. ode23t) pozwala na ocenę w jakim stopniu otrzymane wyniki są poprawne. Szczególnie
uważać należy na takie równania, które określa się jako odporne5 (stiff equations). Gdy próbujemy
rozwiązać je numerycznie nieodpowiednimi dla nich metodami, takimi jak właśnie ode45, to
3 Zależność . Jeżeli wybierzemy 2, to zostanie narysowany wykres . Jeżeli pominiemy czwarty parametr
lub po prostu damy optset(), to wykreślone zostaną wszystkie zmienne na jednym wykresie.
4 Funkcje ode23 (Shampine-Bogacki) i ode45 (Dormand-Prince) implementują schematy Runge-Kutty rzędu
odpowiednio 3 i 4 oraz 4 i 5. Każda z nich w trakcie działania używa pary metod po to, aby móc ocenić dokładność obliczeń i odpowiednio dobrać krok. Funkcja ode113 używa wielokrokowej, z predykatorem i korektorem, automatycznym dopasowaniem rzędu i kroku, metody Adamsa-Bashfortha-Moultona (i jest przeniesiona z fortranowskich DE/STEP/INTERP Shampine’a i Gordona). Funkcja ode15s implementuje techniki „różniczkowania do tyłu” NDF (Klopfenstein-Shampine) i BDF wybierając wzory rzędu od 1 do 5. Funkcja ode23s wywodzi się z metody Rosenbrocka, ale ma pewne udoskonalenia (Shampine-Reichelty). Funkcja ode23t to niejawna metoda trapezów, funkcja ode23tb to ode23t z różniczkowaniem BDF. Jak widać metody te są dość zaawansowane (i można ewentualnie wywoływać je z różnymi ustawieniami, np. dostarczając jakobian). Ponadto Octave ma wbudowaną funkcję lsode (Livermore Solver of ODE), która wymaga nieco innej kolejności parametrów niż funkcje znane z Matlaba.
5 Rozpowszechniło się, niezbyt poprawne, tłumaczenie stiff equations na równania sztywne.
0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1-0.25
-0.2
-0.15
-0.1
-0.05
0
0.05
0.1
0.15
0.2
dr Sławomir Marczyński Matlab - ćwiczenia 24/38
automatyczny wybór kroku zawodzi. Wydaje się nawet, że w praktycznych problemach najczęściej
będziemy mieli do czynienia z równaniami odpornymi, a przezorne traktowanie wszystkich równań
jako sztywnych nie jest szkodliwe.
Zadanie 40. Rozwiąż poprzednie zadanie dla zerowego tłumienia , dla czasów od
do , , , , stosując różne metody (ode45, ode113, ode23t
itd.). Napisz skrypt w Matlabie, który rozwiązuje równanie wybraną metodą
i rysuje trzy wykresy: zależność i zależność , oraz czyli diagram
fazowy. Czy amplituda drgań jest stała, rośnie czy maleje po dłuższym czasie?
Jaka metoda daje najbardziej wiarygodne rezultaty? Sprawdź, co na ten temat
można znaleźć w dokumentacji programu Matlab. (Ilustracja 31. Rozwiązania
tego samego równania (oscylator harmoniczny bez tłumienia i bez
wymuszenia, , ), ta sama procedura, tj. ode45, ale różny zakresu
czasu symulacji. Po lewej czas w symulacji kończy się na 100 sekundach, po
prawej po 100 tysiącach sekund (czyli 1000 razy więcej niż po lewej). (Ilustracja
31.)
Ilustracja 31. Rozwiązania tego samego równania (oscylator harmoniczny bez tłumienia i bez wymuszenia, , ), ta sama procedura, tj. ode45, ale różny zakresu czasu symulacji. Po lewej czas w symulacji kończy się na 100 sekundach, po prawej po 100 tysiącach sekund (czyli 1000 razy więcej niż po lewej).
Zadanie 41. Aliasing. Stablicuj, jako y1, funkcję sinus w przedziale od do z krokiem
. Stablicuj, jako y2, funkcję sinus w tym samym przedziale, ale z krokiem
np. . Wykreśl y1 i y2 na jednym wykresie, obie linie mają rozciągać
się na ten sam zakres odciętych. (Ilustracja 32.)
Ilustracja 32. Zjawisko aliasingu – przeskakiwane są całe okresy, powstaje krzywa (czerwona) o fałszywie wydłużonym okresie.
-1 -0.5 0 0.5 1-0.4
-0.3
-0.2
-0.1
0
0.1
0.2
0.3diagram fazowy
x1
x2
0 20 40 60 80 100-1
-0.5
0
0.5
1położenie
t
x1
0 20 40 60 80 100-0.4
-0.3
-0.2
-0.1
0
0.1
0.2
0.3prędkość
t
x2 -1 -0.5 0 0.5 1
-0.4
-0.3
-0.2
-0.1
0
0.1
0.2
0.3diagram fazowy
x1
x2
0 2 4 6 8 10
x 104
-1
-0.5
0
0.5
1położenie
t
x1
0 2 4 6 8 10
x 104
-0.4
-0.3
-0.2
-0.1
0
0.1
0.2
0.3prędkość
t
x2
0 10 20 30 40 50 60 70 80 90 100-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
sin
()
dr Sławomir Marczyński Matlab - ćwiczenia 25/38
4.3. Trudniejszy problem - wahadło na gumce Ruch oscylatora harmonicznego jest opisany w tysiącach książek i istnieją jego rozwiązania
analityczne. Spróbujmy teraz zastosować Matlab do problemu6 lepiej wykazującego skuteczność
obliczeń numerycznych.
Mamy ciężarek o masie 100 gramów przywiązany do jednometrowej nici gumowej, tak że wisząc na
niej rozciągnął ją o 10 centymetrów. Masę gumki pomijamy, opór powietrza pomijamy, siłę Coriolisa
pomijamy, przyspieszenie normalne ziemskie wynosi . Gumka jest przywiązana
drugim końcem do początku układu współrzędnych, tj. w tym miejscu współrzędne , , wynoszą
zero. Chcemy zobaczyć, jak będzie poruszać się ciężarek na gumce.
Ilustracja 33. Układ osi współrzędnych dla zadania „gumka i ciężarek”.
Najtrudniejsze jest uwzględnienie, że czasami gumka jest napięta – a czasami luźna – i to wyklucza7
rozwiązanie analityczne, czyli zapisane matematycznym wzorem. Dodatkowo warto zauważyć, że
„wahadło na gumce” może wychylać się o duże kąty, tj. takie dla których nie można uznać iż
. I oczywiście – mamy trzy stopnie swobody (trzy współrzędne). Wyprowadzenia są w
kolejnym akapicie, ale można je pominąć – najważniejsze są równania otrzymane na końcu – właśnie
to te równania będziemy rozwiązywali numerycznie.
Początkową długość gumki oznaczamy . Jeżeli ciężarek jest w punkcie o współrzędnych , to
jest w odległości od początku układu współrzędnych. Jeżeli , to gumka jest
nienaciągnięta i na ciężarek działa tylko jego ciężar . Jeżeli , to na ciężarek działa także
naciąg gumki, równy co do wartości . Stałą wyliczamy ze wzoru , w
którym jest długością gumki po rozciągnięciu przez nieruchomo wiszący
ciężarek. Problem jest trójwymiarowy. Składowe ciężaru są oczywiste: ,
. Składowe siły są też nietrudne do określenia:
,
,
, gdzie
oczywiście może być (dla nienapiętej gumki) równe zero. Stąd (i z drugiej zasady dynamiki
Newtona) równania ruchu: , , , gdzie jest
prędkością ciężarka. Warunki początkowe opiszmy jako bycie w miejscu o współrzędnych ,
gdzie , i poruszanie się z prędkością taką, że jej wektor ma kąt elewacji , a jego rzut na
6 W podręcznikach zwykle nie ma innych sił sprężystych niż liniowo i symetrycznie zależne od odkształcenia. Nie
jest to realistyczne, ale znakomicie ułatwia wyprowadzanie wzorów matematycznych. Fizyka aż do XX wieku starannie omijała problemy nieliniowe, zwłaszcza prowadzące do chaosu dynamicznego.
7 Jeżeli jakiś geniusz dałby sobie radę z tym problemem… to wystarczy nieco zmodyfikować np. użyty model
sprężystości… albo uwzględnić masę gumki… albo dodać opór powietrza… Każda taka modyfikacja jest dość łatwa w modelu numerycznym, lecz dla „ścisłego” rozwiązania wprost zabójcza.
dr Sławomir Marczyński Matlab - ćwiczenia 26/38
płaszczyznę jest odchylony o kąt od kierunku osi (patrz rysunek). Pionowa składowa prędkości
początkowej jest równa , natomiast poziome składowe to
, . Jak widać układ współrzędnych wybraliśmy tak, aby oś
była skierowana pionowo w górę, a oś przechodziła przez punkt w którym jest ciężarek w czasie
. (Nie zmniejsza to ogólności rozwiązań.) Jeżeli ktoś w tym miejscu trochę się pogubił – to nie
powinien się martwić – do tej pory omawialiśmy szczegóły wymagające koncentracji, ale dość nudne i
drugoplanowe.
Mamy więc układ sześciu równań:
gdzie jest równe jeżeli to wyrażenie jest dodatnie, a zero w pozostałych
przypadkach.
Chcąc numerycznie rozwiązać ten problem tworzymy w katalogu roboczym8 plik o nazwie gumka.m.
W pliku tym są, jak widać, dwie funkcje – jedna o nazwie gumka (czyli zgodnej z nazwą pliku i ta
będzie uruchamiała obliczenia) – druga o nazwie fcn (czyli subfunkcja dostępna tylko z poziomu
funkcji gumka). Nasza funkcja gumka będzie wywoływała biblioteczną funkcję ode45, a ta w czasie
rozwiązywania problemu, aby obliczyć prawe strony układu równań, będzie używać funkcji fcn.
Warto zauważyć, w jaki sposób przekazywane są dodatkowe parametry do funkcji fcn – dopisujemy
je jako piąty i kolejne argumenty do wywołania ode45, a w funkcji fcn pojawiają się jako trzeci itd.
Alternatywną możliwością jest używanie zmiennych globalnych, albo definiowanie ich jako lokalnych
w samej funkcji fcn. Każde z tych rozwiązań ma wady i zalety.9
function gumka % % GUMKA - rozwiązywanie równań ODE (2012, Sławomir Marczyński) % Parametry i dane wejściowe
8 W Microsoft Windows Vista domyślnym katalogiem roboczym dla programu Matlab jest „Moje
dokumenty/Matlab” zwykle na dysku systemowym C:, jednak w czasie zajęć w pracowni komputerowej ZUT należy używać dysku D:, bo dysk C: może być niedostępny dla niektórych operacji.
9 Przekazywanie za każdym razem parametrów może nieco spowolnić obliczenia, globalne zmienne mogą więc
dawać większą prędkość działania. Zmienne globalne… są globalne, to znaczy są globalne nie tylko w obrębie danego pliku, ale są wspólne dla wszystkich funkcji jakie są w Matlabie użyte. I to może prowadzić do trudnych do wykrycia błędów, konfliktów nazw. Natomiast zdefiniowanie zmiennych wyłącznie lokalnie nie pozwala na sensowne modyfikowanie ich wartości z zewnątrz.
dr Sławomir Marczyński Matlab - ćwiczenia 27/38
m = 0.1 ; % masa ciężarka w kilogramach l0 = 1.0 ; % długość nitki gumowej (nierozciągniętej), metry l = 1.1 ; % długość nitki gumowej (po zawieszeniu ciężarka), metry g = 9.81 ; % przyspieszenie ziemskie normalne, metry na sekundę^2 k = m * g / (l - l0); % Warunki początkowe x0 = 0.5; % w metrach y0 = 0.0; % w metrach z0 = -0.5; % w metrach v0 = 0.1; % prędkość początkowa, w metrach na sekundę alfa = 90.0; % kąt w stopniach beta = 0.0; % kąt w stopniach v0x = v0 * cosd(beta) * cosd(alfa); v0y = v0 * cosd(beta) * sind(alfa); v0z = v0 * sind(beta); init = [ x0, y0, z0, v0x, v0y, v0z]; % Parametry sterujące symulacją n = 500; % w ilu punktach ma być podane rozwiązanie t_start = 0; % czas startu symulacji, sekundy t_end = 20; % czas stopu symulacji, sekundy t = linspace(t_start, t_end, n); % generowanie wektora czasu opt = odeset('InitialStep',0.0001/v0,'MaxStep',0.0001/v0); % W tym miejscu wywołujemy ode45 aby rozwiązać równanie [czas, wyniki] = ode45(@fcn, t, init, opt, m, l0, k, g); % Równanie jest już rozwiązane numerycznie, % pozostaje pokazać wyniki plot3(wyniki(:,1), wyniki(:,2), wyniki(:,3)); axis square; grid on; xlabel 'x'; ylabel 'y'; zlabel 'z'; title 'trajektoria ci??arka' end function dqdt = fcn(t, q, m, l0, k, g) % % Funkcja fcn oblicza prawe strony układu równań różniczkowych: % % dq(1)/dt = f1(t,q(1),q(2),...,q(n)) % dq(2)/dt = f2(t,q(1),q(2),...,q(n)) % ... = ... % dq(n)/dt = fn(t,q(1),q(2),...,q(n)) dqdt = zeros(size(q)); x = q(1); y = q(2);
dr Sławomir Marczyński Matlab - ćwiczenia 28/38
z = q(3); vx = q(4); vy = q(5); vz = q(6); r = sqrt(x^2 + y^2 + z^2); delta = r - l0; dqdt(1) = vx; dqdt(2) = vy; dqdt(3) = vz; if delta > 0. dqdt(4) = - (x/r) * k * delta / m; dqdt(5) = - (y/r) * k * delta / m; dqdt(6) = - (z/r) * k * delta / m - g; else dqdt(4) = 0.; dqdt(5) = 0.; dqdt(6) = - g; end end
Ilustracja 34. Trajektoria obliczona programem gumka, widać złożenie drgań w pionie, wahań w poziomie i obrotu.
Podany wyżej skrypt w języku Matlab jest przykładem i dlatego jest napisany z myślą o czytelności,
nawet kosztem prędkości działania i zwięzłości zapisu. Doświadczeni użytkownicy Matlaba zapisaliby
być może funkcję fcn używając długości wektora obliczanej przez norm, warunek zapisaliby
jako wartość logicznego wyrażenia (wynosi ono 1 dla prawdy, 0 dla nieprawdy), być może nie użyliby
dodatkowych zmiennych, a parametry , , i ustalali globalnie… i otrzymali np. coś takiego:
-1
-0.5
0
0.5
-0.8-0.6
-0.4-0.2
00.2
0.40.6
-1.4
-1.3
-1.2
-1.1
-1
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
y
trajektoria ciężarka
x
z
dr Sławomir Marczyński Matlab - ćwiczenia 29/38
function dqdt = fcn(t, q) global m l0 k g dqdt(1:3) = q(4:6); dqdt(4:6) = - q(1:3) * k * (norm(q(1:3) ? l0) / m * (norm(q(1:3)) > l0); dqdt( 6) = dqdt(6) - g; end
Taki styl nie jest wzorem do naśladowania – najważniejsza jest poprawność obliczeń, a trudno ją
sprawdzić, jeżeli program został napisany nieczytelnie i z nadmiernym użyciem rozmaitych,
błyskotliwych, sztuczek.
Zadanie 42. Utwórz plik gumka.m i skopiuj do niego funkcje gumka i dqdt, jakie są na
listingu powyżej (copy-paste). Narysuj tor ruchu ciężarka, jeżeli początkowe
wartości metr, , metrów na sekundę, ,
. Jak zmieni się tor ruchu gdy prędkość metrów na sekundę?
Zadanie 43. Narysuj wykres, na którym będzie widoczna prędkość ciężarka (z poprzedniego
zadania) jako funkcja czasu.
4.4. Automatyczne kończenie obliczeń – strzelanie z wiatrówki Poprzednio obliczenia były kończone po założonym czasie (w symulacji) , w tym przykładzie warunek
stopu będzie inny.
Chcemy oszacować, jaki jest maksymalny realistyczny zasięg pocisku z wiatrówki strzelającej kulkami
Ballistic Ball (BB). Dane są10 kaliber , prędkość wylotowa , masa pocisku
rama. Przypominamy sobie wzór na zasięg rzutu ukośnego, wartość przyspieszenia
ziemskiego i podstawiamy dane:
Wynik, jaki otrzymujemy w ten sposób, realistyczny nie jest. Dlaczego? Zignorowaliśmy opór
powietrza, a dla ruchu pocisków ma on bardzo duże znaczenie.11 Jak go uwzględnić? Można założyć,
że opór powierza wynika z tarcia lepkiego gazu o kulisty pocisk (wzór Stokesa) – do obliczeń siły
potrzebna byłaby lepkość powietrza (około , zależnie od temperatury,
wilgotności itd.). Można też założyć, tak jak tu zrobimy, opór aerodynamiczny wynikający z
konieczności rozpędzenia powierza przed pociskiem do prędkości pocisku (model Newtona),
otrzymując wzór:
10 Jak łatwo obliczyć średnia gęstość materiału z którego wykonano pocisk wynosi ,
kinetyczna energia początkowa
dżula (czyli poniżej określonej w przepisach granicy 17 dżuli).
11 Chyba, że strzelamy np. na Księżycu – wtedy zasięg pocisku wzrośnie jeszcze 6 razy, do ponad .
dr Sławomir Marczyński Matlab - ćwiczenia 30/38
gdzie
jest polem powierzchni przekroju poprzeczego pocisku, jego prędkością w danej
chwili, jest gęstością powietrza, jest współczynnikiem zależnym od kształtu, który
dla kuli wynosi . Oczywiście
. Mamy więc równania:
Dokładamy do nich warunki początkowe:
Kodujemy to w skrypcie Matlaba tworząc w pliku o nazwie zasięg.m funkcję zasięg oraz dwie
subfunkcje fcn i events.12 Funkcja fcn ma znaną już budowę – dostaje wartości zmiennej niezależnej i
zmiennych zależnych jako dane – zwraca wartości pochodnych. Funkcja events jest funkcją
wywoływaną z wnętrza ode45 i kontrolującą „czy już” – zwróćmy uwagę, iż musi ona mieć dokładnie
takie same parametry jak funkcja fcn. Czyli jeżeli stosujemy dodatkowe parametry (powyżej
czwartego) w wywołaniu funkcji ode, to te parametry muszą być jako trzeci i kolejne w funkcjach fcn i
events.13 Uruchamiając ten skrypt widzimy, że tor lotu pocisku nie jest parabolą, a zasięg jest znacznie
mniejszy niż obliczony z pominięciem oporów ruchu.
function zasieg % % Zasięg strzału pociskiem BB z typowej wiatrówki (2012, Sławomir Marczyński) % Warunki początkowe x0 = 1.5; % metry y0 = 0.0; % metry v0 = 120.0; % prędkość początkowa, w metrach na sekundę alfa = 45.0; % kąt w stopniach init = [ x0, y0, v0 * cosd(alfa), v0 * sind(alfa)]; % Parametry sterujące symulacją
12
Ponieważ nazwy subfunkcji nie muszą (a nawet nie mogą) być takie jak nazwa pliku, to przy refaktoryzacji wystarczyłoby zmienić tylko nazwę głównej funkcji (jedna zmiana identyfikatora w jednym miejscu). Wszystkie wywołania subfunkcji pozostałyby bez zmian. Użycie subfunkcji jest wygodniejsze niż pisanie oddzielnych plików fcn.m i events.m.
13 Matlab nie sprawdza poprawności listy parametrów zanim dana funkcja nie zostanie wywołana. Dlatego, przy
braku kompilacji innej niż JIT, niewłaściwe (nawet jeżeli nieużywane) parametry funkcji fcn i events będą powodowały błędy run-time, a nie compile-time.
dr Sławomir Marczyński Matlab - ćwiczenia 31/38
n = 500; % w ilu punktach ma być podane rozwiązanie t_start = 0; % czas startu symulacji, sekundy t_end = 20; % czas stopu symulacji, sekundy t = linspace(t_start, t_end, n); % generowanie wektora czasu opt = odeset('Events',@events); % dodawana jest funkcja kontrolująca % W tym miejscu wywołujemy ode45 aby rozwiązać równania, % pierwszy, niepotrzebny, wektor zwracany przez ode45 odrzucamy tyldą [~, wyniki] = ode45(@fcn, t, init, opt, 0.33E-3, 4.5E-3, 1.2, 9.81); % Równanie jest już rozwiązane numerycznie, prezentujemy wyniki plot(wyniki(:,1),wyniki(:,2)); grid on; xlabel 'x'; ylabel 'y'; title 'trajektoria' end function dqdt = fcn(t, q, m, D, ro, g) cx = 0.45; % współczynnik oporu areodynamicznego dqdt = zeros(size(q)); x = q(1); y = q(2); vx = q(3); vy = q(4); v = sqrt(vx^2 + vy^2); F = (cx/8) * (ro * D * v)^2 * pi; dqdt(1) = vx; dqdt(2) = vy; dqdt(3) = - (vx/v) * (F/m); dqdt(4) = - (vy/v) * (F/m) - g; end function [value,halt,direction] = events(t,q, m, D, ro, g) % Obliczenia będą przerywane (halt = 1) gdy q(2) przejdzie przez zero (value = 0) % od wartości dodatnich do ujemnych (direction = -1). value = q(2); halt = 1 ; direction = -1 ; end
dr Sławomir Marczyński Matlab - ćwiczenia 32/38
Ilustracja 35. Trajektoria pocisku BB wystrzelonego z wiatrówki.
Zadanie 44. Sprawdź jak zmieni się zasięg gdy: masa ciężarka będzie dziesięciokrotnie
większa; prędkość pocisku będzie dziesięciokrotnie większa; gęstość powietrza
będzie o 10% mniejsza.
Dla sprawdzenia jak na zasięg wpływa kąt elewacji, zmodyfikujemy plik zasieg.m zapisując go pod
nazwą zasiegi.m: zamiast jednego kąta elewacji i jednej krzywej przebadamy cały zakres możliwych
kątów elewacji, bo być może największy zasięg jest uzyskiwany dla kąta innego niż . Dodajemy
funkcję zasiegi, zmieniamy bezparametrową funkcję zasieg na subfunkcję zasieg1(alfa), usuwamy
ustawienie wartości alfa w tej subfunkcji. Reszta pozostaje bez zmian, a pętla for i polecenie hold on
wymuszą nałożenie kolejnych wykresów na siebie.
function zasiegi figure; hold on; for alfa = 3:3:90 zasieg1(alfa) end hold off; end function zasieg1(alfa) % % Zasięgi strzałów pociskiem BB z typowej wiatrówki (2012, Sławomir Marczyński) % Warunki początkowe x0 = 1.5; % metry y0 = 0.0; % metry v0 = 120.0; % prędkość początkowa, w metrach na sekundę % alfa % kąt w stopniach, jako parametr funkcji zasieg1
0 20 40 60 80 100 120 140-10
0
10
20
30
40
50
60
70
x
y
trajektoria
dr Sławomir Marczyński Matlab - ćwiczenia 33/38
Ilustracja 36. Trajektorie pocisków z wiatrówki przy różnych kątach elewacji, opór powietrza proporcjonalny do kwadratu prędkości. Jak widać tak obliczony zasięg strzału nie przekracza 140 metrów, czyli jest ponad dziesięciokrotnie mniejszy niż bez oporu powietrza. Naturalnie, wyniki te należałoby sprawdzić doświadczalnie. (Na laptopie z procesorem Intel® Core™ 2 Duo [email protected] obliczenie i narysowanie wszystkich krzywych trwało około pół sekundy.)
Zadanie 45. Narysuj wykres wielu torów ruchu pocisku, ale zmień warunek zakończenia
obliczeń: strzelec stoi przed murem o wysokości 10 metrów odległym o 20
metrów, obliczenia przerywane są gdy pocisk trafi w ścianę lub opadnie poniżej
poziomu gruntu .
4.5. Bardzo krótko o chaosie dynamicznym Istnieje możliwość, iż natrafimy na równania ODE, których rozwiązania będą po prostu chaotyczne: za
każdym razem zupełnie inne, nawet jeżeli tylko nieznacznie (np. o jedną miliardową) zmieniliśmy
dane. Na przykład gdy kąt początkowy zmieni się z na .spodziewalibyśmy się, że
rozwiązania równań są bardzo zbliżone do siebie. Jednak gdy równania są chaotyczne, to dowolnie
mała zmiana warunków początkowych „na wejściu” prowadzi do wykładniczego wzrostu rozbieżności
między rozwiązaniami „na wyjściu” (dokładniej mierzy to wykładnik Łapunowa) i nie istnieje
jakakolwiek metoda pozwalająca wiarygodnie obliczyć rozwiązania.14. Na przykład, taka
jednomiliardowa zmiana kąta może spowodować inny wynik losowania stron boiska przez rzut
monetą (orzeł-reszka). Dlatego trzeba być świadomym ograniczeń metod numerycznych, w tym
funkcji ode z programu Matlab.
Typowym układem chaotycznych równań jest układ Lorenza:
14
Podobnie jak nie można napisać wszystkich cyfr liczby .
0 20 40 60 80 100 120 140-20
0
20
40
60
80
100
120
x
y
trajektoria
dr Sławomir Marczyński Matlab - ćwiczenia 34/38
Skrypty, pozwalające rozwiązywać ten układ równań, dla programów Matlab i Octave, są opisane i
dostępne np. w Wikipedii15. Ale ponieważ układ jest chaotyczny, to wyniki ich działania nie są
„prawdziwymi rozwiązaniami” – wystarczy bowiem dowolnie mała zmiana warunków początkowych
(albo dokładności obliczeń) otrzymamy zupełnie inne wyniki.16
Zadanie 46. Zaprogramuj w Matlabie rozwiązywanie układu Lorentza. (Ilustracja 37.)
Ilustracja 37. Rysunek 1. Próby rozwiązywania układu równań Lorentza dla , , , fragment dla . Wykresy po lewej i prawej stronie zostały zrobione dla warunków początkowych odpowiednio równych oraz . Zmiana o jedną miliardową początkowego spowodowała widoczną zmianę rozwiązań.
Podsumowując: środowiska obliczeniowe Matlab i Octave17 są potężnymi narzędziami pozwalającymi
na rozwiązywanie równań ODE w bardzo łatwy sposób. Nie jest do tego wymagany jakiś szczególny
talent matematyczny, a jedynie umiejętność zapisania tych równań w postaci zrozumiałej dla
komputera.
15
Patrz (23 maja 2012) np. http://en.wikipedia.org/wiki/Lorenz_system. Skrypt dla Octave używa lsode.
16 W sensie wrażenia estetycznego będą one podobne.
17 Przykłady powinny działać w Octave po zainstalowaniu dodatkowych pakietów z funkcjami ode.
-20-15
-10-5
05
1015
20 -30
-20
-10
0
10
20
30
0
5
10
15
20
25
30
35
40
45
50
-20-15
-10-5
05
1015
20 -30
-20
-10
0
10
20
30
0
5
10
15
20
25
30
35
40
45
50
dr Sławomir Marczyński Matlab - ćwiczenia 35/38
5. Wykresy w Matlabie
5.1. Wykresy 2D
Zadanie 47. Krzywą Gaussa nazywamy krzywą przedstawiającą funkcję
Narysuj, używając fplot, na jednym wykresie dziesięć krzywych Gaussa dla
, , gdzie , natomiast . Zmień
poleceniem set oś rzędnych na logarytmiczną.
Ilustracja 38. Wykresy funkcji Gaussa o różnych parametrach.
Zadanie 48. W pliku data1.txt zapisane są w czterech kolumnach liczby: w pierwszej
wartości , w drugiej , w trzeciej niepewności pomiarowe , w czwartej
niepewności pomiarowe . Wczytaj te dane do programu Matlab/Octave
i wykreśl je na wykresie zaznaczają niepewności pomiarowe. Przy każdym
punkcie na wykresie napisz, stosując funkcje num2str i text, wartość , czyli
numer kolejny punktu.
dr Sławomir Marczyński Matlab - ćwiczenia 36/38
Ilustracja 39
Zadanie 49. Parabola przecina hiperbolę w dwóch miejscach.
Zapisz te dwa równania jako funkcje anonimowe o uchwytach f1 i f2, narysuj
poleceniem fplot wykres dla pokazujący te dwie krzywe, znajdź
ich punkty przecięcia za pomocą fzero, zamaluj obszar jaki powstał pomiędzy
nimi na żółto poleceniem fill.
Ilustracja 40
Zadanie 50. Napisz skrypt w Matlabie/Octave, która rysuje i zapisuje jako jeden plik JPEG
wykresy funkcji dla przy pomocy funkcji
plot, loglog, semilogx, semilogy. Użyj subplot do rozmieszczenia wykresów, grid
dr Sławomir Marczyński Matlab - ćwiczenia 37/38
minor dla umieszczenia gęstej podziałki na osiach, poleceń title, xlabel i ylabel
by umieścić napisy, print aby utworzyć plik JPEG.
Zadanie 51. Charakterystyka kierunkowa sensora jest taka, że jego czułość spada o
przy odchylenia od kierunku w którym jest ustawiony. Zakładając równanie
na czułość czujnika ma postać , gdzie narysuj
biegunowy wykres przedstawiający . Narysuj na tym samym wykresie
drugą krzywą, innym kolorem, linią przerywaną, pokazującą jak zmieniłaby się
charakterystyka czujnika, gdyby jego czułość spadała tylko o przy
dziesięciostopniowym odchyleniu.
Ilustracja 41. Jak widać, różnice pomiędzy charakterystykami sensorów są niewielkie. (Ponadto dla kątów bliskich 180° model wykładniczego zaniku czułości może być zbytnim uproszczeniem.)
5.2. Wykresy 3D
Zadanie 52. Narysuj poleceniem ezplot3 linię określoną równaniami , ,
, dla . Narysuj tę linię używając plot3 z utworzonymi
wektorami x, y, z zawierającymi odpowiednie dane. Co stanie się, gdy niektóre
z wartości zastąpi się symbolem NaN?
Zadanie 53. Narysuj wykres funkcji
dla
, poleceniem ezsurf. Wydaj polecenie hold on.
Dorysuj, poleceniem ezsurf, wykres funkcji dla , , ,
. Sprawdź jakie wyniki otrzymasz, używając zamiast ezsurf funkcji
ezmesh i ezcontour.
Zadanie 54. Przy pomocy polecenia meshgrid utwórz dane potrzebne do wykreślenia
powierzchni dla dodatnich . Wykreśl izolinie dla tej
powierzchni poleceniem contour3. Dorysuj wykres tej powierzchni poleceniem
dr Sławomir Marczyński Matlab - ćwiczenia 38/38
surface z opcjami 'EdgeColor' [0.8 0.8 0.8] i 'FaceColor' [0.9 0.9 0.9]. Zaznacz
punkt i punkt na tej powierzchni używając stem3.18 Czy można tak
narysowaną powierzchnię interaktywnie obrócić? Wypróbuj polecenie view. W
jaki sposób z wykresu usunąć część powierzchni, dla której ?
Zadanie 55. Narysuj kulę. Pomaluj ją tak, aby kolor na jej powierzchni odzwierciedlał
wartość . Jakich innych funkcji można użyć,
aby pomalować kulę bez widocznych „szwów”?
5.2. Animacje
Zadanie 56. Użyj poleceń getframe i movie do zapisania i odtworzenia animacji wykresu
funkcji , gdzie jest równe numerowi klatki filmu.
Uwaga: Octave nie ma zaimplementowanej funkcji getframe.
Zadanie 57. Użyj polecenia print do wygenerowania ciągu obrazków w formacie JPEG, o
nazwach klatka001.jpeg, klatka002.jpeg, …, zawierających wykresy funkcji z
poprzedniego zadania. Spróbuj scalić odpowiednim narzędziem te pliki w jeden
plik wideo. Możesz także spróbować przygotować plik GIF z animacją.
18
Jak narysować najkrótszą krzywą, leżącą na tej powierzchni, łączącą te dwa punkty? To bardzo ciekawe pytanie, ale znacznie trudniejsze niż mogłoby się wydawać.