MATLAB priručnik. Najvažnije osnovne naredbe i funkcije

Save this PDF as:
 WORD  PNG  TXT  JPG

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "MATLAB priručnik. Najvažnije osnovne naredbe i funkcije"

Transcript

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). Opće funkcije: cd demo (intro) dir help, helpwin load lookfor print pwd quit save who, whos Matrične funkcije: Najvažnije osnovne naredbe i funkcije Promjena poddirektorija Startanje odjelka upoznavanja Ispis datoteka u trenutnom direktoriju Pomoć, pomoćni prozor Učitaj workspace (radni prostor). Također služi kod umetanja polja iz tekstualne datoteke Pretraživanje po ključnoj riječi Ispiši graf; može koristiti padajući izbornik Trenutni radni direktorij Odustati; završetak rada Spremi workspace. Također služi kod eksportiranja polja iz tekstualne datoteke Ispisuje listu varijabli u workspaceu 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 if else end ode23, ode45 polyfit while end For petlje If-then-else grananje Runge-Kutta integracijske funkcije aproksimiranje polinomom 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. 1

2 Funkcije za iscrtavanje: axis grid hold legend plot text (gtext) title xlabel, ylabel Drugačija skala za grafički prikaz Linije za lakše iščitavanje vrijednosti Više grafičkih prikaza na istoj slici Dodaj legendu na sliku Napravi sliku Dodaj tekst na sliku Dodaj naslov na sliku 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 demo % starta program za upoznavanje % 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 helpbrowser % klasična pomoć unutar naredbenog prozora % 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 whos dir what cd pwd Za test možemo probati sljedeće: why fix(clock) % ispis varijabli koje su trenutno definirane % detaljnija verzija naredbe who % ispis datoteka u trenutnom poddirektoriju % ispis samo M-datoteka % pozicioniraj se u drugi poddirektorij % ispis trenutnih radnih direktorija 2

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 = [ ] Ako stavimo točku-zarez na kraju kao u x = [ ]; 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 ; ; 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) length(y) % nađi veličinu polja % 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 3

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 y2 = sqrt(x) b = sqrt(a) y3 = y1 + y2 c = a*b % množenje x sa konstantom % vađenje korijena iz svakog elementa u x % vađenje korijena iz svakog elementa u a % zbrajanje dva vektora % 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 matrice 3 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 a3 = a^3 e = a.*b f = a*b % kubiranje svakog elementa % kubiranje matrice % množenje svakog elementa: a(i,j)*b(i,j) % 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/v 2 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 = [ ] 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 4

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 v 2 onda to radimo ovako: format short e T1 = [T1 v2'] % koristi kratki eksponencijalni format 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) T1(3,2) % vrijednost trećeg elementa vektora % 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) T1(3:4,1:2) T1(:,2) T1(2,:) % 2. i 4. element % 2x2 podmatrica % drugi stupac % 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. 5

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 vrijednosti 1 zeros(5,1) % stupac od pet elemenata sa vrijednosti 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 = [ ; ; ]; 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) 6

7 Doduše, ne postoji baš širok spektar linija ili simbola za izbor kako bi ih razlikovali. Npr. možemo probati sljedeće 4 : plot(x,y1,'-.') hold plot(x,y2,'--') hold % ili "hold on" % 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([ ]) % sintaksa je [xmin xmax ymin ymax] 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 = [ ]; y = [ ]; Da bi odredili polinom trećeg stupnja y = y(x) moramo upisati: c = polyfit(x,y,3) % trebalo bi se dobiti c = [ ] 4 Za višestruko ucrtavanje možemo koristiti: plot(x,y1,'-.', x,y2,'--') 7

8 Dobiveni vektor c sadrži koeficijente polinoma. U ovom primjeru rezultat je y = x 3 + 2x 2 + 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 8

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-datoteke 5 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. 9

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 ponavljati 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 10

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 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 vrijeme 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. 11

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 MATLABove pokazne vježbe. U tom primjeru uzet ćemo dvije diferencijalne jednadžbe koje opisuju dinamiku populacije u modelu predator-lovina: dy 1 /dt = (1 αy 2 ) y 1 i dy 2 /dt = ( 1 + αy 1 ) y 2 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 12

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 vrijednosti % 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() uzima 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 13

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 omeđenog % sa zagradama [ ] % % Funkcija ne mora imati ulazne ili izlazne parametre. 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. 14

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, A = b = 1 9 treba odrediti: a) x gdje je Ax = b b) x T x i xx T 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 / (T 0.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 10 6, b= Usporedite grafički dvije funkcije tako da ih ucrtate u isti graf. Dodajte im labele i kazalo. Funkcije su: y 1 (t) = e -0.2t y 1 (t) = t e -0.2t t je u rasponu od 0 do t= Iskoristite izraz iz zadatka 6 te napišite funkciju rk() tako da joj je ulazna vrijednost v, a vraća P. 15

16 9. Iskoristite ode23() da bi riješili diferencijalnu jednadžbu u intervalu od t=0 do t=1.5: dx 1 /dt = -0.5 x x 2 2 dx 2 /dt = - x sa početnim vrijednostima x 1 (0) = 0.8 i x 2 (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. 16

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=[ ; ; ; ]; b=[3; 1; 1; 9]; (a) x=a\b (x je , , , ) (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') 17

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 Sljedeće snimite u ep2.m eps=1; count=0; while (1+eps) > 1 eps=eps/2; count=count+1; end eps=eps*2 count-1 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. 18