18
1 MATLAB priručnik MATLAB je u početku bio zamišljen za rješavanje linearne algebre, i njegovo ime dolazi iz naziva “matrix laboratory.” Od ranih 80ih MATLAB je postao izvrstan programski paket za matematičku analizu. Ovo je uvod u neke najosnovnije naredbe 1 . Nije moguće obuhvatiti sve u ovom kratkom priručniku već nastojimo biti maksimalno učinkoviti u najmanjem mogućem broju stranica. Nije nam cilj napraviti zastrašujuće velik priručnik. Ljepota MATLAB-a je u tome da moramo znati malo, a da bi već postigli određenu djelotvornost. Kada shvatimo osnove, nova znanja jednostavno «poberemo» sa MATLAB-ovih on-line pomoćnih usluga. Dakle, najbolje se radi uz rad, pa su i ove upute tako napisane da čitajući ih istovremeno upisujemo MATLAB naredbe. U tekstu ćete nailaziti na znak % (posto). Sve što je iza toga znaka smatra se komentarom kojeg MATLAB zanemaruje, pa stoga taj tekst nije potrebno utipkati da bi se naredba izvršila (dakle, služi samo kao objašnjenje). Najvažnije osnovne naredbe i funkcije Opće funkcije: cd Promjena poddirektorija demo (intro) Startanje odjelka upoznavanja dir Ispis datoteka u trenutnom direktoriju help, helpwin Pomoć, pomoćni prozor load Učitaj workspace (radni prostor). Također služi kod umetanja polja iz tekstualne datoteke lookfor Pretraživanje po ključnoj riječi print Ispiši graf; može koristiti padajući izbornik pwd Trenutni radni direktorij quit Odustati; završetak rada save Spremi workspace. Također služi kod eksportiranja polja iz tekstualne datoteke who, whos Ispisuje listu varijabli u workspaceu Matrične funkcije: eye Stvaranje jedinične matrice eig Skalarne vrijednosti matrice ones Stvara vektor ili matricu ispunjenu sa jedinicama inv Inverzna matrica size, length Veličina matrice, duljina vektora zeros Stvara vektor ili matricu ispunjenu sa nulama \ lijevo dijeljenje; nalazi x u izrazu Ax=b Proceduralne funkcije: for… end For petlje if… else… end If-then-else grananje ode23, ode45 Runge-Kutta integracijske funkcije polyfit aproksimiranje polinomom while… end While petlje 1 Ove upute su uzete iz kompletnih CENG 120 MATLAB uputa. Struktura kontrole toka kao što je if-then-else grananje ili for-petlje uzete su sa FAQ stranica predavanja.

1330678948-0-matlabtutor

  • Upload
    zimek

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1330678948-0-matlabtutor

1

MATLAB priru čnik

MATLAB je u početku bio zamišljen za rješavanje linearne algebre, i njegovo ime dolazi iz naziva “matrix laboratory.” Od ranih 80ih MATLAB je postao izvrstan programski paket za matematičku analizu. Ovo je uvod u neke najosnovnije naredbe1. Nije moguće obuhvatiti sve u ovom kratkom priručniku već nastojimo biti maksimalno učinkoviti u najmanjem mogućem broju stranica. Nije nam cilj napraviti zastrašujuće velik priručnik. Ljepota MATLAB-a je u tome da moramo znati malo, a da bi već postigli određenu djelotvornost. Kada shvatimo osnove, nova znanja jednostavno «poberemo» sa MATLAB-ovih on-line pomoćnih usluga.

Dakle, najbolje se radi uz rad, pa su i ove upute tako napisane da čitajući ih istovremeno upisujemo MATLAB naredbe. U tekstu ćete nailaziti na znak % (posto). Sve što je iza toga znaka smatra se komentarom kojeg MATLAB zanemaruje, pa stoga taj tekst nije potrebno utipkati da bi se naredba izvršila (dakle, služi samo kao objašnjenje).

Najvažnije osnovne naredbe i funkcije Opće funkcije: cd Promjena poddirektorija

demo (intro) Startanje odjelka upoznavanja dir Ispis datoteka u trenutnom direktoriju help, helpwin Pomoć, pomoćni prozor load Učitaj workspace (radni prostor). Također služi kod umetanja

polja iz tekstualne datoteke lookfor Pretraživanje po ključnoj riječi print Ispiši graf; može koristiti padajući izbornik pwd Trenutni radni direktorij quit Odustati; završetak rada save Spremi workspace. Također služi kod eksportiranja polja iz

tekstualne datoteke who, whos Ispisuje listu varijabli u workspaceu Matrične funkcije: eye Stvaranje jedinične matrice eig Skalarne vrijednosti matrice ones Stvara vektor ili matricu ispunjenu sa jedinicama inv Inverzna matrica size, length Veličina matrice, duljina vektora zeros Stvara vektor ili matricu ispunjenu sa nulama \ lijevo dijeljenje; nalazi x u izrazu Ax=b Proceduralne funkcije: for… end For petlje if… else… end If-then-else grananje ode23, ode45 Runge-Kutta integracijske funkcije polyfit aproksimiranje polinomom while… end While petlje

1 Ove upute su uzete iz kompletnih CENG 120 MATLAB uputa. Struktura kontrole toka kao što je if-then-else grananje ili for-petlje uzete su sa FAQ stranica predavanja.

Page 2: 1330678948-0-matlabtutor

2

Funkcije za iscrtavanje: axis Drugačija skala za grafički prikaz grid Linije za lakše iščitavanje vrijednosti hold Više grafičkih prikaza na istoj slici legend Dodaj legendu na sliku plot Napravi sliku text (gtext) Dodaj tekst na sliku title Dodaj naslov na sliku xlabel, ylabel Dodaj na sliku labele osi

