notatki z zajęć

Transkrypt

notatki z zajęć
Metody komputerowe w równaniach różniczkowych - laboratorium
Wprowadzenie do MATLABa
Celem tych ćwiczeń jest zapoznanie się ze środowiskiem MATLAB. Podstawowym zadaniem
MATLABa jest wykonywanie złożonych obliczeń numerycznych i wizualizacja wyników. Może on wykonywać także symboliczne obliczenia algebraiczne (tak jak Mathematica), jednak
należy pamiętać, że przeznaczony jest głównie do obliczeń numerycznych.
Podczas zajęć będziemy korzystać z wersji R2012b pakietu MATLAB, dostępnej na komputerach w laboratorium, jednak każdy może bezpłatnie (i legalnie!) pobrać licencję do najnowszej wersji (R2016b), dostępną na stronie:
https://www.ci.pw.edu.pl/Uslugi/Dystrybucja-oprogramowania/
Oprogramowanie-inzynierskie/MATLAB.
Z punktu widzenia zajęć jedyną zauważalną różnicą może być interfejs graficzny.
1. Podstawowe obliczenia
Głównym oknem w MATLABie jest tzw. okno poleceń (ang. Command Window – Rys. 1).
Proste operacje arytmetyczne wykonuje się za pomocą standardowych poleceń: +, −, *, /, czy
^. Wciśnięcie klawisza Enter wyświetla wynik – wynik nieprzypisany do żadnej zmiennej bę-
dzie zapisany pod postacią domyślnej zmiennej ans. Przypisanie wartości do zmiennej odbywa się za pomocą =. MATLAB zna również podstawowe funkcje, np. trygonometryczne (sin,
cos, tan, cot, sec, czy csc), wykładnicze (exp) czy logarytmiczne (log, log10 czy log2).
W przeciwieństwie do środowiska Mathematica, w MATLABie wbudowane funkcja zawsze
zaczynają się od małej litery, a argumenty funkcji podajemy zawsze w nawiasach okrągłych.
Średnik na końcu wyrażenia zawiesza wyświetlanie wyników na ekranie, MATLAB oczywiście
zapamiętuje zapisaną wartość (można ją wywołać wpisując po prostu nazwę zmiennej).
Warto na początku pracy z programem wpisać w oknie poleceń diary on. Sprawi to, że
wszystkie komendy, które wpiszemy w oknie poleceń zostaną zapisane automatycznie w pliku
tekstowym diary. Aby zakończyć zapisywanie należy użyć polecenia diary off.
Metody komputerowe w równaniach różniczkowych - laboratorium
Rys. 1
MATLAB rozpoznaje litery i oraz j jako jednostkę urojoną
√
−1 . Liczbę zespoloną 2+5i
można zapisać w MATLABie jako 2+5i lub 2+5*i (i odpowiednio z symbolem j). Pierwszy
zapis jest zawsze interpretowany jako liczba zespolona, podczas gdy drugi tylko wówczas, gdy
i nie ma przypisanej żadnej wartości lokalnej (tak samo dla j). Warto zastanowić się nad
następującym problemem – wpisanie poleceń exp(pi/2*i) oraz exp(pi/2i) daje różne
wyniki. Dlaczego?
2. Tablice liczb
Podstawowym "typem danych" w MATLABie są tablice liczb (nazwa MATLAB pochodzi
od MATrix LABoratory), czyli macierze. Można tworzyć jednak macierze o dużo większej
liczbie wymiarów niż 2, co będzie nam się często przydawać w obliczeniach dotyczących
równań różniczkowych.
Macierze wpisuje się wierszami, oddzielając kolejne elementy spacjami lub przecinkami.
Kolejne wiersze oddzielane są średnikami. Elementami macierzy mogą być liczby rzeczywiste,
Metody komputerowe w równaniach różniczkowych - laboratorium
zespolone lub dowolne poprawne wyrażenia MATLABa:
>> A = [1 2 5; 3 9 0];
>> B = [2*x log(x)+sin(y); 5i 3+2i];
Należy pamiętać, że aby polecenie wprowadzenia macierzy B zadziałało, należy najpierw
zdefiniować zmienne x oraz y. Wprowadzanie skalarów nie wymaga użycia nawiasów.
Dostęp do elementu macierzy następuje poprzez wskazanie wiersza i kolumny – wyrażenie
A(i,j) znaczy odwołanie do i-tego wiersza i j-tej kolumny. MATLAB oferuje także możli-
wość dokładniejszego indeksowania – pozwala na definiowanie zakresów wierszy i kolumn:
>> A = [1 2 3; 4 5 6; 7 8 8];
>> A(2:3, 1:3)
% podmacierz − wiersze od 2 do 3 i kolumny od 1 do 3
>> A(2:3, :)
% podmacierz − wiersze od 2 do 3 i wszystkie kolumny
>> A(:, [1,3])
% podmacierz − wszystkie wierze i kolumny 1 oraz 3
Jak widać w powyższym zapisie - po symbolu % następuje komentarz (nie jest wywoływany).
Wymiary macierzy można odczytać za pomocą polecenia size(A).
Inicjowanie macierzy w MATLABie nie jest konieczne, jednak jest zalecane w następującym przypadku – jeśli zamierzamy wygenerować lub przekształcić dużą macierz, to powinniśmy ją zainicjować jako macierz zerową o żądanych wymiarach, poleceniem A=zeros(m,n).
Takie polecenie rezerwuje w pamięci blok dla macierzy i dzięki niemu operacje na macierzach stają się bardziej efektywne. Inne przydatne macierze zdefiniowane automatycznie
w MATLABie to np. eye(m,n), ones(m,n), rand(m,n), diag(v).
Transpozycji macierzy A dokonuje się wpisując A', czyli dopisując apostrof. W przypadku
macierzy o wartościach zespolonych polecenie A' wykonuje hermitowskie sprzężenie macierzy.
Funkcja diag(A) służy nie tylko do generowania macierzy diagonalnej na podstawie wektora,
ale także do wyodrębniania diagonali z macierzy.
Wektory w MATLABie można traktować jako jednowierszowe (lub jednokolumnowe) macierze. Jeśli jednak chcemy utworzyć wektor składający się z liczb z danego zakresu z określonym krokiem, to wystarczy instrukcja:
>> v = 0:10:100; % tworzy v = [0 10 20 ... 100]
>> u = 2:10;
% tworzy u = [2 3 4 ... 10]
Metody komputerowe w równaniach różniczkowych - laboratorium
i nie trzeba używać nawiasów kwadratowych. Warto pamiętać o funkcjach linspace(a,b,n)
oraz logspace(a,b,n). Aby uzyskać pomoc na temat tych funkcji, wpisz help linspace.
Działania arytmetyczne na macierzach wykonywane są za pomocą standardowych poleceń. Za każdym razem sprawdzana jest zgodność wymiarów macierzy. Jest jednak kilka
specyficznych instrukcji:
>> A/B
% dla odpowiednich macierzy daje A*inv(B)
>> A^2
% równoważne A*A dla macierzy kwadratowych
>> A\B
% daje inv(A)*B (szybsze i przydatne w układach równań)
Aby wykonywać operacje element po elemencie, nie trzeba korzystać z pętli, wystarczą działania tablicowe – czyli wykonywane kolejno na wszystkich elementach. Są to standardowe
operacje arytmetyczne, ale poprzedzone kropką, np. A.*B, A./B, A.^B. Polecenie A+10 spowoduje dodanie 10 do każdego elementu macierzy A.
3. Grafika
MATLAB oferuje zestaw efektywnych narzędzi do wizualizacji. Najprostszym i prawdopodobnie najbardziej użytecznym poleceniem generowania prostych wykresów dwuwymiarowych
jest:
>> plot(wartosci_x, wartosci_y, 'opcje_stylu')
gdzie wartosci_x oraz wartosci_y są wektorami zawierającymi współrzędne x i y, a argument 'opcje_stylu' jest opcjonalny, definiujący kolor, styl linii (np. ciągła, przerywana,
itd.) oraz styl znaczników punktów danych (np. o, +, *, idt.). Wszystkie trzy elementy można
zdefiniować razem stosując formę 'kolor styl_linii styl_znacznika', np. 'r−−*' da
czerwoną linię przerywaną z punktami danych w postaci gwiazdek.
Należy pamiętać o tym, że oba wektory, x oraz y, muszą mieć tę samą długość. Funkcja
plot działa także z pojedynczym wektorem jako argumentem i w takim wypadku wartości
elementów wektora są kreślone zgodnie z indeksami w wierszu lub kolumnie.
Wykresy można opisywać za pomocą poleceń xlabel, ylabel i title. Pobierają one
argumenty w postaci łańcuchów znakowych i opisują osie oraz tytuł całego wykresu. Legendę
wykresu można utworzyć za pomocą polecenia legend w formie:
Metody komputerowe w równaniach różniczkowych - laboratorium
>> legend(opis1, opis2, ...)
gdzie opis1 i opis2 to etykiety kolejnych narysowanych wykresów.
Po wygenerowaniu wykresu można zmienić zakres wartości na obu osiach, korzystając
z polecenia axis. Wpisanie axis([xmin xmax ymin ymax]) zmienia bieżący zakres wartości na obu osiach do xmin i xmax na osi x oraz ymin i ymax na osi y. Aby polecenie
axis zadziałało, należy go użyć po poleceniu plot. Aby na jednym rysunku umieścić kilka
wykresów, można użyć polecenia plot w innej formie:
>> plot(x1, y1, 'opcje1', x2, y2, 'opcje2', ...)
lub przy użyciu polecenia hold, na przykład:
>> plot(x1, y1)
>> hold on
>> plot(x2, y2)
>> plot(x3, y3)
>> hold off
Chcąc sporządzić kilka wykresów i umieścić je jeden obok drugiego (nie nakładając ich),
używamy polecenia subplot. Polecenie to wymaga podania trzech argumentów w postaci
liczb całkowitych:
>> subplot(m,n,p)
i dzieli okno graficzne na m×n podokien i umieszcza w nich wykresy wygenerowane przez
następujące dalej polecenia. Podokna są liczone wierszami, a parametr p określa, w którym
oknie ma się znaleźć wykres.
4. Skrypty i funkcje
Programy MATLABa zapisuje się w M-plikach (ich nazwom towarzyszy rozszerzenie .m).
Każdy M-plik można tworzyć za pomocą dowolnego edytora tekstowego, ale MATLAB ma
wbudowany swój własny edytor. Należy jednak pamiętać, który katalog jest obecnie otwarty
– wszystkie pliki są domyślnie zapisywane w katalogu bieżącym. Bieżący katalog jest wyświetlany w pasku na górze ekranu (można tam też go zmienić).
Metody komputerowe w równaniach różniczkowych - laboratorium
M-pliki mogą być zapisywane w różnych katalogach, nie tylko w bieżącym. W takim
przypadku MATLAB traci możliwość uzyskania dostępu do nich. Należy wówczas zmienić
katalog bieżący na ten, w którym pliki zostały zapisane albo dołączyć go do ścieżki MATLABa. Można to zrobić w oknie drzewka folderów.
Plik skryptu jest M-plikiem zawierającym zestaw poleceń dla MATLABa. Uruchamia
się go poprzez wpisanie jego nazwy (bez rozszerzenia .m) w wierszu poleceń lub poprzez
wywołanie za pomocą odpowiedniego przycisku (klawisz F5). Plik skryptu może zawierać
dowolną liczbę poleceń, w tym także wywołujących funkcja wbudowane oraz napisane przez
użytkownika. Uwaga – nigdy nie należy nadawać skryptowi takiej samej nazwy, jaką nosi
jedna z obliczanych zmiennych. Nazwy skryptów muszą zaczynać się literą, a pozostałe znaki
muszą być cyframi lub znakami podkreślenia.
Skrypty można tworzyć i testować partiami, bez konieczności uruchamiania całości, dzieląc je na komórki, które można uruchamiać pojedynczo. Komórki oddziela się znakiem %%.
Warto pamiętać także, że MATLAB stosuje własną składnię instrukcji warunkowych,
takich jak pętle for i while, a także if−elseif−else. Pętlę for można wywołać w formie
for m=1:100
num = 1/(m+1)
end
i powyższy kod 100 razy wykona podaną instrukcję, za każdym razem używając licznika m
większego o 1. Pętle for można zagnieżdżać, a każda musi jednak kończyć się instrukcją end.
Metody komputerowe w równaniach różniczkowych - laboratorium
Plik funkcji także jest M-plikiem, podobnie jak plik skryptu, z tą różnicą, że zmienne
funkcji mają charakter lokalny. Plik funkcji rozpoczyna się wierszem definicji, w którym
zawarta jest lista danych wejściowych i wyników:
function [zmienne_wyjsciowe] = nazwa_funkcji(zmienne_wejsciowe)
gdzie nazwa_funkcji musi być zgodna z nazwą pliku (bez rozszerzenia .m). Wszystkie wiersze komentarzy następujące bezpośrednio za wierszem definicji wyświetlane są po wpisaniu
polecenia help dla danej funkcji. Aby wywołać funkcje zapisaną w M-pliku, wystarczy wpisać
jej nazwę z odpowiednimi argumentami.
Jeśli funkcje nie są zbyt skomplikowane, to można zastosować szybszy sposób programowania, np. za pomocą tzw. funkcji anonimowych. Są one tworzone i przechowywane poprzez
uchwyty funkcji (czyli zmienne będące identyfikatorem funkcji).
Funkcje anonimowe tworzy się poleceniem
nazwa_funkcji = @(lista_wejsciowa) wyrazenie_matematyczne
gdzie nazwa_funkcji jest uchwytem funkcji. Lista wejściowa może zawierać pojedyncza
zmienną lub wiele zmiennych oddzielonych przecinkami, np.
f = @(x,y) x^2 + y^2;
Funkcje anonimowe są wygodne podczas wykonywania obliczeń z poziomu wiersza poleceń,
jednak w przypadku funkcji bardziej rozbudowanych, które wymagają wykonania pośrednich
obliczeń, należy stosować pliki funkcji. Należy też pamiętać, że MATLAB służy (w podstawowej formie) tylko do obliczeń numerycznych, nie da się więc automatycznie policzyć np.
pochodnej funkcji zdefiniowanej jak powyżej.
5. Publikowanie raportów
MATLAB posiada także wbudowany publikator, który pozwala na generowanie atrakcyjnych w formie raportów (w formacie HTML, XML, LATEX, MS Word, itd.). Po pierwsze,
należy utworzyć plik skryptu, w którym zostaną zawarte wszystkie polecenia obliczeń oraz
generowania wyników. Należy pamiętać o dodaniu komentarzy objaśniających znaczenie poszczególnych poleceń.
Metody komputerowe w równaniach różniczkowych - laboratorium
Publikowanie raportów bazuje na formatowaniu skryptu jako skryptu komórkowego. Tekst
zawarty w wierszu rozpoczynającym się znakiem %% jest traktowany przez publikator jako nagłówek sekcji. Wszystkie takie nagłówki w skrypcie są przekształcane w hiperłącza tworzące
spis treści raportu. Raport powinien mieć tytuł ogólny wygenerowany z komórki zawierającej wyłącznie treść tytułową i żadnych poleceń, a znajdującej się na samym początki pliku
skryptu.
Każde równanie, bądź wyrażenie opisujące wykonywane obliczenia można sformatować,
korzystając z osadzonego modułu LATEX. Wyrażenie matematyczne musi zostać zamknięte
między podwójnymi znakami $ (tzn. $$ ... $$), a rozpoczyna się symbolem %. Równanie musi
być też poprzedzone znakiem komórki %%, np.
%%
% $$r(\theta) = e^{−\frac{\theta}{10}}, \quad 0\le\theta\le 10\pi$
Powyższy kod wygeneruje napis
θ
r(θ) = e− 10 ,
0 ¬ θ ¬ 10π.
Możliwe jest też formatowanie tekstu (np. pogrubianie, stosowanie tekstu o stałej szerokości znaków), jak również tworzenie list wypunktowanych. Znaczniki te można wstawiać,
wybierając odpowiednie polecenia ze wstążki w górnej części ekranu. Na przykład tekst ulega pogrubieniu, jeśli przed nim i za nim umieścimy znak *, a tekst o stałej szerokości jest
tworzony pomiędzy dwiema pionowymi kreskami |.
Żeby opublikować raport, należy wybrać polecenie Publish znajdujące się na wstążce.
MATLAB powinien utworzyć katalog o nazwie html, o ile jeszcze taki nie istnieje, a w nim
dokument .html, wraz z paroma plikami pomocniczymi. Gotowy dokument zostanie wyświetlony. Można również zmienić opcje generowanego raportu (np. wygenerować plik .tex lub
.doc), należy jednak uważać na polskie znaki – bardzo często ich nie rozpoznaje.
6. Równania różniczkowe zwyczajne w MATLABie
MATLAB wyposażony jest, podobnie jak Mathematica, w zestaw funkcji do rozwiązywania (numerycznego!) równań różniczkowych zwyczajnych (ang. Ordinary Differential Equ-
Metody komputerowe w równaniach różniczkowych - laboratorium
ations – ODE). Podstawowymi funkcjami są ode23 i ode45, które są implementacjami metod
Rungego-Kutty, odpowiednio, rzędu drugiego/trzeciego oraz czwartego/piątego.
Rozwiązywanie większości równań różniczkowych zwyczajnych przy użyciu tych funkcji
to (w najprostszej postaci) proces czteroetapowy:
(a) zapisanie równania różniczkowego w postaci układu równań zwyczajnych pierwszego
rzędu – potrzebne jest równanie w formie wektorowej, tzn. x0 = f (t, x), gdzie x =
[x1 , . . . , xn ]T jest w postaci wektorowa kolumnowego, w najprostszym przypadku mamy
np.
x0 (t) = x + t,
x(0) = 0;
(b) napisanie funkcji obliczającej pochodne (czyli "prawą stronę") - należy napisać funkcję,
która obliczy f z danymi wejściowymi (t, x) i zwróci wartość jako wektor kolumnowy,
funkcję należy umieścić w M-pliku, np.
function xdot = simpleode(t,x)
xdot = x + t;
i plik zapisujemy pod nazwą simpleode.m;
(c) użycie wbudowanej funkcji, by rozwiązać równanie, np.
>> tspan = [0, 2];
% przedział czasowy
>> x0 = 0;
% warunek poczatkowy
˛
>> [t, x] = ode23('simpleode',tspan,x0);
(d) pobranie żądanych zmiennych z wyniku i interpretacja rezultatów – dla układu n równań macierz wynikowa zawiera n kolumn, każda odpowiadające danej zmiennej, dla
powyższego przykładu mamy
>> plot(t,x)
>> xlabel('t')
>> ylabel('y')
Pakiet ODE w MATLABie zawiera szereg innych algorytmów oraz funkcji narzędziowych.
Można się o nich dowiedzieć na przykład z dokumentacji.
Metody komputerowe w równaniach różniczkowych - laboratorium
Źródła?
Ten (niezbyt) krótki wstęp zaledwie sygnalizuje możliwości, jakie daje nam praca w środowisku MATLAB. Dołączone do niego M-pliki pokazują przykłady pokazywanych tutaj funkcji.
Prawdziwą moc tego narzędzia zobaczymy tak naprawdę dopiero rozwiązując konkretne problemy matematyczne, co zmusi nas do zagłębienia się w lekturę dokumentacji i samodzielnego
odkrywania kolejnych funkcji.
Treść tego wstępu powstała na podstawie książki
Rudra Pratap, Matlab 7 dla naukowców i inżynierów, Wydawnictwo Naukowe PWN, 2009.
Nie roszczę sobie żadnych praw do zawartości tego dokumentu.

Podobne dokumenty