Matlab: krótki wstęp Scilab: krótki wstęp wer. 1.1

Transkrypt

Matlab: krótki wstęp Scilab: krótki wstęp wer. 1.1
Matlab: krótki wstęp
Scilab: krótki wstęp
wer. 1.1
Wojciech Myszka
12 stycznia 2008
Spis treści
1 Uruchomienie programu
2
2 Okno programu w trybie graficznym
4
3 Matlab (Scilab) jako kalkulator
5
4 Operacje matematyczne
8
5 Specjalne funkcje wbudowane
8
6 Macierze
9
7 Sposób wyświetlania wyników
13
8 Tablice
14
9 Dane i pliki
16
10 Wykresy
17
11 Symulacja liniowych obiektów dynamicznych — rozwiązywanie
równań różniczkowych
21
A Słów kilka o „lewym dzieleniu” czyli rozwiązywanie równań liniowych
40
1
B Aproksymacja średniokwadratowa
42
C Kilka przydatnych funkcji
43
D Ciut o programowaniu
44
Wstęp
Ten tekst jest podstawowa dokumentacją do programów Matlab (http://www.
mathworks.com/) oraz Scilab (http://www.scilab.org/). Programy nie są identyczne, ale na potrzeby początkujących — magą być traktowane zamiennie.
Scilab to darmowy program, rozpowszechniany na licencji, która pozwala na
dosyć szerokie jego wykorzystywanie (również do celów komercyjnych).
System Matlab (http://www.mathworks.com/ to zaawansowane narzędzie do
rozwiązywania problemów technicznych. Scilab w wielkim stopniu naśladuje Matlaba, a w zakresie objętym tymi zajęciami — może być uznany za jego zastępnik. . .
Nazwa Matlab pochodzi od słów matrix laboratory, które dobrze oddają to w
czym Matlab jest najlepszy: szeroko rozumiana algebra liniowa. . .
Niniejsze opracowanie nie powinno być w żadnym przypadku traktowane jako
podstawowe źródło informacji. Jego celem jest szybkie przedstawienie podstawowych możliwości Matlaba jako zaawansowanego kalkulatora i narzędzia do obliczeń
numerycznych i symulacyjnych.
Wszystkim zainteresowanym pakietem polecam literaturę zamieszczoną na końcu oraz dokumentację pakietu.
1
Uruchomienie programu
Sposób uruchamiania programu zależy od systemu operacyjnego. W Windows najwygodniej znaleźć odpowiednią ikonę i w nią kliknąć. Podobnie można robić w
systemach Uniksowych. Tam można również w trybie poleceń wydać polecenie:
tester@piwo2:~$ matlab
< M A T L A B >
Copyright 1984-2005 The MathWorks, Inc.
Version 7.0.4.352 (R14) Service Pack 2
January 29, 2005
2
To get started, type one of these: helpwin, helpdesk, or demo.
For product information, visit www.mathworks.com.
>>
Scilab uruchamiany jest w bardzo podobny sposób (albo należy znaleźć odpowiednią ikonkę, albo wydać odpowiednie polecenie.
------------------------------------------scilab-3.1.1
Copyright (c) 1989-2005
Consortium Scilab (INRIA, ENPC)
-------------------------------------------
Startup execution:
loading initial environment
-->
Aby zakończyć pracę z systemem albo zamykamy okno korzystając z mechanizmów menedżera okien, albo wydajemy polecenie:
>> exit
tester@piwo2:~$
3
2
Okno programu w trybie graficznym
Matlab:
Scilab:
4
3
Matlab (Scilab) jako kalkulator
Najbardziej prymitywne zastosowanie programu.
>> 2+2
ans =
4
>> 3/11
ans =
0.2727
>> 5^3
ans =
125
>> log(10)
ans =
5
2.3026
>> pi
ans =
3.1416
>> sin(2*pi)
ans =
-2.4493e-16
>> sin(pi/2)
ans =
1
-->sin(30)
ans =
- 0.9880316
-->sin(%pi/6)
ans =
0.5
Uwaga! Scilab nie rozumie (nie zna) zmiennej pi. Zamiast niej rozpoznaje %pi.
Polecenia wpisujemy po znaku „zachęty” >> (-->). Korzystać możemy z praktycznie wszystkich funkcji matematycznych.
Bardziej „zaawansowane” wykorzystanie Matlaba (Scilaba) pozwala na używanie „pamięci” czyli zmiennych:
>> a=%pi
a =
3.1416
>> b=%pi/2;
Zwracam uwagę na znak średnika umieszczony na końcu wyrażenia: gdy jego
nie ma wynik działania wypisywany jest na terminalu. Po jego podaniu — Matlab (Scilab) jest „cichszy”. Nie ma to zbyt wielkiego zastosowania w przypadku
wykonywania bezpośrednich obliczeń, gdyż cóż nam z czegoś takiego:
>> 7/8;
ale zawsze możemy się ratować czymś takim:
>> 3/11;
>> ans
ans =
0.2727
>>
6
zmienna ans zawiera zawsze wynik ostatniego wyliczenia wykonywanego w trybie
bezpośrednim.
W przypadku zadania do wykonania dziwnych obliczeń Matlab zachowuje się
w sposób następujący:
>> 3/0
Warning: Divide by zero. (Type "warning off MATLAB:divideByZero" to
suppress this warning.)
ans =
Inf
>> ans+1
ans =
Inf
A scilab tak:
-->3/0
!--error 27
division by zero...
No tak. . . „Pamiętaj !@#$^&* nie dziel przez zero” jak głosi stare porzekadło
— więc napisał, że jest błąd. Ale wynik, w zasadzie, jest dobry: Inf, czyli nieskończoność. Co więcej można na tym wykonywać dalsze działania! ∞ + 1 = ∞! Ale
takie coś nie przechodzi:1
>> ans -3/0
Warning: Divide by zero. (Type "warning off MATLAB:divideByZero" to
suppress this warning.)
ans =
NaN
NaN to po naszemu Not a Number — „to nie jest liczba”. Zatem odejmowanie dwu
nieskończoności nie daje zera. . . 2
Uwaga! W przypadku Scilaba — takich dziwnych obliczeń wykonać nie można.
Ale Scilab poprawnie rozpoznaje zmienne o nazwach %inf (nieskończoność), %nan
(Not a Number ) czy %eps (najmniejsza rozpoznawalna liczba).
1
2
Dalszy ciąg powyższego przykładu.
I chyba dobrze!
7
4
Operacje matematyczne
+ suma
− różnica
∗ iloczyn
/ iloraz
\ „lewe” dzielenie:3
>> 3/2
ans =
1.5000
>> 3\2
ans =
0.6667
a\b = b/a
ˆ potęgowanie
5
Specjalne funkcje wbudowane
Matlab dostarcza kilku specjalnych funkcji. Są to:
%pi wartość liczby π
√
%i jednostka zespolona ( −1)
j podobnie jak i Tylko Matlab!
%eps względna dokładność obliczeń zmiennoprzecinkowych (ε = 2−52
realmin najmniejsza (dodatnia) liczba zmiennoprzecinkowa (2−1022 ) Tylko Matlab!
realmax największa liczba zmiennoprzecinkowa ((2 − ε)21023 ) Tylko Matlab!
%inf nieskończoność
3
left division
8
%nan Not a number
Powyższe nazwy nie są zarezerwowane! Można zatem je podmienić wpisując, na
przykład:
>> eps=1.e-4
eps =
1.0000e-04
Aby „odzyskać” pierwotne znaczenie funkcji należy wydać polecenie clear:
>> clear eps
>> eps
ans =
2.2204e-16
6
Macierze
Aby wprowadzić stałą można napisać tak:
>> [1 2 3; 4 5 6; 7 8 9]
ans =
1
2
3
4
5
6
7
8
9
Znak ; (średnik) oddziela kolejne wiersze.
Cechą charakterystyczną Matlaba jest to, że tablic nie trzeba deklarować, nie
trzeba też podawać rozmiaru, który zajmują. Zmienna może łatwo zmieniać swój
charakter:
>> a=2
a =
2
>> a=[1 2; 0 1]
a =
1
2
0
1
Wszystkie działania arytmetyczne uogólniane są tak, by również dotyczyły tablic:
9
+ suma; jeżeli składniki są tablicami — muszą mieć jednakowy rozmiar; można
dodać skalar do tablicy dowolnego rozmiaru:
>> [1 2; 0 1]+3
ans =
4
5
3
4
− różnica; uwagi jak wyżej
∗ iloczyn macierzy; obowiązują zasady obowiązujące w rachunku macierzowym;
jeżeli chcemy wykonać działanie A∗B to liczba kolumn A musi być taka sama
jak liczba wierszy B; macierz o dowolnych wymiarach może być mnożona
przez skalar.
.∗ iloczyn „tablicowy” (aby wykonać C = A. ∗ B obie macierze po prawej stronie
znaku równości muszą mieć jednakowe wymiary (chyba, że jedna ze zmiennych jest skalarem); Wynikiem jest macierz, której elementy C(i,j)=A(i,j)*B(i,j)
>> [1 2; 3 4].*[9 9; 9 9]
ans =
9
18
27
36
\ „lewy” iloraz macierzy: jeżeli A i B są macierzami kwadratowymi to A\B =
A−1 ∗ B. Gdy A jest macierzą o wymiarach n × n, a B jest wektorem kolumnowym o wymiarze n wówczas X = B\A jest rozwiązaniem układu równań
liniowych A ∗ X = B.
W przypadku gdy A ma wymiary m × n gdzie m 6= n a B jest wektorem
kolumnowym o m składowych (lub macierzą o kilku takich kolumnach) to
X = B\A jest uogólnionym rozwiązaniem (w sensie najmniejszych kwadratów) układu równań A ∗ X = B
.\ „lewy” iloraz tablicowy: jeżeli macierze A i B mają jednakowe wymiary to
wynikiem działania A.\B jest macierz o elementach B(i, j)/A(i, j). (A albo
B może być skalarem!)
/ iloraz macierzy A/B = A ∗ B −1 . Można również pokazać, że B/A = (A0 \B 0 )0
(gdzie 0 to symbol transpozycji — patrz dalej).
10
./
ˆ
.ˆ
0
.0
11
Operacja macierzowa
1
2
x
3
0
1 2 3
x
5
7
x+y
9
3
4
x+2
5
x∗y
x0 ∗ y
x∗y
0
4
8
12
x∗2
x\y
2\x
x/y
x/2
xˆy
xˆ2
2ˆx
(x + i ∗ y)0
(x + i ∗ y).0
0
0
0
Operacja tablicowa
4
5
y
6
0
4 5 6
y
-3
-3
x−y
-3
-3
-3
x−2
-3
4
10
Error x. ∗ y
18
0
32 x . ∗ y
Error
5 6
10 12 x. ∗ y 0
Error
15 18
2
2
4 x. ∗ 2
4
6
6
4
5/2
16/7 x.\y
2
1/2
2
1
1
2./x
3/2
2/3
0 1/6
1/4
0 1/3 x./y
2/5
0 1/2
1/2
1/2
1/2
1
x./2 1
3/2
3/2
1
32
Error x.ˆy
729
1
4
Error x.ˆ2
9
2
4
Error 2.ˆx
8
12
1 − 4i 2 − 5i 3 − 6i
1 + 4i 2 + 5i 3 + 6i
7
Sposób wyświetlania wyników
Tylko Matlab! To w jaki sposób Matlab wyświetla wyniki można ustalić wydając polecenie format. Należy go użyć podając dodatkowy parametr definiujący
ostateczny efekt:
compact wyłącza drukowanie pustych linii
short krótki format wydruków:
>> x = [4/3 1.2345e-6]
x =
1.3333
0.0000
short e krótki format (5 cyfr znaczących; w postaci wykładniczej): 1.3333e+00
1.2345e-06
short g krótki format (5 cyfr znaczących; w postaci wykładniczej tylko wtedy gdy
taka potrzeba): 1.3333 1.2345e-06
long format długi — pełna precyzja: 1.33333333333333 0.00000123450000
long e format długi wykładniczy: 1.333333333333333e+00 1.234500000000000e-06
long g format długi, postać wykładnicza tylko wtedy gdy potrzebna: 1.33333333333333
1.2345e-06
bank z dokładnością „do groszy” (dwa miejsca po przecinku): 1.33 0.00
rat format wymierny: 4/3 1/810045; a π wygląda tak:
>> pi
ans =
355/113
hex szesnastkowy: 3ff5555555555555 3eb4b6231abfd271
13
8
Tablice
Jak już wspomniano, tablice wpisuje się tak:
-->a=[1 2 3 4; 5 6 7 8; 9 10 11 12]
a =
!
1.
2.
3.
4. !
!
5.
6.
7.
8. !
!
9.
10.
11.
12. !
W ten sposób powstała macierz o nazwie a i trzech wierszach (wiersze oddzielane
są za pomocą średników) i czterech kolumnach (elementy wiersza oddzielane są
przecinkami).
Do elementów macierzy odwołujemy się w sposób „konwencjonalny”: a(n,m).
W przypadku Scilaba — do macierzy dwuwymiarowej można się dobierać tak jak
do jednowymiarowej (pamiętając, że dane pamiętane są kolumnami):
-->a(1)
ans =
1.
-->a(2)
ans =
5.
-->a(4)
ans =
2.
-->a(2,2)
ans =
6.
Matlab (i Scilab) mają ciekawą właściwość pozwalającą na łatwe wybieranie
kolumn (wierszy) macierzy:
--> -->a(1,:)
ans =
!
1.
2.
-->a(:,1)
ans =
!
1. !
!
5. !
!
9. !
3.
4. !
Można, z wydobytych dwu kolumn, stworzyć nową macierz:
14
-->[a(:,1) a(:,3)]
ans =
!
1.
3. !
!
5.
7. !
!
9.
11. !
Analogicznie można stworzyć nową macierz z dwu lub więcej wierszy.
Operator : (dwukropek) służy do generowania liczb z podanego zakresu:
-->1:5
ans =
!
1.
2.
3.
4.
5. !
-->[1:5]*[1:5]’
ans =
55.
-->[1:5]’*[1:5]
ans =
!
1.
2.
!
2.
4.
!
3.
6.
!
4.
8.
!
5.
10.
3.
6.
9.
12.
15.
4.
8.
12.
16.
20.
5.
10.
15.
20.
25.
!
!
!
!
!
W wersji „rozbudowanej” polecenie ma trzy parametry:
-->1:2:10
ans =
!
1.
3.
5.
7.
9. !
Pierwszy oznacza początek zakresu, drugi krok, a trzeci — koniec. Parametry
nie muszą być liczbami całkowitymi:
-->1:%pi/5:2*%pi
ans =
column 1 to 5
!
1.
1.6283185
2.2566371
2.8849556
3.5132741 !
column 6 to 9
!
4.1415927
4.7699112
5.3982297
6.0265482 !
15
9
Dane i pliki
Podstawowe polecenia służące do zapisywania (i wczytywania) wartości zmiennych to save i load. Polecenie save zapisuje zawartość wszystkich zdefiniowanych
zmiennych w pliku:
save(filename)
w przypadku, gdy chcemy zachować zawartość tylko niektórych zmiennych — ich
listę podajemy po nazwie pliku:
save(filename, x1, x2,..., xn)
Składnia polecenia load jest analogiczna:
load(filename)
load(filename, x1, x2,..., xn)
Polecenia load i save mogą służyć do przechowywania danych między sesjami.
Tworzone przez polecenie save pliki są binarne!
Polecenia write służy do zapisu danych w postaci „czytelnej” dla człowieka:
-->b=[1:5]’*[1:5]
b =
!
1.
2.
3.
!
2.
4.
6.
!
3.
6.
9.
!
4.
8.
12.
!
5.
10.
15.
-->write("dane1.txt",b)
4.
8.
12.
16.
20.
5.
10.
15.
20.
25.
!
!
!
!
!
zawartość utworzonego pliku dane.txt jest następująca:
1.
2.
3.
4.
5.
2.
4.
6.
8.
10.
3. 4. 5.
6. 8. 10.
9. 12. 15.
12. 16. 20.
15. 20. 25.
Polecenie read ma nieco więcej parametrów:
-->c=read("dane1.txt",2,3)
c =
!
!
1.
2.
2.
4.
3. !
6. !
16
Pierwszy z nich oznacza liczbę wierszy pliku, którą chcemy przeczytać, a drugi —
liczbę kolumn. Gdy zamiast liczby wierszy podamy −1 — przeczytany zostanie
cały plik.
-->c=read("dane1.txt",3,5)
c =
!
1.
2.
3.
4.
!
2.
4.
6.
8.
!
3.
6.
9.
12.
-->c=read("dane1.txt",-1,5)
c =
!
1.
2.
3.
4.
!
2.
4.
6.
8.
!
3.
6.
9.
12.
!
4.
8.
12.
16.
!
5.
10.
15.
20.
5. !
10. !
15. !
5.
10.
15.
20.
25.
!
!
!
!
!
Gdy przeczytać chcemy zbyt wielką liczbę danych — występuje błąd:
-->c=read("dane1.txt",3,6)
!--error
end of file at line
2
62
Pod adresem http://kufel.immt.pwr.wroc.pl/~myszka/matlab/sierpien.
txt znajduje się przykładowy plik z danymi. Należy go wczytać do Scilaba...
10
Wykresy
Program Scilab ma kilka poleceń służących do rysowania wykresów. Są to:
• plot2d — 2D plot
• plot2d1 — 2D plot (logarithmic axes) (obsolete)
• plot2d2 — 2D plot (step function)
• plot2d3 — 2D plot (vertical bars)
• plot2d4 — 2D plot (arrows style)
Wywołanie każdego z tych poleceń bez parametrów — uruchamia małe „demo”:
17
-->plot
Demo of plot
t=0:%pi/20:2*%pi;
subplot(211)
plot(t,sin(t),’ro-.’,t,cos(t),’cya+’,t,abs(sin(t)),’--mo’)
subplot(212)
plot([t ;t],[sin(t) ;cos(t)],’xdat’,[1:2])
-->plot2d
Demo of plot2d
x=(0:0.1:2*%pi)’;plot2d(x,[sin(x),sin(2*x),sin(3*x)],style=[-1,-2,3],rect=[0,-2,2*%
18
Uwaga! kolejne polecenia plot „rysują” wszystko w jednym okienku. Dodatkowe narzędzia pozwalają zarządzać okienkami graficznymi. Są to:
scf(n) tworzy okno graficzne o numerze n; wywołanie w postaci: f4=scf(4) pozwala „zapamiętać” parametry okna graficznego w celu późniejszego odwołania się do nich.
clf() kasuje zawartość aktualnego okna graficznego
f4=scf(4);
f0=scf(0);
plot2d()
scf(f4);
plot3d()
//tworzy okno o identyfikatorze id==4 i staje się ono aktywne
//tworzy okno o identyfikatorze id==0 i staje się ono aktywne
// tworzy obrazek w oknie o id=0
// okno o identyfikatorze id=4 staje sie aktywne
// tworzy obrazek w oknie o id=4
Uwaga: Dwa znaki dzielenia // oznaczają początek komentarza.
Parametry polecenia plot mogą być następujące:
plot(y,<LineSpec>,<GlobalProperty>)
19
<LineSpec> — to stała lub zmienna tekstowa zawierająca informacje o rodzaju
linii użytej do rysowania wykresu (można użyć znaków -, --, -., :), kolorze (r
g b c m y k w) oraz rodzaju markera (znaczka) stawianego w miejscu punktów
(o * . x s lub square d lub diamond ^ v < > pentagram; w przypadku braku
parametru — przyjęte będzie none czyli brak znacznika.
<GlobalProperty> to nieobowiązkowy parametr pozwalający zdefiniować domyślne ustawienia dla kolejnych wykresów.
W powyższym przypadku rysowany jest wykres wartości umieszczonych w tablicy y w funkcji numeru.
plot(x ,y,<LineSpec>,<GlobalProperty>)
W tym przypadku rysowany jest wykres danych z tablicy y w funkcji x.
W przypadku konieczności wyrysowaniu kilku wykresów jednym poleceniem
plot — kolejne pary (trójki lub czwórki parametrów) można powtarzać:
plot(x,y,x1,y1,x2,y2)
Do rysowania wykresów trójwymiarowych służy polecenie plot3d:
• plot3d — 3D plot of a surface
• plot3d1 — 3D gray or color level plot of a surface
• plot3d2 — plot surface defined by rectangular facets
• plot3d3 — mesh plot surface defined by rectangular facets
-->plot3d
Demo of plot3d
t=-%pi:0.3:%pi;plot3d(t,t,sin(t)’*cos(t),35,45,’X@Y@Z’,[2,2,4]);
-->plot3d1
Demo of plot3d1
t=-%pi:0.3:%pi;plot3d1(t,t,sin(t)’*cos(t),35,45,’X@Y@Z’,[2,2,4]);
20
W wyniku powyższych poleceń otrzymamy następujące dwa wykresy:
Parametry polecenia plot3d (w wersji podstawowej!) to, kolejno:
plot3d(x ,y,z ,[theta,alpha,leg,flag,ebox ])
• x, y — tablice zawierające współrzędne punktów x, y
• z — tablica dwuwymiarowa zawierająca wartości funkcji f (x, y)
• theta, alpha współrzędne (w układzie sferycznym!) punktu obserwacyjnego.
• leg — ciąg znaków definiujący opis osi x, y, z; opisy rozdzielone są znakiem
@ — ’X@Y@Z’
• ebox — wektor o 6 składowych zawierający informacje o minimach i maksimach po x, y, z
• flag — wektor o trzech składowych zawierający informacje na temat sposobu
rysowania wykresu...
11
Symulacja liniowych obiektów dynamicznych
— rozwiązywanie równań różniczkowych
Część Scilaba służąca do rozwiązywania tych zagadnień bardzo mocno (co do szczegółów, wyglądu innterfejsu) rózni się od Simulinka dostępnego w Matlabie. Natomiast idea — jest dokładnie taka sama.
Ruch wahadła można opisać następującym równaniem różniczkowycm:
LΘ00 + pΘ0 + gΘ = 0
(1)
gdzie: Θ — kąt wychylenia wahadła, L — długość wahadła, g — stała grawitacyjna
a p — współczynnik tłumienia.
21
Układ ten przekształcimy do postaci ciut wygodniejszej do dalszych rozważań:
g
p
Θ00 = − Θ0 − Θ
L
L
(2)
Metoda rozwiązywania tego typu równań różniczkowych wywodzi się z technologii (i czasów) maszyn (komputerów) analogowych. Ponieważ trudno znaleźć
układ elektroniczny, który służył będzie do różniczkowania (nawet numerycznie ta
operacja jest bardzo trudna!), a stosunkowo łatwo daje się całkować zastosowano
następujący trik:
R
x
-
R
0
x
-
Θ
Θ
Co oznacza, mniej więcej tyle, że jeżeli na bloczek całkujący
wyślemy „sygnał”
R
x to na wyjściu zostanie on „scałkowany” i dostaniemy x. Jeżeli wrzucimy pochodną z Θ (czyli Θ0 ) to na wyjściu, po scałkowaniu — będzie samo Θ. . .
Podążając tym tropem otrzymamy coś takiego:
- P
-
Θ00 - R
p
− Θ0
L
− Lp Θ0 - R
Θ-
− Lp g
− Θ
L
Jak coś takiego „zaprogramować” w Scilabie? Trudne pytanie. (Tym bardziej,
że opisać trzeba proces klikania myszą. . . Zaczniemy od czegoś prostszego.
Po pierwsze — należy uruchomić ten fragment Scilaba, który odpowiada za
modelowanie. Nazywa się on scicos i takie polecenie wpisujemy. Jego efektem jest
otwarcie kolejnego okienka (wszystkie zrzuty ekranu pochodzą z wersji Linuxowej).
22
Informacje w tym okienku wprowadzamy za pomocą myszy kopiując gotowe
bloczki z tak zwanych palet. Aby się do nich dostać z menu Edit wybieramy polecenie Palettes.
23
Z listy możemy wybrać jedną paletę. Proponuję zacząć od Sources czyli źródła.
24
Klikamy myszą w interesujący nas obiekt (niech to będzie sinusoid generator )
i mysz przenosimy do głównego okienka scicosa — do wskaźnika powinien być
podczepiony prostokącik. Umieszczamy go gdzieś na planszy (sugeruję wybranie
lewej strony) i klikamy. Powinniśmy uzyskać efekt widoczny na kolejnej ilustracji:
25
Kolejny raz wybieramy Edit-¿Palettes i wybieramy z listy paletę Sinks:
26
Z tej palety przenosimy obiekt opisany MScope uzyskując efekt poniższy:
27
Łączymy wyjście generatora (taki czarny „trójkącik” po prawej stronie bloczku)
z wejściem oscyloskopu (czarny trójkącik po stronie lewej bloczku):
28
Z kolejnej palety (Linear) wybieramy bloczek oznaczony symbolem całki.
29
30
Dokonujemy kolejnych połączeń uzyskując następujący efekt:
31
Uwaga! Nie jest to jeszcze nasze wahadło — to tylko prościutki przykład.
Z paletki Sources będzie nam jeszcze potrzebny taki czerwony zegar,4 żeby
uzyskać efekt jak poniżej:
4
Zegar ten dostarcza współrzędną czasu do naszego oscyloskopu — w dużym uproszczeniu.
32
Wybieramy menu Simulation-¿Settings, a w otwartym okienku, w polu Final
integration time zmieniamy liczbę 100000 (sekund) na jakąś mniejszą — 15?
33
I teraz możemy już z menu Simulation wybrać Run żeby obejrzeć efekt naszej
działalności. (Dla leniwych, którzy się pogubili w tym opisie — gotowy model.
Trzeba go „wczytać” do okienka scicosa.)
34
To co udało nam się uzyskać to generator przebiegu sinusoidalnego, sygnał wyjściowy generatora trafia na układ całkujący. Na „oscyloskopie” możemy oglądać
przebieg oryginalny i po scałkowaniu.
W podobny sposób powinniśmy przygotować nasz model wahadła. Potrzebna
nam będzie paletka z układmi liniowymi (z której pobierzemy dwa układy do całkowania (integratory) oraz układ sumacyjny); paletka zatytułowana sink (wyjścia?)
— oscyloskop oraz paletka z układami nieliniowymi (dwa bloczki pozwalające na
realizację dowolnych operacji) i (do obsłużenia wykresów — „czerwony zegar”)
z paletki Sources oraz stałą (taki bloczek z dużą jedynką na tej paletce) — trzy
razy, aby zdefiniować L — długość wahadła, p — współczynnik tłumienia oraz
przyśpieszenie ziemskie (g).
Wszystko łączymy tak aby uzyskać układ następujący:
35
Specjalnej uwagi wymagają bloki „Mathematical Expression”. Po pierwsze mają one tylko dwa wejścia (a my potrzebujemy trzy), po drugie — musimy zdefiniować operację, którą mają realizować (x ∗ α/β). Po dwukrotnym kliknięciu na
bloczek otwiera się okienko:
36
W polu number of inputs — zamiast dwójki wstawiamy trójkę. W polu scilab
expression powinniśmy wpisać coś takiego: –u1*u2/u3. Wejścia bloku są numerowane jako u1, u2,. . . od góry bloku. Jest jeszcze jeden problem: wolelibyśmy mieć
wszystkie wejścia bloku po stronie prawej, a jego wyjście — po lewej. W tym celu
z menu Edit wybieramy pozycję flip, a następnie kursorem wskazujemy blok, który
powinien być „odwrócony”. Cała reszta powinna pójść łatwo. Jeżeli jednak ktoś
nie potrafi sobie poradzić — znajdzie gotowy plik.
Podobnie jak w poprzednim przykładzie w menu Simulation wybieramy Setup
i skracamy nieco czas symulacji. Tak do 20–30 sekund. A następnie możemy już
wybrać Run.
Jeżeli nic się nie dzieje — to trzeba chwilkę się zastanowić. Zwracam uwagę, że
model wahadła jest autonomiczny — nie kontaktuje się ze światem zewnętrznym
w żaden sposób. Odpowiada to sytuacji rzeczywistego wahadła, które spokojnie
wisi sobie na kulce. Do chwili wytrącenia go z pozycji równowagi nie ma prawa się
nic dziać.
W jaki sposób wytrącić wahadło z pozycji równowagi: w świecie rzeczywistym
wzielibyśmy wahadło w paluszki i odchylili je o niewielki kąt, a następnie puścili i
rozpoczęli obserwację. . .
Czyli w chwili „zero” zmienna Θ ma pewną niezerową wartość. Żeby osiągnąć
ten efekt — klikamy dwukrotnie na blok całkujący znajdujący się po prawej stronie naszego schematu i w polu initial condition (warunek początkowy) wpisujemy
niewielką liczbę. Teraz powinno działać.
37
W efekcie uzyskamy wykresy podobne do poniższych:
38
Zakończenie
Najbardziej aktualna wersja tego tekstu dostępna jest pod adresem: http://
kufel.immt.pwr.wroc.pl/~myszka/matlab/ — w postaci HTML. Dodatkowo
pod adresem http://kufel.immt.pwr.wroc.pl/~myszka/matlab/matlab.pdf jest
wersja PDF tekstu.
Program Scilab można pobrać albo z adresu http://www.scilab.org/download/
index_download.php?page=release.html — wszystkie wersje i kod źródłowy
lub (ale tylko wersja instalacyjna Windows): http://kufel.immt.pwr.wroc.pl/
~myszka/matlab/scilab.exe
39
A
Słów kilka o „lewym dzieleniu” czyli rozwiązywanie równań liniowych
Normalna sytuacja to take, gdy mamy n równań i n niewiadomych. Układ równań
(liniowych) zapisujemy wówczas zazwyczaj jakoś tak:
Ax = b
gdzie: A macierz kwadratowa o wymiarach n × n, b — wektor (kolumnowy) o
wymierze n, tak zwane „prawe strony”, x — wektor kolumnowy o wymiarze n
czyli niewiadome.
Układ taki rozwiązuje się w następujący sposób:
1. Mnożymy obie strony równania lewostronnie przez A−1 .5
A−1 Ax = A−1 b
2. upraszczamy to co się da uprościć i otrzymujemy:
x = A−1 b
Jeżeli mamy równanie następujące:
3x + 4y = 11
2x − 5y = −3
wówczas macierze A i b wyglądają tak:
"
A=
3 4
2 −5
#
"
b=
11
3
W Matlabie/Scilabie będzie to jakoś tak:
-->A=[3 4;2 -5]
A =
!
!
3.
2.
4. !
- 5. !
-->b=[11;3]
b =
5
Zatem metoda ta wymaga aby macierz A była niosobliwa!
40
#
!
!
11. !
3. !
-->x=A^(-1)*b
x =
!
!
2.9130435 !
0.5652174 !
Zamiast A^(-1) można napisać inv(A):
-->y=inv(A)*b
y =
!
!
2.9130435 !
0.5652174 !
Gdy mamy więcej równań niż niewiadomych — układ równań, zazwyczaj, nie
ma jednoznacznego rozwiązania. Podobnie jest w przypadku gdy mamy więcej
niewiadomych niż równań.
W takim przypadku (macierz A nie jest kwadratowa!) powyższa metoda nie
ma zastosowania.
W przypadku gdy liczba równań jest większa niż liczba niewiadomych (system
nadokreślony) — szukamy rozwiązania metodą najmniejszych kwadratów, czyli
takiego, które minimalizuje ||Ax − b||.
Gdy niewiadomych (n) jest więcej niż równań (m) (system niedookreślony) —
szukamy rozwiązania o co najmniej m niezerowych współrzędnych.
Polecenie \ („lewe dzielenie”) jest tak skonstruowane, że w każdym przypadku
x=A jest rozwiązaniem równania Ax = b.
¯
Druga metoda postępowania to zastosowanie zamiast funkcji inv funkcji pinv.
W=pinv(A) generuje macierz W o wymiarach takich jak A0 (A transponowane) i
taką, że:
AW A = A, W AW = W
jest to pseudoodwrotność macierzy A.
Zastosowanie pseudoodwrotności daje rozwiązanie układu równań, które minimalizuje
||AX − b||
(|| · || to symbol normy).
41
B
Aproksymacja średniokwadratowa
Kolejne zastosowanie operatora „lewego dzielenia” jest następujące: zmierzyliśmy
wielkość y w kilku chwilach czasu t uzyskując następujące rezultaty:
t
y
0.0 0.82
0.3 0.72
0.8 0.63
1.1 0.60
1.6 0.55
2.3 0.50
Chcemy zamodelować powyższą zależność za pomocą równania:
y(t) = c1 + c2 e−t
(3)
Wprowadzamy dane do Scilaba (Matlaba) za pomocą następujących poleceń:
t = [0 .3 .8 1.1 1.6 2.3]’;
y = [.82 .72 .63 .60 .55 .50]’;
Budujemy układ sześciu równań (o dwu niewiadomych), z których mamy wyznaczyć c1 i c2 tak, aby „ jak najlepiej” spełnić zależności:
0.82 = c1 + c2 e−0.0
0.72 = c1 + c2 e−0.3
0.63 = c1 + c2 e−0.8
0.60 = c1 + c2 e−1.1
0.55 = c1 + c2 e−1.6
0.50 = c1 + c2 e−2.3
Poniższe polecenia utworzą macierz E tego równania:
-->E = [ones(t) exp(-t)]
E =
!
!
!
!
!
!
1.
1.
1.
1.
1.
1.
1.
0.7408182
0.4493290
0.3328711
0.2018965
0.1002588
!
!
!
!
!
!
(size(t) zwraca długość (czy ogólnie wymiary) wektora t; ones generuje wektor
o zadanej długości złożony z jedynek).
Rozwiązaniem problemu jest bardzo proste:
42
-->c=E\y
c =
!
!
0.4759522 !
0.3413195 !
Zobaczmy jak to wygląda:
-->Y=[ones(T) exp(-T)]*c;
-->plot(T,Y,’-’,t,y,’o’)
Ciągła linia to wykres funkcji 0.4759522 + 0.3413195e−t , kółeczka oznaczają dane
pomiarowe.
0.85
0.80
0.75
0.70
0.65
0.60
0.55
0.50
0.45
0.0
C
0.5
1.0
1.5
2.0
2.5
Kilka przydatnych funkcji
rand(n,m) generuje tablicę o wymiarach n × m wypełnioną liczbami losowymi
(rozkład jednostajny z zakresu [0, 1)
ones(n,m) generuje tablicę o wymiarach n × m wypełnioną jedynkami
43
max(A) wyznacza maksymalny element w tablicy A
min(A) wyznacza minimalny element w tablicy A
size(B) informuje wymiarach tablicy B
D
Ciut o programowaniu
Pętla konstrukcja programistyczna znana pod nazwą pętli realizowana jest tak:
for zmienna=wyrażenie, instrukcja, instrukcja, . . . , end
-->n=5;
-->for i = 1:n, for j = 1:n, a(i,j) = 1/(i+j-1);end;end
-->a
a =
!
!
!
!
!
1.
0.5
0.3333333
0.25
0.2
0.5
0.3333333
0.25
0.2
0.1666667
0.3333333
0.25
0.2
0.1666667
0.1428571
0.25
0.2
0.1666667
0.1428571
0.125
0.2
0.1666667
0.1428571
0.125
0.1111111
Literatura
[1] Marek Czajka. MATLAB: ćwiczenia: opanuj środowisko programistyczne
MATLAB-a, napisz programy obliczeniowe, zilustruj wyniki obliczeń wykresami. Helion, Gliwice, 2005.
[2] Aleksandr I. Jastrebov. Optymalizacja – teoria, algorytmy i ich realizacja w
MATLAB-ie. Wydawnictwo Politechniki Świętokrzyskiej, Kielce, 2004.
[3] Anna Kamińska. Ćwiczenia z Matlab: przykłady i zadania. Mikom, Warszawa,
2002.
[4] Ryszard Lempka. Modelowanie i symulacja układów dynamicznych: wybrane zagadnienia z przykładami w Matlabie. AGH Uczelniane Wydawnictwa
Naukowo-Dydaktyczne, Kraków, 2004.
44
!
!
!
!
!
[5] Bogumiła Mrozek. MATLAB i Simulink: poradnik użytkownika. Helion, Gliwice, 2004.
[6] Wiesława Regel. Obliczenia symboliczne i numeryczne w programie Matlab.
Mikom, Warszawa, 2004.
[7] Mirosław Wciślik. Wprowadzenie do systemu MATLAB. Wydawnictwo Politechniki Świętokrzyskiej, Kielce, 2000.
[8] Mirosław Wciślik. Wprowadzenie do systemu MATLAB. Wydawnictwo Politechniki Świętokrzyskiej, Kielce, 2003.
[9] Andrzej Zalewski. MATLAB – obliczenia numeryczne i ich zastosowania.
Nakom, Poznań, 2002.
[10] Barbara Łysakowska. Komputerowa symulacja układów automatycznej regulacji w środowisku MATLAB/Simulink. Oficyna Wydawnicza Politechniki
Wrocławskiej, Wrocław, 2005.
45

Podobne dokumenty