1. Neke osnovne MATLAB naredbe U ovom tekstu pokrivene su naredbe

• help, demo itd:

Za početak možemo malo istražiti MATLAB koristeći se njegovim demonstracijskim programima za uvođenje u problematiku. Ako ste novi u MATLAB-u onda je vrlo preporučljivo da bacite pogled na intro i demo.

intro % starta program za upoznavanje demo % starta demo program

Dobro je ako se uz to koristi i MATLAB-ov on-line help. Načini na koje se može doći do nje su:

help % klasi čna pomo ć unutar naredbenog prozora helpbrowser % pomo ć unutar prozora za brzo pretraživanje; može ga

% se pozvati i sa padaju ćeg Help izbornika

Koristiti on-line help bi trebala postati navika. Sučelje prema korisniku je vrlo intuitivno i lako se koristi. Naravno da se može upotrebljavati i klasični način pomoći pomoću naredbe help. Za pomoć u Naredbenom Prozoru (Command Window) potrebno je najprije prebaciti se u drugačiji režim rada tzv. page mode. Slijedi primjer kako pretražiti pomoć na klasični način:

more on % prebacivanje u page mode režim rada help print lookfor print % pretraživanje po klju čnoj rije či print which print % ispis puta do print.m

Usluge za pomoć te sučelje Naredbenog Prozora jako se brzo razvijaju i mijenjaju. Na sreću te usluge su sve više intuitivne i lakše za upotrebu pa ćemo stoga preskočiti njihovo detaljnije opisivanje. Za sada ćemo navesti još nekoliko osnovnih MATLAB naredbi.

who % ispis varijabli koje su trenutno definirane whos % detaljnija verzija naredbe who dir % ispis datoteka u trenutnom poddirektoriju what % ispis samo M-datoteka cd % pozicioniraj se u drugi poddirektorij pwd % ispis trenutnih radnih direktorija

Za test možemo probati sljedeće:

why fix(clock)

Page 3: 1330678948-0-matlabtutor

3

2. Neke osnovne matrične naredbe i operacije U ovom tekstu pokrivene su sljedeći pojmovi i akcije

• tvorba vektora i matrica

• upotreba dvotočka (colon) operatora za generiranje serije brojeva

• jednostavne matrične operacije

Matlab je najbolji u radu sa poljima koje ovdje nazivamo matricama i vektorima.2 Jedno i drugo se kreiraju upisivanjem seta brojeva unutar uglatih zagrada. Pa za početak kreirajmo vektor u MATLAB-ovom naredbenom prozoru.

x = [1 2 3 4 5 6 7 8 9 10]

Ako stavimo točku-zarez na kraju kao u

x = [1 2 3 4 5 6 7 8 9 10];

možemo rezultat staviti u drugi plan i pozvati ga kasnije tako da unesemo ime varijable (u našem slučaju x). Da bi kreirali vektor stupac (matrica sa jednim stupcem) moramo ubaciti točku-zarez između svakog broja (o tome ćemo više kasnije u primjerima sa matricama). Drugi i lakši način je da izgeneriramo transponiranu matricu od x:

x = x’

Imajte na umu da je MATLAB osjetljiv na velika i mala slova. Malo slovo x i veliko slovo X su dvije različite varijable.

Također, vektor možemo generirati i uz pomoć dvotočka operatora:

x = 1:10 % isto kao 1:1:10 y = 0:0.1:2 % primjer sa inkrementom 0.1

Dvotočka operator je vrlo koristan kada radimo s većim vektorima za ucrtavanje ili kalkulacije. Ova sintaksa sadržava početnu i krajnju vrijednost vektora sa vrijednošću inkrementalnog koraka u sredini, a između njih umeće se dvotočka. Ako inkrementalni korak nije određen uzima se defaultna vrijednost 1. Ne zaboravite dodati točku-zarez na kraju izraza kako bi izbjegli ispis dugačkih stringova brojeva. Ovdje točka-zarez nije dodana samo zbog ilustracije kako bi vidjeli što je izgenerirano.

Za kreiranje matrice koristimo se točka-zarezom kako bi odvojili retke:

a = [1 2 3 ; 4 5 6 ; 7 8 9]

Kod upisa bi se umjesto točka-zareza moglo samo pritisnuti enter i efekt bi bio isti.

Postoje slučajevi u kojima nam treba veličina polja ili duljina vektora. Te vrijednosti možemo dobiti na jednostavan način:

size(y) % na đi veli činu polja length(y) % na đi duljinu vektora

2 MATLAB podržava i složenije oblike polja kao što su polja ćelija (cell arrays) i strukture ali njih ovdje nećemo obrađivati. Strukture u MATLABU su slične onima koje srećemo u C-u dok su polja ćelija ona polja čiji su elementi također polja, i najviše se uptrebljavaju u rukovanju sa stringovima

Page 4: 1330678948-0-matlabtutor

4

MATLAB podržava sve moguće načine manipuliranja vektorima i matricama. Mi trebamo znati samo neke od njih.

Za sad ćemo izvršiti nekoliko jednostavnih operacija. Nad vektorom x i matricom a koje smo definirali ranije možemo primijeniti nekoliko jednostavnih operacija kao što su:

y1 = 2*x % množenje x sa konstantom y2 = sqrt(x) % va đenje korijena iz svakog elementa u x b = sqrt(a) % va đenje korijena iz svakog elementa u a y3 = y1 + y2 % zbrajanje dva vektora c = a*b % množenje dviju matrica

