Professional Documents
Culture Documents
Uvod U MATLAB
Uvod U MATLAB
godine]
PRAKTIKUM
FIZIKA 2 UVOD U PROGRAMSKI PAKET MATLAB
1. MatLab okruenje
Radno okruenje programskog paketa MatLab sastoji se od tri radna prozora:
1. komandni prozor (Command Window),
2. prethodne komande (Command History) i
3. tekui folder/radni prostor (Current Directory/Workspace).
TEKUI FOLDER/
RADNI PROSTOR KOMANDNI PROZOR
PRETHODNE
KOMANDE
2. Definicija promenljivih
Za razliku od programskog jezika C, u Matlab-u nije neophodno prethodno deklarisati
promenljive i njihov tip, ve je potrebno samo uneti vrednosti promenljivih pre njihovog
pojavljivanja u naredbama. Promenljiva kojoj je dodeljena numerika vrednost moe se
upotrebljavati u matematikim izrazima, funkcijama i svim Matlab-ovim iskazima i komandama.
Prilikom definisanje imena promenljive treba imati u vidu da:
1. naziv moe da sadri karaktere: slova (a-z), cifre (0-9) i/ili donju crtu (_)
2. naziv mora poeti slovom
3. MatLab je case sensitive tj. razlikuje velika od malih slova
4. MatLab 6 pamti prvih 31 karaktera imena promenljive; MatLab 7 pamti prvih 63 karaktera
imena promenljive.
Primeri dobro definisanih promenljivih su:
>> brzina, naelektrisanje_elektrona, a1, A1, promenljiva1_pomocna.
Primeri loe definisanih promenljivih su:
>> naelektrisanje-elektrona, 1a, brzina!, _A1.
Primeri dodele vrednosti nekoj promenljivoj:
>> brzina = 100;
>> brzina = 100 + brzina*3;
Pojedine esto koriene promenljive automatski su definisane u MatLab-u. Meu njima su:
>> pi % broj .
>> eps % najmanja razlika izmeu dva broja koju MatLab moe da uoi iznosi 2-52
>> i % imaginarna jedinica. Alternativno se koristi karakter j.
>> NaN % skraenica od Not a Number. Upotrebljava se kad MatLab ne moe da
izrauna numeriku vrednost. Na primer, rezultat operacije 0/0 je NaN.
>> inf % oznaava beskonano veliku vrednost.
Imaginarna jedinica ima svoju rezervisanu oznaku i ili j, meutim to ne spreava korisnika
da ova slova koristi i u druge svrhe. Ukoliko je potrebno da se u istom kodu koristi i ili j i kao
imaginarna jedinica i kao proizvoljna promenljiva i ukoliko je i ili j ve iskorieno kao
imaginarna jedinica, tada je poeljno pre korienja ovih oznaka kao proizvoljnih promenljivih
ispisati naredbu
>> clear i; (ili clear j;)
koja oslobaa slovo i ili j za unos proizvoljne vrednosti i time spreava mogunost greke ukoliko
MatLab promenljivu i ili j shvati kao imaginarnu jedinicu.
3.1 Vektori
Kao to je ve prikazano, jedan od naina za formiranje vektora vrste je upisivanje
njegovih elemenata, razdvojenih razmakom ili zarezom, unutar uglastih zagrada. Sa druge strane, da
bi se napravio vektor kolona, potrebno je upisati levu uglastu zagradu [ i zatim elemente
razdvojene takom i zarezom, ili Enter posle svakog elementa. Nakon poslednjeg elementa, upisuje
se desna uglasta zagrada ]. Meutim, vektore je mogue generisati i na druge naine. Jedan od
naina zahteva definisanje vrednosti poetnog elementa, koraka i vrednosti poslednjeg elementa. Na
primer, vektor 2, 4, 6, 8, 10 sadri brojeve od 2 do 10, sa korakom 2. U MatLab programskom
paketu ovakav vektor generie se naredbom:
>> vektor = [2:2:10]; % vektor = [pocetni_element:korak:krajnji_element]
Korak ne mora imati pozitivnu vrednost. Ukoliko je korak negativan, generie se vektor iji
elementi imaju opadajue vrednosti, na primer: 10, 8, 6, 4, 2:
>> vektor = [10:-2:2];
Ukoliko prilikom pozivanja prethodnih komandi izostavi vrednost koraka, MatLab podrazumeva da
je korak = 1. Takoe, nije neophodno pisati uglaste zagrade, dozvoljeno je:
>> vektor = 2:2:10;
odnosno
>> vektor = 10:-2:2;
Vektor se moe generisati i pomou komande linspace koja zahteva definisanje poetnog
elementa, krajnjeg elementa i broja elemenata u vektoru, a MatLab sam odreuje vrednost
ekvidistantnog koraka. Na primer, ukoliko je potrebno definisati vektor koji sadri 5 elemenata,
poinje brojem 2, a zavrava se brojem 10, potrebno je izvriti komandu:
>> linspace(2,10,5); % linspace(pocetni_element,krajnji_element,broj_elemenata)
Transponovanje vektora postie se dodavanjem apostrofa nakon oznake vektora:
>> x = 1:5; % definisan je vektor vrsta
>> x'; % transponovanje vektora-vrste x u vektor-kolonu sa identinim elementima
3.2 Matrice
Dvodimenzionalna matrica tj. dvodimenzionalan niz sastoji se od elemenata rasporeenih u
vrste i kolone. Kao i prilikom definisanja vektora, matrica se moe definisati pozivanjem komande:
>> matrica = [1 2 3;4 5 6;7 8 9];
% matrica = [elementi_prve_vrste;elementi_druge_vrste;elementi_trece_vrste]
Ovako definisana matrica predstavlja kvadratnu matricu 3 3:
1 2 3
matrica = 4 5 6
7 8 9
Ugraene komande zeros(m,n), ones(m,n) i eye(n) generiu matrice iji elementi imaju
specijalne vrednosti. Komande zeros(m,n) i ones(m,n) generiu matrice sa m vrsta i n kolona, u
kojima su svi elementi nule odnosno jedinice, respektivno. Komanda eye(n) generie jedininu
kvadratnu matricu sa n vrsta i n kolona (elementi ove matrice koji se nalaze na glavnoj dijagonali
imaju vrednost jedan, dok ostali elementi imaju vrednost nula).
Operator transponovanja kod matrica pretvara njene vrste u kolone i obratno.
Odreenom elementu matrice pristupa se izvravanjem komande:
>> a = matrica(2,1); % a = matrica(redni_broj_vrste, redni_broj_kolone)
>> display(a);
5 10 15 20 25 30]
Matrice B, C, D, E i F koje sadre odreeni broj elemenata matrice A, definisane su komandama:
>> B = A(:,3)
B =
5
6
9
12
15
>> C = A(2,:)
C =
2 4 6 8 10 12
>> E = A(2:4,:)
E =
2 4 6 8 10 12
3 6 9 12 15 18
4 8 12 16 20 24
>> F = A(1:3,2:4)
F =
3 5 7
4 6 8
6 9 12
>> B = reshape(A,3,2)
B =
5 0
8 6
1 2
Ukoliko se neka skalarna vrednost (matrica 1 1) sabira ili oduzima sa nekim nizom, ta
skalarna vrednost se sabira odnosno oduzima sa svakim elementom niza.
Mnoenje nizova
Operacija mnoenja nizova (*) izvodi se u skladu sa pravilima linearne algebre. Kod
sabiranja tj. oduzimanja bilo je potrebno da nizovi budu istih dimenzija. Prilikom matrinog
mnoenja potrebno da broj kolona matrice A bude jednak broju vrsta matrice B. Proizvod ovih
matrica imae isti broj kolona kao matrica B i isti broj vrsta kao matrica A. Primera radi, ukoliko je
matrica A dimenzija m k, a matrica B dimenzija k n, mnoenje je mogue izvesti, jer matrica A
ima k kolona, a matrica B ima k vrsta. Proizvod ove dve matrice bie dimenzija m n. Sledi primer
mnoenja dve matrice dimenzija 4 3 i 3 2:
a11 a12 a13
b11 b12
a21 a22 a23
A= , B = b21 b22
a31 a32 a33
b31 b32
a41 a42 a43
>> B = [1 2 3]
B =
1 2 3
>> dot(A,B)
ans =
14
>> A = [1 2 3]
A =
1 2 3
2009 Katedra za Mikroelektroniku u tehiku fiziku, Elektrotehniki fakultet, Beograd
M.Krsti, J.Crnjanski: Uvod u MatLab 12
>> B = [1;2;3]
B =
1
2
3
>> dot(A,B)
ans =
14
Mnoenjem vektora kolone i vektora vrste sa po n elemenata dobija se kvadratna matrica n n:
>> A = [1;2;3]
A =
1
2
3
>> B = [1 2 3]
B =
1 2 3
>> A*B
ans =
1 2 3
2 4 6
3 6 9
Deljenje nizova
Kao i kod mnoenja, tako i kod deljenja vae pravila linearne algebre. U programskom
paketu MatLab postoje dve vrste deljenja: deljenje sa leva (\) i deljenje sa desna (/). Meutim, pre
objanjenja procedure deljenja nizova, bie uvedeni pojmovi jedinine matrice, inverzne operacije i
determinante.
Jedinina matrica je kvadratna matrica koja ima jedinice na glavnoj dijagonali i nule na
svim ostalim mestima. Ona se moe napraviti komandom eye(), kao to je ve pomenuto. Kada se
neka matrica ili vektor pomnoi jedinnom matricom, dobija se ta ista matrica ili vektor. Specijalno,
ako je matrica kvadratna, onda se ona moe pomnoiti jedininom matricom i sa leva i sa desna, tj.
u tom sluaju operacija mnoenja je komutativna.
Matrica B je inverzna matrica matrici A ako je proizvod te dve matrice jedinina matrica.
U MatLabu inverzna matrica dobija se stepenovanjem na -1 ili funkcijom inv(A). Inverzna matrica
postoji samo ako je matrica kvadratna i ako je njena determinanta razliita od nule.
4 2 6 x 8
2 8 2 y = 4 AX = B,
6 10 3 z 0
2009 Katedra za Mikroelektroniku u tehiku fiziku, Elektrotehniki fakultet, Beograd
M.Krsti, J.Crnjanski: Uvod u MatLab 14
4 2 6
x y z 2 8 10 = 8 4 0 XC = D.
6 2 3
4 5 6
7 8 9
>> M^2 % matricno kvadriranje
ans =
30 36 42
66 81 96
102 126 150
>> end
>> end
>> manji_od5
manji_od5 =
5
>> veci_od5
veci_od5 =
5
Ime svojstva i vrednost svojstva omoguavaju definisanje debljine linija, veliine markera,
boja ivica markera i boje kojom se markeri ispunjavaju. U tabeli je dat pregled svojstava:
Ime svojstva Opis Mogue vrednosti svojstva
LineWidth debljina linije broj (automatski 0.5)
MarkerSize veliina markera broj
MarkerEdgeColor boja ivice markera oznaka boje slovo
MarkerFaceColor popuna markera oznaka boje slovo
Primer korienja komande plot u punom obliku, ukoliko se za liniju grafika debljine 2 koristi
crvena boja, a markeri su veliine 12 i u obliku kruia, ispunjeni utom i oivieni zelenom bojom:
>> x = [1:1:10];
>> plot(x,sin(x),'-ro','LineWidth',2,...
'MarkerSize',12,'MarkerEdgeColor','g','MarkerFaceColor','y')
Naravno, kako je uzet jako veliki korak (svega deset taaka), grafiki prikaz funkcije sin(x) je
veoma neprecizan. Ukoliko postoji potreba da se istovremeno prikae vie grafikona, pre svake
naredbe plot, potrebno je otvoriti zaseban prozor za iscrtavanje grafika naredbom figure(n), gde
je n redni broj prozora:
>> x = [-2:0.01:4];
>> y = 3.5.^(-0.5*x).*cos(6*x);
>> figure(1)
>> plot(x,y,':g','LineWidth',2);
>> y2 = x.^2+4*sin(2*x)-1;
>> figure(2)
>> plot(x,y2,'--k','LineWidth',2);
Sa druge strane, ukoliko je potrebno da se u istom koordinatnom sistemu grafiki prikau dve
zavisnosti, umesto otvaranja novog prozora komandom figure(2) koristi se komanda hold all,
koja na postojeu sadrinu Figure prozora dodaje novu grafiku zavisnost:
>> x = [-2:0.01:4];
>> y = 3.5.^(-0.5*x).*cos(6*x);
>> figure(1)
>> plot(x,y,':g','LineWidth',2);
>> hold all;
>> y2 = x.^2+4*sin(2*x)-1;
>> plot(x,y2,'--k','LineWidth',2);
Konano, postoji mogunost da se u okviru istog Figure prozora prikae vie grafika sa nezavisnim
koordinatnim osama upotrebom komande subplot. Sintaksa komande
>> subplot(m,n,p)
deli prostor Figure prozora u tabelu koja se sastoji od m redova i n kolona. Brojem p definie se
odgovarajua pozicija na koju je potrebno da se smesti grafik. Slede primeri korienja komande
subplot:
Pol Poloaj
-1 Izvan granica osa, desna strana
0 Unutar granica osa, gde najmanje smeta
1 Gornji desni ugao
2 Gornji levi ugao
3 Donji levi ugao
4 Donji desni ugao
>> semilogy(x,y,'b','LineWidth',2);
>> xlabel('Linearna skala');
>> ylabel('Log skala');
>> grid on;
>> subplot(2,2,3);
>> semilogx(x,y,'b','LineWidth',2);
>> xlabel('Log skala');
>> ylabel('Linearna skala');
>> grid on;
>> subplot(2,2,4);
>> loglog(x,y,'b','LineWidth',2);
>> xlabel('Log skala');
>> ylabel('Log skala');
>> grid on;
Pored navedenih mogunosti, programski paket MatLab omoguava generisanje i nekih specijalnih
vrsta grafika: vertikalni trakasti grafikon, horizontalni trakasti grafikon, stepenasti grafikon,
grafikon diskretnih podataka, kruni dijagram, histogram... Detaljne informacije o ovim tipovima
grafika se mogu nai u MatLab Help-u.
5.5 Trodimenzionalni (3D) grafici
Generisanje 3D grafikona postie se komandama mesh i surf. Komanda mesh generie
trodimenzionalnu zavisnost u formi mree, dok naredba surf prikazuje trodimenzionalnu zavisnost
kao ispunjenu povrinu. Razlika izmeu ove dve komande se najlake moe uoiti na konkretnom
primeru:
>> [x,y] = meshgrid(-8:0.5:8);
>> r = sqrt(x.^2+y.^2)+eps;
>> z = sin(r)./r;
>> figure(1);mesh(z);
>> figure(2);surf(z);
6. Funkcije
Programski paket MatLab raspolae velikim brojem ugraenih funkcija kao to su exp(x),
sqrt(x), sin(x)... Meutim, MatLab omoguava i da korisnik samostalno definie funkciju,
generisanjem .m fajla u MatLab Editoru i snimanjem ovog fajla u obliku funkcijske datoteke.
Komandna linija koja definie funkciju ima oblik:
function [izlaz1, izlaz2, ...] = imefunkcije(ulaz1,ulaz2, ...)
Promenljive izlaz1, izlaz2,... su promenljive u koje se smeta rezultat funkcije, dok su ulazne
promenljive vrednosti za koje funkcija treba da obavi traenu operaciju. Imefunckije je
proizvoljno korisniko ime pod kojim funkcija mora da se zapamti. Kasnije, pod tim imenom
funkcija se poziva iz glavnog programa ili Komandnog prozora. Obratiti panju da posle definisanja
funkcije ne stavlja ; !!! Zarad preglednosti, funkcije e biti objanjene na konkretnom primeru.
Zadatak 3: Napraviti funkciju koja reava kvadratnu jednainu oblika:
ax 2 + bx + c = 0,
gde su a, b, c koeficijenti, a x promenljiva. Reenje kvadratne jednaine dato je izrazom:
b b 2 4ac
x1/ 2 = .
2a
Sledi kod funkcije koja reava zadati problem, a zatim i glavni program iz koga se
poziva generisana funkcija za odreene koeficijente a, b, c.
Funkcija kvadratna_jednacina:
function [x1 x2] = kvadratna_jednacina(a,b,c)
%izlazne promenljive su x1 i x2. Ime funckije je kvadratna_jednacina i
pod tim imenom se snima funkcija kao funkcijska datoteka tj. kao .m
fajl. Isto ime se kasnije koristi za pozivanje funkcije iz glavnog
programa. Ulazne promenljive su a, b, c koje predstavljaju
koeficijente jednacine
x1 = (-b + sqrt(b^2 - 4*a*c))/(2*a);
x2 = (-b - sqrt(b^2 - 4*a*c))/(2*a);
Nakon generisanja funkcije, potrebno pozivanjem File/Save As snimiti funkciju pod
imenom kvadratna_jednacina.
Glavni program:
clear all; close all
a = 5;b = 8;c = 12;
[resenje1 resenje2] = kvadratna_jednacina(a,b,c);
% Promenljiva resenje1 prihvata vrednost iz promenljive x1, a
promenljiva resenje2 vrednost iz promenljive x2. Nakon pokretanja
glavnog programa u Komandnom prozoru prikazuju se resenja:
>>resenje1
resenje1 =
-0.8000 + 1.3266i
>> resenje2
resenje2 =
-0.8000 - 1.3266i
7. Numerika diferencijacija
Prema definiciji, izvod funkcije f odreen je izrazom:
df f ( x + h) f ( x)
= lim .
dx h 0 h
Ukoliko je x vektor:
x = [x(1) x(2) ... x(n)]
onda komanda diff(x) daje vektor razlika dva susedna elementa vektora x:
diff(x) = [x(2)-x(1) x(3)-x(2) ... x(n)-n(n-1)].
Treba napomenuti da dobijeni vektor ima jedan element manje nego vektor x. Neka su dati vektori
x i y koji predstavljaju argumente i vrednosti funkcije y(x), respektivno. Izvod dy/dx se moe
odrediti pozivanjem komande:
>> diff(y)./diff(x);
8. Numerika integracija
Odreeni integral funkcije f(x) od a do b, predstavlja povrinu koju kriva zahvata sa
apcisom (x osom) u granicama [a,b]. U numerikoj matematici postoji vie algoritama tj. metoda
za izraunavanje odreenog integrala. MatLab nudi tri ugraene funkcije za izraunavanje
odreenog integrala: quad, quadl, trapz.
Komanda quad koristi Simpson-ovu metodu integraljenja i ima sledei oblik:
quad('funkcija',a,b) ili quad(@funkcija,a,b).
Komanda quadl koristi Lobatto-ovu metodu integraljenja. Ima identian oblik kao i
prethodna funkcija:
quadl('funkcija',a,b) ili quadl(@funkcija,a,b)
Komanda trapz se koristi za integraljenje funkcije zadate u obliku skupa taaka. Koristi
metodu trapeza. Oblik komande je:
trapz(x,y)
gde su x i y vektori x koordinata i y koordinata. Vektori moraju imati isti broj elementa.
( x exp ( 3x + 10 ) + 2 x + 10 ) dx .
0
Ovako napisanu funkcijsku datoteku potrebno je snimiti kao .m fajl pod imenom koje odgovara
imenu funkcije, u konkretnom sluaju bakterije.m. Osim toga, funkciju je uvek potrebno snimiti u
isti folder gde se nalazi i glavni program iz kog e ta funkcija biti pozvana.
Korak 3 - Odabir solvera
MatLab nudi vie ugraenih solvera za reavanje diferencijalnih jednaina. Svaki od njih
koristi neki drugi algoritam tj. neku drugu numeriku proceduru i pogodan je za odreeni tip
jednaina. U sledeoj tabeli dat je pregled ODE solvera i date su napomene kada se dati solver
primenjuje:
Solver Tip problema Preciznost Kada koristiti
Prvo probati ovaj solver (Runge-Kuta
ode45 Linearan Srednja
metoda - single step metoda)
Kada se ne trai velika preciznost
ode23 Linearan Niska
(Euler-ova metoda - single step)
Multistep metoda kada se trai
ode113 Linearan Visoka
visoka preciznost
ode15s Nelinearan Srednja Ako ode45 ne radi
Korak 4 - Pokretanje ODE solvera iz glavnog programa i podeavanje parametara ODE solvera
Komanda koja pokree izabrani solver i poziva funkciju definisanu u okviru funkcijske
datoteke ima oblik:
[t,x] = odgovarajuci_solver('ime funkcije',[interval_t],x0);
Odnosno, za sluaj konkretnog primera iz zadatka 6:
>> [t,N] = ode23('bakterije',[0 10],1000);
% promenljiva t prihvata vremensku osu, promenljiva N prihvata odgovarajuu
vremensku zavisnost reenja, odnosno broja bakterija.
% upotrebljen je solver ode23, koji poziva prethodno definisanu funkciju
bakterije
% vremenski interval u toku kog se posmatra dinamika sistema je definisan sa [0
10] s obzirom na to da se u zadatku trazi populacija bakterija nakon 10 sati, a
da je zadat pocetni uslov da je populacija u trenutku t = 0 bila 1000 jedinki
Ceo programski kod glavnog programa koji pokree ODE solver i prikazuje reenje jednaine
izgleda ovako:
>> clear all, close all
% definisanje pocetnog i krajnjeg trenutka vremena
>> tpoc = 0;tkraj = 10;
% definisanje vremenske ose sa rezolucijom od 100 tacaka
>> vreme = linspace(tpoc,tkraj,100);
>> N0 = 1000; % pocetni uslov N(0)= 1000
% pokretanje ode solvera.
>> [t,N]=ode23('bakterije',[tpoc tkraj],N0);
% Upotrebljen je ode23, zato sto je ovo problem koji numericki nije
zahtevan (sto potvrdjuje cinjenica da za ovaj problem postoji
analiticko resenje). Solver ode23 nema veliku preciznost ali daje
veoma dobre rezultate za resavanje jednacina koje cije resenje je
eksponencijalna funkcija. Osim toga ode23 nije vremenski zahtevan
solver pa se resenje dobija relativno brzo.
% prikaz rezultata
2.5 2.5
2 2
Populacija
Populacija
1.5 1.5
1 1
0.5 0.5
0 0
0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10
Vreme Vreme
Sledi jo jedan primer u okviru kog e biti prikazano reavanje neautonomne nelinearne
diferencijalne jednaine prvog reda.
x
Korak 1 Postavka problema:
U trenutku kada automobil udari u odbojnik, koji je na slici prikazan kao opruga, na
automobil deluje sila u smeru koji je suprotan od smera kretanja automobila i usporava
automobil do njegovog zaustavljanja. Na osnovu II Newton-ovog zakona:
ma = F
ma = Kv 3 (1 + x )
3
K 3
v (1 + x ) ,
3
a=
m
Kako se u zadatku trai grafik brzine u zavisnosti od preenog puta (koordinate x), a ne
vremena t, potrebno je izvriti smenu promenljivih u diferencijalnoj jednaini:
dv dv dv dx dv dx dv
a= = 1 = = = v.
dt dt dt dx dx dt dx
pa diferencijalna jednaina postaje:
dv K
= v 3 (1 + x )
3
v
dx m
dv K
= v 2 (1 + x )
3
dx m
Korak 2 Formiranje funkcijske datotetke:
function dvdx = odbojnik(x,v)
global k m
% komanda global definise da su k i m globalne promenljive. Ovim se
omogucava da se vrednost promenljivih definise u glavnom programu a da
se koriste i u ovoj funkcijskoj datoteci. Moguce je i definisati ove
promenljive diretno u samoj funkcijskoj datoteci tj. umesto komande
global k m definisati k = 30; m = 1500; ali se time smanjuje
fleksibilnost programa
dvdx = -k/m*v^2*(x+1)^3; % telo funkcije
Korak 3 i 4 Odabir solvera i glavni program:
>> global k m
>> k = 30; m = 1500; v0 = 90*1000/3600;
>> [x v] = ode45('odbojnik',[0:0.1:3],v0);
>> plot(x,v,'LineWidth',2);
>> title('Brzina u funkciji od pomeraja x');
>> xlabel('x [m]'); ylabel('Brzina [m/s]');
20
15
Brzina [m/s]
10
0
0 0.5 1 1.5 2 2.5 3
x [m]