Sve funkcije u MATLAB-u kao što je npr. sqrt() su “dovoljno pametne” da prihvaćaju za varijable skalare, vektore ili matrice3

Ako želimo da operator ili operacija djeluje na svaki element polja (element-po-element princip) moramo staviti točku prije operatora. Naravno, zbunjujuće je ako se zapitamo kada treba primijeniti operaciju po principu element-po-element, pogotovo ako se služimo vektorima u rješavanju funkcija. Evo nekoliko primjera baziranih na dvjema kvadratnim matricama a i b:

d = a.^3 % kubiranje svakog elementa a3 = a^3 % kubiranje matrice e = a.*b % množenje svakog elementa: a(i,j)*b(i ,j) f = a*b % množenje matrica a*b

Sad se vratimo našem komentaru kako možemo upotrijebiti vektore u izračunima. Razmotrimo pojednostavljeni izraz iz termodinamike:

z = 1 + b/v + c/v2

gdje je v specifični volumen, b i c su konstante. Koristeći proizvoljne vrijednosti ovako možemo izračunati faktor kompresije z za vrijednosti v u rasponu od 30 do 100:

b = 12; c = 1.2; v = 30:10:100 % vektor v = [30 40 … 100] v2 = v.^2 % kvadrat svakog elementa vektora v z = 1 + b./v + c./v2

Uočite kako smo dodali točke u zadnja dva izraza. Također uočite kako smo obavili posao bez da smo se koristili petljama. Ako želimo nacrtati z u ovisnosti o v koristili bi manji inkrementalni korak u generiranju vektora v te bi dodali točku-zarez kako bi izbjegli ispis takvog izgeneriranog vektora. Ako ste shvatili ovaj jednostavan primjer, spremni ste za puno složenije funkcijske izračune.

U određenim slučajevima poželimo spojiti male matrice i načinili velike. To spajanje zove se konkatenacija. U MATLAB-u ne trebamo posebne funkcije da bi napravili takvo što.

3 U računarstvu to se zove polimorfizam. Pojam koji označava primjenu matematičkih operatora nad različitim tipovima podataka zaove se overloading

Page 5: 1330678948-0-matlabtutor

5

Nekoliko primjera korištenja vektora v i z koje smo već generirali: dakle želimo načiniti matricu koja se sastoji od v u jednoj koloni i z u drugoj koloni. To postižemo tako da upišemo:

T1 = [v' z']

Ovdje najprije transponiramo redove u kolone i zatim ih skupa spojimo u matricu T1. Ako tome još želimo dodati treću kolonu v2 onda to radimo ovako:

format short e % koristi kratki eksponencijalni format T1 = [T1 v2']

Dodali smo izraz za formatiranje kako bi koristili eksponencijalni format jer na taj način možemo lakše pročitati brojeve. MATLAB ima loše rješenje prikaza brojeva kada su redovi veličina jako različiti.

Napravimo sada drugačiju “tablicu” sa sva tri vektora u redovima:

T2 = [v ; z ; v2] format short % vrati se u prijašnji format

Točka-zarez ima ulogu odvajanja redaka na isti način kao kada smo kreirali našu prvu malu matricu a. Naravno matrica T2 je transponirana matrica T1 pa smo do istog rješenja mogli doći i na taj način.

Ako možemo konkatenirati vektor sigurno možemo i dodati element. Recimo da želimo napravit Fahrenheit skalu sa onim čudnim vrijednostima 32 i 212. Ovo je jedan od načina:

F = 40:10:210; F = [32 F 212]; % umetni broj na dva kraja

Metode u ovim primjerima mogu se primijeniti na svim ostalim problemima. Ako niste sigurni kako umetnuti ili da li treba vektore najprije transponirati, najlakši način je da načinite nekoliko testnih vektora i najprije eksperimentirate na njima. To su stvari u kojima je MATLAB vrlo dobar kao alat. Između ostalog rješenja većine problema sa kojima ćete se susresti najčešće se ne kriju u onim skupim MATLAB-ovim knjigama.

Sada kada znamo spajati matrice i vektore želimo saznati kako izvući vektore i matrice iz matrica? Da bi izvukli vrijednost služimo se zagradama (slično kao u Fortranu). Za primjer će nam poslužiti v i T1 od prije.

v(3) % vrijednost tre ćeg elementa vektora T1(3,2) % element u 3. redu i 2. stupcu

Interesantno je kada treba izvući redak ili stupac ili cijelu podmatricu. Da bi to postigli poslužit ćemo se operatorom dvotočka. Na primjer:

v(2:4) % 2. i 4. element T1(3:4,1:2) % 2x2 podmatrica T1(:,2) % drugi stupac T1(2,:) % drugi redak

Kada koristimo dvotočku bez brojeva na nekoj strani, to onda znači od kraja do kraja. Ili drugim riječima T2(:,2) se odnosi na sve retke u drugom stupcu.

Page 6: 1330678948-0-matlabtutor

6

Brisanje npr. stupaca iz matrice, vrši se tako da navedemo da su dotični stupci prazni. Npr:

T2(:,[2])=[] % izbriši drugi stupac T2(:,[1 3])=[] % izbriši stupac 1 i 3

MATLAB može generirati specijalna polja. Za nas je korisna jedinična matrica te polja ispunjena jedinicama ili nulama. Oni mogu biti korisni predlošci za ispunjavanje ostalih elemenata u kasnijim izračunima. Nekoliko primjera generiranja takvih polja:

eye(5) % 5x5 jedini čna matrica ones(1,5) % redak od pet elemenata sa vrijednos ti 1 zeros(5,1) % stupac od pet elemenata sa vrijedn osti 0 ones(5,5) % matrica 5x5 sa svim elementima 1

Nije potrebno napomenuti da MATLAB može rješavati bilo kakve izraze linearne algebre. Npr . možemo lako riješiti jednadžbu Ax = b uz pomoć operatora “\”. Primjer:

A = [ 4 -2 -10; 2 10 -12; -4 -6 16]; b = [-10; 32; -16]; x = A\b % Bingo!

Jednako tako u MATLAB-u je moguće izvršiti i LU dekompoziciju:

[L,U] = lu(A); d = L\b; % d=L -1 ⋅⋅⋅⋅b x = U\d % x=U -1 ⋅⋅⋅⋅d=U-1 ⋅⋅⋅⋅L-1 ⋅⋅⋅⋅d ⇒⇒⇒⇒ L ⋅⋅⋅⋅U⋅⋅⋅⋅x=b, A=L ⋅⋅⋅⋅U ⇒⇒⇒⇒ A ⋅⋅⋅⋅x=b

Provjerimo rješenje tako da invertiramo matricu A:

C = inv(A); % C=A -1

x = C*b

Lako dolazimo do skalara (svojstvena vrijednost-eigenvalues i sv. vektor-eigenvectors)

[X,D] = eig(A)

3. Neke osnovne matrične naredbe i operacije U ovom poglavlju pokriveno je:

• upotreba plot operacije

• dodavanje dodatnih iscrtavanja, naslova i labela

• ilustracija polyfit() funkcije za aproksimaciju polinomom

Kreirajmo najprije nekoliko vektora:

x = 0:0.5:10; y1= 2*x; y2= sqrt(x);

Iscrtajmo sada skupa y1 u ovisnosti o x i y2 u ovisnosti o x:

plot(x,y1, x,y2)

Page 7: 1330678948-0-matlabtutor

7

Doduše, ne postoji baš širok spektar linija ili simbola za izbor kako bi ih razlikovali. Npr. možemo probati sljedeće4:

plot(x,y1,'-.') hold % ili "hold on" plot(x,y2,'--') hold % ili "hold off"

Izbor linja možemo provesti uz pomoć “help plot.” Naredba hold omogućava nam da napravimo više grafova na istoj slici.

Ako želimo dodati naslov ili labele na svaku os:

title('Dosadni ispis') xlabel('labela x-osi'), ylabel('labela y-osi')

Moguće je izdati više naredbi u jednom redu ako su odvojene zarezima. Ono što MATLAB čini laganim za naučiti je to da korisne stvari možemo dodavati jednu iza druge. Ne moramo se brinuti o naredbi za prijelaz na kompleksno područje. Moguće je napraviti i grafove u logaritamskoj skali. Ako želite možete se poslužiti on-line helpom kako bi podrobnije istražili semilogx, semilogy i te loglog. Ovaj puta ćemo ih preskočiti jer trenutno nisu od krucijalne važnosti.

Dodajmo na graf mrežu za kako bi nam olakšala očitavanje vrijednosti koje funkcija poprima. Dodajmo odmah i legendu:

grid legend('y1','y2')

Pravokutnik sa sličicom legende će se pojaviti u prozoru za graf (Graph Window). Koristite se mišem kako bi povukli pravokutnik tamo gdje ga želimo imati. Možemo dodati tekst koji komentira dotični graf.

text(1,9,'Moje dvije krivulje') % po četak je u to čki (1,9)

Unos teksta može postati interaktivan ako unesemo:

gtext('Moje dvije krivulje')

Kliknite sada na prozor za graf. Pojavio se križić. Pomaknite ga tamo gdje želite da legenda bude postavljena i kliknite. Ponovite i za ostale komentare.

U rjeđim slučajevima ako nam se ne sviđa skala koju nam je MATLAB dodjelio možemo definirati svoju sa maksimalnim i minimalnim vrijednostima sa svaku os:

axis([0 15 0 30]) % sintaksa je [xmin xmax ymin ym ax]

Potrebne su uglate zagrade unutar običnih jer se vrijednosti zapisuju u obliku polja.

Napravimo jednu aproksimaciju polinomom. Recimo da imam niz točaka kroz koje prolazi funkcija koju želimo aproksimirati polinomom:

x = [ 0 1 2 4 6 10]; y = [ 1 7 23 109 307 1231];

Da bi odredili polinom trećeg stupnja y = y(x) moramo upisati:

c = polyfit(x,y,3) % trebalo bi se dobiti c = [1 2 3 1]

4 Za višestruko ucrtavanje možemo koristiti: plot(x,y1,'-.', x,y2,'--')

Page 8: 1330678948-0-matlabtutor

8

Dobiveni vektor c sadrži koeficijente polinoma. U ovom primjeru rezultat je y = x3 + 2x2 + 3x + 1. Možemo provjeriti koliko je dobar odnosno približan onome što tražimo. U sljedećim izrazima stvorit ćemo vektor xfit tako da možemo nacrtati krivulju. Zatim izračunamo y vrijednosti i iscrtamo krivulju.

xfit=1:0.5:10; yfit=xfit.^3 + 2*xfit.^2 + 3*xfit +1; plot(x,y,'o', xfit,yfit) title('aproksimacija polinomom tre ćeg reda') legend(‘data’, ’polinom tre ćeg reda’)

Crtanje iz zabave

U našem slučaju nam neće trebati 3-D crteži ali šteta je ne pokazati nešto iz tog zgodnog područja. Pri tome moramo uvesti nekoliko novih funkcija koje nam ubuduće neće trebati.

[x,y]=meshgrid(-10:0.5:10, -10:0.5:10); % meshgrid transformira u specificiranu domenu % gdje -10 < x < 10, i -10 < y < 10 % u sustav gdje z ovisi o x i y r=sqrt(x.^2 + y.^2) + eps; % dodajemo eps z=sin(r)./r; % kako 1/r ne bi doveo do greške mesh(z) title('Sombrero')

Probajmo nešto slično sa Besselovim funkcijama:

% Ovdje ćemo nacrtati 3-D funkciju Jo(sqrt(x^2+y^2)) % x i y ostaju isti kao i u prethodnom crtežu r=sqrt(x.^2+y.^2); z=bessel(0,r); mesh(z)

4. Izrazi za upravljanje tijekom programa U ovom poglavlju pokriveno je:

• konstrukcije petlje do i while

• if-else-end grananje

Izrazi za kontrolu toka algoritma (u M-datoteci) su vrlo slični onome što smo naučili u Fortanu i C-u. Trebamo samo proći kroz nekoliko primjera. Za više informacija upotrijebite on-line help. To se također odnosi i na izraz “switch” ako ćete ga ikad trebati jer se ovdje neće upotrebljavati.

Mali i jednostavan primjer za for petlju:

n=10; for i = 1:n x(i)= sin(i*pi/2); end

Obratite pažnju na 1:n izraz. Možete primijetiti da on zapravo izgenerira polje. Za razliku od C-a, MATLAB koristi polje kao brojač. Odnosno 1:n možete komotno

Page 9: 1330678948-0-matlabtutor

9

zamjeniti sa nekom varijablom tipa polje. Unutar for petlje varijabla i poprima vrijednosti iz polja kod svakog ponavljanja petlje.

Primjer za while petlju:

eps=1; while (1+eps) > 1 eps=eps/2; end eps=eps*2;

“While” petlje su slične Fortranu i C-u. Ovdje moramo upotrebljavati logičke operatore ==, ~=, >, <, >=, <= odnosno redom jednakost, nejednakost, veće, manje, veće ili jednako, manje ili jednako.

Primjer za if-else-end: for i = 1:n for j = 1:n if i == j % MATLAB ne koristi "then" a(i,j)=2; else a(i,j)=0; end end end

Kao što ste primijetili if se upotrebljava bez then. Postoji samo if-end, ili if-else-end.

5. Stvaranje M-datoteka i radnog okruženja (workspace) U ovom poglavlju pokriveno je:

• izvršavanje ponovljenih naredbi u skripti tzv. M-datoteke

• snimanje radnog okruženja

Za poslove koje moramo neprestano ponavljati ima smisla snimiti ih u obliku skripte. U MATLAB-u se te skripte zovu M-datoteke. Ime dolazi od imena macro iz ranijih razdoblja programiranja. M-datoteke je poželjno koristiti kod nestrukturiranih skripti ili za funkcije koje smo sami stvorili. MATLAB se prema njima odnosi kao prema programima. Imajte na umu da pisanje takvog skript-programa nije isto kao program pisan u C-u.

Za naše je potrebe jednostavna skripta dostatna za većinu naših poslova. Za korištenje M-datoteke5 potrebno je učiniti sljedeće:

1. Spremite sve setove izraza koji se često ponavljaju u tekstualnu datoteku koja će imati .m ekstenziju

2. Da bi pokrenuli takvu datoteku unutar neke druge skripte napišite samo ime te datoteke bez ekstenzije.

5 Postoji još jedan lakši način. Na Unix/Linux radnim stanicama otvorite tekst datoteku (na Windowsima možete koristiti MATLAB-ov uređivač teksta) i u nju upišite izraze koji se neprestano ponavljaju. Sada možete kopirati izraze iz te datoteke i lijepiti ih na MATLAB-ov naredbeni prozor.

Page 10: 1330678948-0-matlabtutor

10

Primjer: imamo situaciju gdje često moramo grafički prikazati ovisnost funkcije x o y i stoga želimo automatizirati taj posao grafičkog prikazivanja uz pomoć M-datoteke. Izrazi koji su za to neophodni zajedno sa komentarima su:

% ______________ M-file script: plotxy.m __________ ______ % Skripta za grafi čki prikaz ovisnosti x o y te dodavanje labela % ...to je ono što ne želimo stalno ponavljati i po navljati plot(x,y) grid xlabel('Vrijeme [min]') ylabel('Odgovor') title('PID Simulacija') % Kraj plotxy.m. “end” izraz nije potreban.

Spremite to u datoteku pod imenom npr. plotxy.m. Sve što je iza “%” znaka smatra se komentarom koji možete, a i ne morate stavljati. Nakon što smo definirali nove ili promijenili stare vrijednosti za x i y i naredbenom prozoru, sve što trebamo učiniti je upisati “plotxy” i MATLAB će obaviti svoj dio. Važno je napomenuti da M-datoteka nema mehanizama za učitavanje ili eksplicitno unošenje x ili y vrijednosti. Sve naredbe iz M-datoteke se jednostavno izvršavaju u naredbenom prozoru.

Ako radimo sa M-datotekom njen put mora biti definiran u MATLAB-ovoj popisu putova gdje da traži. Pitanje je gdje to on traži. Na Unix/Linux stanicama MATLAB po definiciji najprije traži u direktoriju iz kojega je on sam startan. Dobra praksa je držati sve što napravimo na jednom mjestu u jednom direktoriju i pozicionirati se u taj direktorij neposredno prije samog pokretanja MALAB-a. Na Windows operativnom sustavu MATLAB traži u direktoriju koji se nalazi duboko negdje u Program Files direktoriju. Normalna stvar je da želimo pohraniti naše stvari na mjesto koje nam je više “pri ruci”. Kako MATLAB-u naznačiti gdje da traži? To pitanje se odnosi na Unix i Windows operativne sustave. Formalan način je da se poslužimo naredbama “cd” i “path”. Lakši način je iskoristiti mogućnosti koje nam pružaju padajući izbornici na alatnim trakama (tool bars) ili podprozorima (sub-windows).

Kad zaželimo otići na kratku kavu i snimiti sve dosadašnje varijable, moramo samo upisati:

save

prije nego izađemo iz MATLAB-a. Kad ga startamo ponovo, upišemo:

load

i sve će biti kao prije gašenja programa. Nemojte snimati radno okruženje ako ste završili sa onim za što vam je MATLAB trebao tj. ako ćete drugi puta trebati raditi sasvim neki drugi posao za koji prijašnje varijable nemaju nikakvo značenje.

6. Unošenje i iznošenje podataka Poglavlje pokriva:

• Uporabu load za unos matrica i njeno razbijanje u vektore

Page 11: 1330678948-0-matlabtutor

11

• Iznošenje matrica u obliku redaka s delimiterima (spreadsheet) sa save

Pretpostavimo da imamo niz eksperimentalnih podataka snimljenih u tekstualnim datotekama i želimo iskoristiti MATLAB da ih izanalizira i grafički prikaže. U mogućnosti smo micati podatke u i iz MATLAB-a. Originalna datoteka u kojoj se nalaze podaci može koristiti razmake, zareze ili tabove kao delimitere.

Uzmimo na primjer da raspolažemo datotekom test.dat sa tri stupca brojeva.

0 2.3000 4.3000

0.1400 3.4000 7.6000

2.3000 2.3000 5.6000

... ... ...

9.6700 2.3000 6.9000

U MATLAB-u unesemo

load test.dat

i datoteka test.dat će biti učitana u varijablu test. Možemo provjeriti koliko je velika:

size(test)

Recimo da zaželimo izostaviti stupce iz grafičkog ispisa i analize. Sjetimo se operacija s matricama u M1.2 odjeljku:

% za iznošenje potadaka, test(:,n) zna či “svi redovi u stupcu n ” t=test(:,1); % pretp. da stupac 1 predstavlja vr ijeme y1=test(:,2); y2=test(:,3);

Sada možemo upotrijebiti imena varijabli s kojima je puno lakše raditi. Ako trebate često postavljati njihove vrijednosti poslužite se M-datotekama.

Metoda za unošenje je vrlo korisna ako upotrebljavamo MATLAB za analizu podataka. MATLAB podržava statističke funkcije i funkcije analize kao što su mean, std, max, min, polyfit, spline, sort, hist (histogrami), corr (korelacijske matrice), itd. Ako imate licencu za MATLAB možete onda koristiti i Statistics Toolbox.

Učinimo brzo eksportiranje sa save. Recimo da imamo matričnu varijablu A i želimo je eksportirati kao tekst gdje su podaci odvojeni sa Tab. To radimo ovako:

save a.dat A -ascii -tabs

i matrica će biti spremljena kao datoteka pod imenom a.dat.

Za više specijalizirane potrebe MATLAB podržava funkciju fprintf() koja upisuje formatirane podatke u datoteku.

Page 12: 1330678948-0-matlabtutor

12

7. Integracija Runge-Kutta metodom Poglavlje pokriva:

• Upotreba ode23( ) i ode45( )

• Grafički prikaz rezultata

• Ispisivanje funkcije

MATLAB ima mogućnost rješavanja uobičajenih diferencijalnih jednadžbi raznim numeričkim metodama od koji je poznatija Runge-Kutta algoritam. Izgled M-datoteke je drugačiji nego u C-u ili Fortranu zato jer je MATLAB ipak matrično orijentiran. Stoga je MATLAB koji koristi program prevodioca puno sporiji nego C ili Fortran koji se kompiliraju. To je zato jer je MATLAB predviđen za poslove eksperimentalnog karaktera, gdje nije potrebno lomiti rekorde u brzini. Međutim današnji procesori su dovoljno brzi da ne bi mogli ni primjetili razliku u brzini izvođenja naših zadataka.

Dakle, za numeričko integriranje diferencijalnih jednadžbi, koristimo dvije funkcije: ode23( ), i ode45( ). Detaljnije za one koji to žele znati ode23( ) koristi par formula drugog i trećeg stupnja dok ode45( ) koristi Runge-Kutta-Fehlberg formule četvrtog i petog stupnja za automatsko koračno integriranje. MATLAB koristi i druge oblike algoritama za rješavanje diferencijalnih jednadžbi ali to za nas nije bitno.

help matlab/funfun

ili unesite “help ode23 ” “ help ode45 ”. Ono što slijedi je primjer uzet iz MATLAB-ove pokazne vježbe.

U tom primjeru uzet ćemo dvije diferencijalne jednadžbe koje opisuju dinamiku populacije u modelu predator-lovina:

dy1/dt = (1– αy2) y1 i dy2/dt = (–1 + αy1) y2

Zbog jednostavnosti ostavit ćemo parametre za određivanje granica tolerancije onakvima kakvi jesu.6 Obje funkcije (ode23 i ode45) koriste iste parametre. Ako želimo koristiti ode45( ) funkciju, sve što moramo učiniti je zamijeniti ode23 sa ode45 u M-datoteci dolje prikazanoj. Osim toga na primjeru je prikazano kako možemo proslijediti parametre modela funkciji gdje se nalaze diferencijalni izrazi. (Mogli smo definirati parametre kao globalne u glavnom programu i funkciji u kojoj je diferencijalni izraz).

Spremite program u M-datoteku npr. pod imenom “odesolver.m”. Diferencijalne jednadžbe spremljene su u dvije odvojene M-datoteke pod imenom “lotka.m”. Komentare možete preskočiti. Program se pokreće sa “odesolver”.

% Prvo: definirajte parametre koji će biti preneseni % deriviranoj funkciji spremljenoj u lotka.m. % % izaberimo proizvoljne brojeve: alpha=0.4; beta=0.5; % Sada namjestimo po četno i krajnje vrijeme te po četne uvjete za % diferencijalnu jednadžbu.

6 Kako promjeniti parametre tolerancije koristite se sa “help ode23” i “help ode45”

Page 13: 1330678948-0-matlabtutor

13

% MATLAB sam shvati koliko jednadžbi imamo koriste ći se % duljinom vektora y0[] u koji su smješteni po četni uvjeti. tspan = [0 30]; % integriraj od t=0 do t=30 [vrem. jedinice] y0=[5 3]; % po četni uvjeti u trenutku t=0 % Na kraju izintegrirajmo to. % 'lotka' zna či da će sve dif. jedn. biti spremljene u datoteci % lotka.m % Zagrade [] su neophodne ako koristimo defaultne v rijednosti % parametara. Imena varijabli poslije zagrada [] su parametri % za model. [t,y] = ode23('lotka',tspan,y0, [],alpha,beta); % Prikažimo grafi čki rezultate plot(t,y) title('Lotka-Volterra model') xlabel('Vrijeme'),ylabel('Populacija') figure(2) plot(y(:,1),y(:,2)) title('Grafi čki ispis') xlabel('Lovina'),ylabel('Predator') figure(1) %reset to fig 1 7

% kraj "programa"

Nadalje, unesite sljedeći program u datoteku pod imenom “lotka.m” koji će biti pozvan od strane ”odesolver.m”. Funkcija “lotka.m” sadrži dvije Lotka-Volterra diferencijalne jednadžbe iz modela predator-lovina.

Argument funkcije flag je prazna varijabla. Za više detalja upišite help odefile.

% ____________________ lotka.m ____________________ % % ova datoteka vra ća derivacije dydt[] (dy/dt) % funkcijama ode23() or ode45() % % Varijabla flag je prazna varijabla a lotka() uzim a samo % parametre alpha and beta. % % _ Budite sigurni da svaka naredba završava sa ; _ % function dydt = lotka(t,y, flag,alpha,beta) yp1 = (1 - alpha*y(2))*y(1); yp2 = (-1 + beta*y(1))*y(2); dydt = [yp1; yp2]; % dydt je vektor stupca %kraj lotka.m

Posljednji primjer omogućava nam da još jednom uočimo razliku između obične M-datoteke, tj. skripte (ovdje je to “odesolver.m”) i funkcije (“lotka.m”). Možemo shvatiti “odesolver.m” kao običan skup naredbi, s tim da su organizirane tako da rade nešto korisno pozivajući funkciju ode23( ) i crtajući rezultat. U slučaju da se želi napraviti interakcija između skripte i korisnika može se koristiti funkcija input() za unos podataka. Npr.:

a=input('Unesite neki broj: ');

pojavljuje se upit korisniku "Unesite neki broj: " nakon kojeg upišete broj i pritisnete tipku Enter, a taj broj će biti pohranjen u varijablu a.

Nema nikakvih pravila kako M-datoteka mora biti strukturirana.

Međutim ne možemo to isto reći i za funkciju lotka( ) unutar datoteke ”lotka.m” zato jer postoji jedno pravilo: funkcija mora započeti sa naredbom function skupa sa

Page 14: 1330678948-0-matlabtutor

14

argumentima funkcije s desne strane imena funkcije te varijable koja poprima izlaznu vrijednost (u gornjem primjeru je to dydt) funkcije s desne strane. Forma takvog izraza je:

function [y1, y2,… ] = lotka(x1, x2,… ) % x1, x2, itd. su ulazni argumenti. % y1, y2, itd. su izlazne varijable unutar polja om eđenog % sa zagradama [ ] % % Funkcija ne mora imati ulazne ili izlazne paramet re.

Funkcija je poprilično slična običnoj M-datoteci. Za razliku od C-a ne moramo definirati tipove podataka. Ne postoji niti end izraz niti return izraz koji su svojstveni C-u.

Ime .m datoteke pod kojim ćemo spremiti funkciju mora biti identično onom imenu koji se nalazi i u samoj funkciji (npr. ako je function [y1, y2,… ] = lotka(x1, x2,… ), funkciju ćemo spremiti u datoteku pod nazivom lotka.m).

Sav komentar koji se nalazi ispod retka kojim se definira funkcija će predstavljati opis pomoći (help), koji će se pojaviti u slučaju traženja pomoći za tu funkciju.

function [y1, y2,… ] = lotka(x1, x2,… ) % x1, x2, itd. su ulazni argumenti. ... >> help lotka % x1, x2, itd. su ulazni argumenti. ...

će predstavljati opis pomoći (help)

Kada pozivamo funkciju iz naredbene linije ili iz neke druge M-datoteke morate koristiti istu sintaksu samo bez izraza function:

[y1, y2,… ] = lotka(x1, x2,… )

Možda niste obraćali pažnju na to kada ste utipkavali program “odesolver.m”. Vratite se na taj primjer i uočite lijevu stranu izraza u kojem pozivamo funkciju ode23( ). Funkcija vraća dvije vrijednosti. Bez da smo naveli dvije varijable MATLAB bi vratio samo jednu i to onu prvu koje je napisana na listi izlaznih argumenata u samoj definiciji funkcije.

Page 15: 1330678948-0-matlabtutor

15

Zadaci za vježbu

1. Kako ćete naći vrijednost broja π u MATLAB-u?

2. Kako odrediti determinantu matrice A? 3. Za matricu A i vektor b,

95 89 82 92 23 76 44 74

A = 61 46 62 18 49 2 79 41

3 1

b = 1 9

treba odrediti: a) x gdje je Ax = b b) xTx i xxT c) A-1 d) vrijednost skalara od A e) determinantu od A

4. Napravite tablicu, npr. dva stupca, u kojima se nalaze vrijednosti i to u jednom u

radijanima, a u drugom pripadajuća vrijednost u stupnjevima (od 0 do 2π). Korak je takve veličine da cijeli ispis ispuni visinu vašeg ekrana.

5. Ponovite zadatak 4. s tim da stupci budu Fahrenheit (0 to 212 °F), Celsius, Kelvin, and

Rankin. 6. Za Redlich-Kwong izraz iz termodinamike: P = RT / (v – b) – a / (T0.5 v (v + b))

izračunajte P za vrijednost v od 50 do 150. Prikažite rezultat u dva stupca. Zatim grafički prikažite ovisnost P o v sa propisnim labeliranjem. Koristite R=10.73, T=650, a=1.36 x 106, b=1.3.

7. Usporedite grafički dvije funkcije tako da ih ucrtate u isti graf. Dodajte im labele i kazalo. Funkcije su:

y1(t) = e-0.2t

y1(t) = t e-0.2t

t je u rasponu od 0 do t=30.

8. Iskoristite izraz iz zadatka 6 te napišite funkciju rk() tako da joj je ulazna vrijednost v, a vraća P.

Page 16: 1330678948-0-matlabtutor

16

9. Iskoristite ode23() da bi riješili diferencijalnu jednadžbu u intervalu od t=0 do t=1.5:

dx1/dt = -0.5 x1 + 0.1x2

2 dx2/dt = - x2

0.5

sa početnim vrijednostima x1(0) = 0.8 i x2(0) = 1. Iscrtajte rezultat i stvorite sve potrebne datoteke.

10. Promijenite primjer koji smo koristili za prikaz while petlje koja nalazi epsilon. Stavite ga u M-datoteku i promijenite tako da vidite koliko je puta prošao kroz petlju. Zatim otvorite novu M-datoteku i napraviti isto ali ovaj puta koristeći se for petljom. Koristite se on-line helpom kako bi saznali kako iskočiti iz petlje ako su uvjeti zadovoljeni.

Page 17: 1330678948-0-matlabtutor

17

Rješenja

1. pi 2. Otvorite on-line Help. Nađite poglavlje Function Reference zatim u LinearAlgebra

i pod determinantama proučite funkciju det() 3. A=[95 89 82 92; 23 76 44 74; 61 46 62 18; 49 2 79 41];

b=[3; 1; 1; 9];

(a) x=A\b (x je –0.0198, –0.1036, 0.0917, 0.0715) (b) x'*x je (1x1); x*x' je (4x4) (c) Ai=inv(A); can check with Ai*A or A*Ai

(d) eig(A) (e) det(A)

4. Prva naredba za stvaranje radijana završava na okruglom broju pa se premašuje 2 π pa je zato dodana druga naredba

rad=0:0.5:2*pi; rad=[rad 2*pi]'; deg=(180/pi)*rad; T1=[rad deg]

5.

F=0:10:210; F=[F 212]'; %Ovo je sad vektor stupac C=(F-32)/1.8; K=C+273; R=1.8*K; T2=[F C K R]

6. R=10.73; T=650; a=1.36e+6; b=1.3; v=50:150; P=R*T./(v-b) - (a/T^0.5)./(v.*(v+b)); [v' P'] plot(v,P) title('Problem 6'), xlabel('v'), ylabel('P')

7.

t=0:0.5:30; y1=exp(-0.2*t); y2=t.*exp(-0.2*t); plot(t,y1, t,y2) title('Problem 7'), xlabel('t'), ylabel('y') legend('y1','y2')

Page 18: 1330678948-0-matlabtutor

18

8. Snimite sljedeće naredbe u datoteku “rk.m”. function p=rk(v) R=10.73; T=650; a=1.36e+6; b=1.3; p=R*T/(v-b) - a/T^0.5/v/(v+b)

%end

9. Naredbe koje spadaju u glavni dio su:

tspan = [0 1.5]; x0=[0.8 1]; [t,x] = ode23('deriv',tspan,x0); plot(t,x)

Ovaj dio spremite u “deriv.m”

xp1 = -0.5*x(1) + 0.1*x(2)*x(2); xp2 = -sqrt(x(2)); dxdt = [xp1; xp2]; %end

10. Upišite najprije eps u MATLAB-ov naredbeni prozor da saznate koji je točan odgovor. Sljedeće naredbe snimite pod “ep1.m”

eps=1; count=0; while (1+eps) > 1 eps=eps/2; count=count+1; end eps=eps*2 count-1

Sljedeće snimite u “ep2.m”

for i=1:100 eps=eps/2; if (1+eps) <= 1 break; end end eps=eps*2 i-1

Ako koristimo for petlju gdje je i = 1 : 53 možemo izbrisati if-end grananje.