M. Essert: Matlab interaktivno 1 MATLAB matrični laboratorij Interaktivni alat (kalkulator), programski jezik, grafički procesor Program = algoritam + strukture podataka TIPOVI PODATAKA temeljni tip - kompleksna matrica brojevi - double (s pretvorbama u integer-e (u)int8,16,32,64 ) nepopunjena matrica - sparse znak i niz znakova unutar jednostrukih navodnika - char, string ćelija - cell, polje različitih tipova struktura - struct, polje različitih tipova funkcijski tip - function handle @ (funkcija kao argument) objekti - Java i INLINE object. KONSTANTE I VARIJABLE pi - 3.141592... i,j - kompleksne veličine, sqrt(-1) eps - relativna točnost, najmanji iznos između dva realna broja inf, NaN - beskonačno (infinitum) i nije broj (not a number) realmax, realmin - najveći i najmanji realni broj bitmax - najveći cijeli broj (floating point) integer. ans - varijabla odgovora (ansver) ime_varijable - alfanumerički niz znakova, početni znak slovo, bez posebnih znakova, osjetljivost na velika i mala slova. Jednom definirana varijabla x može se ispisati jednostavnim pozivom imena x i tipke enter (return). FUNKCIJA Poziv: [iz1, iz2,...] = ime_funkcije (ul1, ul2,...) Definicija: Function [iz1, iz2,...] = ime_funkcije (ul1, ul2,...) gdje su: ul1, ul2,... - ulazni argumenti u funkciju iz1, iz2,... - izlazna rješenja funkcije (potprograma) ugrađene (bilt-in function) abs(), sin(), sqrt(), exp(),... ZAGRADE ( ) - grupiranje izraza, grupiranje funkcijskih argumenata, indeksiranje vektora (matrica) [ ] - grupiranje vektorskih (matričnih) elemenata { } - ćelije = polja različitih tipova podataka s klasičnim indeksiranjem
2 M. Essert: Matlab interaktivno RADNO OKRUŽENJE Command window radni prozor Workspace memorijski radni prostor (who varijable) Current directory trenutačni radni prostor Command history povijesni redoslijed naredbi File->New->M-file (CTRL+N) editor za m-datoteke ZNAKOVI NA NAREDBENOJ LINIJI >> - Matlabov upit korisniku, engl. prompt, - odvajanje naredbi ; - sprječavanje ispisa rezultata... - nastavak naredbe u idućoj liniji % - komentar (od znaka udesno) POČETAK RADA help - poziva pomoć help ops - pomoć o operatorima help format pomoć o formatima help elfun pomoć o elementarnim funkcijama... intro - uvod o Matlabu demo - demonstracija primjera lookfor - pretraživanje pojmova CTRL+C - prekid izvođenja diary - vođenje dnevnika rada quit - završetak rada OPERATORI Arithmetički operatori = - pridružba, assignment plus, uplus - plus, unarni plus + minus, uminus - minus, unarni minus - mtimes - matrično množenje * mldivide - matrično dijeljenje s lijeva \ mrdivide - matrično dijeljenje s desna / mpower - matrično potenciranje ^ Točka. - decimalna točka pristup polju strukture, npr. A(i).field Operatori nad elementima - upotreba Hadamard-ovog ('točka', engl. 'dot') operatora. power - potenciranje nad poljem.^ times - množenje elemenata u polju.* ldivide - lijevo dijeljenje u polju.\ rdivide - desno dijeljenje u polju./
M. Essert: Matlab interaktivno 3 C=A.*B znači C=A./B znači C=A.\B znači C=A.^B znači C=A.^r znači C=r.^A znači c(i,j)=a(i,j)b(i,j) c(i,j)=a(i,j)/b(i,j) c(i,j)=b(i,j)/a(i,j) c(i,j)=a(i,j)^{b(i,j)} c(i,j)=a(i,j)^r, r je broj. c(i,j)=r^{a(i,j)} Relacijski operatori eq - jednako == ne - nejednako ~= lt - manje nego < gt - veće nego > le - manje ili jednako <= ge - veće ili jednako >= Logički operatori logički I (AND) među izrazima && logički ILI (OR) među izrazima and - logički I (AND) elemenata & or - logički ILI (OR) elemenata not - logički NE (NOT) ~ xor - logički exclusivni ILI (XOR) any - Istina (True, 1) ako je bilo koji element vektora različit od nule all - Istina (True, 1) ako su svi elementi vektora različit od nule Operatori na razini bita bitand - I (AND) na razini bita. bitcmp - komplement bitova. bitor - ILI (OR) na razini bita. bitxor - EX-ILI (XOR) na razini bita. bitset - Postavi bit bitget - Provjeri bit. bitshift - Pomak (shift) bitova. Operatori skupova union - unija skupova. unique - jedincatost (unique) skupa. intersect - presjek (intersection) skupova. setdiff - razlika (difference) skupova. setxor - Ex-Ili (exclusive-or) skupova. ismember - Istina (True) ako član (member) skupa. STRING NIZ ZNAKOVA 'nesto' - niz znakova (nesto), string SISTEMSKI ZNAKOVI.. - prethodni directorij, roditeljski (parent) folder! - pozivanje sistemske naredbe
4 M. Essert: Matlab interaktivno ZNAKOVI S VEKTORIMA (MATRICAMA) horzcat - [a b], [a, b] nadoveza elemenata u retku. vertcat - [a; b] stupčana nadoveza elemenata. transpose -.' za transpoziciju vektora (matrice) ctranspose - ' kompleksno konjugirana transpozicija colon - : ili dvotočje, za raspon vrijednosti argumenata SLOŽENI PODACI Structures spline, solve, diff. i optimisation solvers, OOP; Cells varargin, vargout, text in graphics, switch-case; Polje struktura: ime(1...dim).polje_x ili struct('polje_x',{podaci}) Polje ćelija: Ime_polja_celija={elem 1, elem 2,..., elem n } Poziv: Ime_polja_celija{element/-i} Primjeri 1. a=[1 2 3] c=[4; 5; 6] a*c dot(a,c) b=a' A=c*a a*a a.*a b=a.^2 a.*b exp(a) log(ans) sqrt(a) format long sqrt(a) format 2^(-24) n=4; testmat(1).ime='hilbert'; testmat(1).mat=hilb(n); testmat(2).ime='pascal'; testmat(2).mat=pascal(n); testmat(1).mat testmat(2).ime Moja_celija={pi*n, magic(3); 'Mario radi', rand(5)} Moja_celija{4} Moja_celija{4}(2,1) Cellplot(Moja_celija) Moja_celija{2}(1,3) NEKE ELEMENTARNE MATEMATIČKE FUNKCIJE Trigonometrijske sin, sinh asin, asinh cos, cosh acos, acosh tan, tanh atan, atanh atan2 sec, sech asec, asech - sinus, hiperbolični sinus - inverzni sinus, inverzni hiperbolični sinus - kosinus, hiperbolični kosinus - inverzni kosinus, inverzni hiperb. kosinus - tangens, hiperbolični tangens - inverzni tangens, inverzni hiperb. tangens - inverzni tangens u četvrtom kvadrantu - sekans, hiperbolični sekans - inverzni sekans, inverzni hiperbolični sekans
M. Essert: Matlab interaktivno 5 csc, csch acsc, acsch cot, coth acot, acoth - sekans, hiperbolični sekans - inverzni kosekans, inverzni hiperb. kosekans - kotangens, hiperbolični kotangens - inverzni kotangens,inverzni hiperb. kotangens Eksponencijalne exp log log10 - eksponencijalna - prirodni logaritam. - obični (baza 10) logaritam log2 - logaritam po bazi 2 pow2 - potencija po bazi 2 realsqrt - kvadratni korijen broja >= 0 sqrt - kvadratni korijen Kompleksne abs angle complex conj imag real isreal - apsolutna vrijednost - fazni kut - Komplesni broj iz realnog i imaginarnog dijela - Konjugirani kompleksni broj - Imaginarni dio kompleksnog broja - realni dio kompleksnog broja - True (istina) za realna polja Zaokruživanje i ostatak fix - zaokruživanje prema nuli floor - zaokruživanje prema minus beskonačnom ceil - zaokruživanje prema plus beskonačnom round - zaokruživanje na najbliži cijeli broj mod - modulo funkcija (kao rezultat ostatka dijeljenja). rem - ostatak nakon dijeljenja sign - funkcija predznaka TVORBA VEKTORA a) Utipkavanje elemenata vektora unutar [] ili programsko generiranje s pomoću petlje (engl. loop). b) Tvorba s rubovima i razmakom {početak} : {korak} : {dočetak} ako je korak=1 može se pisati samo {početak} : {dočetak} Korak može biti i negativan, a ako je pritom 'početak' manji od 'dočetka' onda će generirani vektor biti prazan ([]). c) preko funkcija 'linspace()' i 'logspace()' U oba slučaja prva dva argumenta su početak i dočetak vektora (u drugom kao potencije broja 10), a treći je broj elemenata između njih. Razlika je što su prvi linearno, a drugi logaritamski udaljeni jedni od drugih.
6 M. Essert: Matlab interaktivno CRTANJE help plot PLOT Linear plot. PLOT(X,Y) crta vektor Y prema vektoru X. Različite tipovi linija, simbola i boja mogu se postići s naredbom PLOT(X,Y,S) gdje je S niz znakova (string) dobiven iz bilo kojeg od tri(ili svih) stupaca ispod: b plava. točka - čvrsto g zelena o kružić : točkasto r crvena x x-znak -. crt_točka c cyan + plus -- crtkano m magenta * zvijezda y žuta s kvadratić k crna d romb v trokut (dolje) ^ trokut (gore) < trokut (lijevo) > trokut (desno) p pentagram h hexagram Na primjer, PLOT(X,Y,'c+:') crta cyan točkastu liniju s + znakom na svakoj točki; PLOT(X,Y,'bd') crta rombove na svakoj točki podatka, ali ih ne povezuje linijom. PLOT(X1,Y1,S1,X2,Y2,S2,X3,Y3,S3,...) kombinira grafove definirane trojcima (X,Y,S), gdje su X i Y vektori ili matrice, a S su stringovi. Na primjer, PLOT(X,Y,'y-',X,Y,'go') crta podatke dvaput, s punom žutom linijom interpolirajući zelenim kružićima točke podataka. Uz Plot() obično se koriste i funkcije: title('tekst') dodaje tekst na vrh grafa. xlabel('tekst'), ylabel('tekst') dodaje tekst uz X-os ili Y-os. text(x,y,'string') dodaje string u navodnicima na (X,Y) poziciju. subplot(nmk) crta k-ti podgraf u (n x m) matrici grafova Primjeri 2. 2.1 x = linspace(0,1,11) ; y = sin(2*pi*x) ; plot(x,y) 2.2 x=logspace(.01,1,15); y=log(x); plot(x,y,x,y,'*')
M. Essert: Matlab interaktivno 7 2.3 %Generiranje signala sa 'šumom' (noise): x=0:.025:2; y=sin(pi*x); yn=y+.25*(rand(size(x)) -.5); plot(x,y,'--',x,yn) title(['crtkana linija: sin(pi*x),'... ' cvrsta linija: podaci sa šumom']) xlabel(['šum je slucajan iz [-1/8,1/8]']) 2.4 %Ubrzanje računanja preko odsječaka: m=5; n=4*m+1; x=linspace(0,1,n) ; % [x(1),x(2),... x(21)], x(j)-x(j-1)=.05 y=zeros(1,n); xf=x( 1:(2*m+1) ) ; % the values [0,.05,...,.5] y(1:(2*m+1))=sin(2*pi*xf); y( (2*m+2):n )= -y(2:(2*m+1)) ; % koristi se činjenica da je % sin(x+pi)=-sin(x) plot(x,y) Ključno je ovo: ako je J=[J(1),J(2),...,J(k)] vektor indeksa vektora x=[x(1),x(2),...,x(n)], onda je w=x(j) vektor w= [x(j(1)),...,x(j(k))]. TVORBA MATRICA 1. Mogu se utipkati elementi: npr. A=[2 4 5; 2 6 3; -l 6 2] što daje 3 x 3 matricu. Ulazni podaci se tipkaju u redu (elementi se odvajaju prazninom ili zarezom), a s točkom-zarez (;) deklarira se početak novog retka. S naredbom rand(n) ili rand(n,m) generira se matrica reda (n x n) odnosno (n x m) sa slučajnim elementima koji su raspršeni preko normalne razdiobe između 0 i 1. 2. Naredbe a=fix(10*rand(5)) b=round(10*rand(5)) generiraju 5x5 matrice s cjelobrojnim elementima. Ako su A = [d ij ] i B = [b ij ] (n x m) matrice i C = [c ij ] je (m x p) matrica, onda imamo sljedeće matrične aritmetičke operacije: (a) A + B = [a ij + b ij ] i A B = [a ij - b ij ] (b) A * C = D gdje je D (n x p) matrica s veličinama dobivenim matričnim množenjem. 3. Općenito za (n x m) matricu A vrijedi: (a) veličina (tj. broj redaka i stupaca) dobiva se kao [n,m]=size(a) (b) i-ti redak je A(i,:) (c) j-ti stupac je A(:,j) (d) podmatrica B sa i do j redaka i p do q stupaca je B=A(i:j,p:q)
8 M. Essert: Matlab interaktivno Primjeri 3. 3.1 A=[1 2 5 ; -2 1 4] B=[4 2 0 ; 4 2-7] C=[3 6 ; -2 1 ;-4 2] A+B A*C 3*A 3.2 A=[3 1;5 2] A^2, A^3 A^(-1), inv(a) A*A^(-1) C=A^(-2) C*A^2 3.3 A=[1 2; 3 4]; B=[1 2; 2 4] T1= A == B T2= A <= B T3= A > B T4= A <= 3 T5= A ~= B T1=[1 1; 0 1]; T2=[1 0; 0 0] T=T1 & T2 T=T1 T2 T=~T1 bitand(13,7) bitxor(13,7) 3.4 Inverz matrice Matrica ima inverz ako joj je determinanta različita od nule. A=[3 1; 5 2] d=det(a) Problem određivanja kada kvadratna matrica ima inverz nema lak odgovor. A=[3 1; 5 2] B=[3 1; 6 2] Matrica A nije singularna onda i samo onda kad vrijedi jedno od slijedećih zaključaka: (a) det A 0 det (A) det (B) (b) Reducirani 'row echelon' forma od A je identitet rref(a) rref(b) (c) A ima inverz inv(a) inv(b) (d) Jedino rješenje jednadžbe Ax = 0 je x = 0, tj., nul-prostor je nul-vektor. Matlab naredba "null" računa bazu za nul-prostor. Primjetite da ona ne ispisuje nul-vektor. null(a) null(b) (e) Matrica A ima puni rang. Ako je A reda (n x n) onda je rang od A jednak n. rank(a) rank(b) Neke matrične funkcije size( ) - veličina matrice, broj redaka i stupaca ' - transpozicija matrice diag() - dijagonalna matrica eye() - jedinična (identity) matrica zeros() - nul matrica sparse(i,j,v) - sparse matrica, na (i,j) mjestu v-ti element
M. Essert: Matlab interaktivno 9 Polinomi kao matrice roots - nalazi korijen polinioma poly - pretvara korijen u polinom Primjeri 4. A=[5 7 9; 1-3, -7] B=[-1,2,5;9 0 5] C=[0,1;3,-2;4,2] D=[1:5; 6:10; 11:2:20] size(a) size(ans) [r c]=size(a'), S=size(A') D, D' size(d), size(d') P=ones(2,3) Z=zeros(2,3), zeros(size(p')) S=[2-1 0; -1 2-1; 0-1 2] St=S' S-St I=eye(3), x=[8; -4; 1], I*x D=[-3 0 0; 0 4 0; 0 0 2] diag(d) d=[-3 4-2], D=diag(d) F=[0 1 8 7; 3-2 -4-2; 4 2 1 1] diag(f) x=[8; -4; 1] G=[C x] A, B, H=[A;B] J=[1:4; 5:8; 9:12; 20 0 5 4] K=[diag(1:4) J; J' zeros(4,4)] spy(k),grid J(1,1), J(2,3), J(4,5) J(4,1)=J(1,1)+6 J(1,1)=J(1+1)-3*J(1,2) J(:,3) J(:,2:3) J(4,:) J(2:3,2:3) A,B,A.*B A.*C A.*C' i=[1,3,5]; j=[2,3,4]; v=[10 11 12] S=sparse(i,j,v) T=full(S) roots([1-3 2]) poly(ans) KONTROLNE STRUKTURE PROGRAMIRANJA INPUT naredba: x=input('neki tekst') dozvoljava interaktivan unos za x varijablu u izvođenju programa. Na zaslonu se pritom ispisuje neki tekst. x=input('neki tekst',s) sprema uneseni tekst kao string u varijablu x. IF kontrolna struktura odgovara na pitanje ako onda inače: if {relacija} {naredbe} ili još općenitije: if {relacija} {naredbe} elseif { relacija } { naredbe } else { naredbe }
10 M. Essert: Matlab interaktivno SWITCH struktura izabire vrijednost između više ponuđenih izraza. switch {izraz} case {slučaj_1}, naredba,..., naredba case {slučaj2, slučaj3,...} naredba,..., naredba... otherwise, naredba,..., naredba Izraz može biti skalar ili string. Postoji dva tipa petlji: (a) for petlja. Sintaksa je for {varijabla} = {vektor vrijednosti brojila} {naredba/-e} (b) while petlja odgovara na pitanje 'sve dok je istina čini': while {relacije} {naredbe} Programske funkcije: break - završava izvođenje for ili while petlje continue - prebacuje kontrolu na iduću iteraciju petlje try - početak TRY bloka catch - početak CATCH bloka eval - izvršava string s MATLAB izrazom. feval - izračunava funkciju specificiranu stringom run - izvršava script-a function global return nargin nargout varargin varargout disp fprintf sprintf pause error warning - dodaje novu (korisničku) funkciju - definira globalne varijable - povratak iz pozvane funkcije - broj ulaznih argumenata funkcije - broj izlaznih argumenata funkcije - lista promjenljive duljine ulaznih argumenata - lista promjenljive duljine izlaznih argumenata - ispis polja (obično stringa) - ispis formatirane poruke - ispis formatirane poruke u string - čekanje na korisnikov odziv (pauza) - ispis pogreške poruke ili prekidne funkcije - prikaz poruke upozorenjawarning message
M. Essert: Matlab interaktivno 11 Primjeri 5. 5.1 for i=1:3 x(i)=i^2 5.2 for i=1:5 for j=1:5 a(i,j)=1/(i+j) aa=hilb (5) 5.3 n=4 clear A for i=1:n for j=1:n if i < j A(i,j)=-1; elseif i > j A(i,j)=0; else A(i,j)=1; A AA=eye(n)-triu(ones(n),1) 5.4 j=1 while j <= 10 k(j)=cos(j*pi); j=j+1; k % usporedi sa: kk=cos((1:10)*pi) 5.5 x=(1:5)*2*pi; sprintf(' %5.3f',x) x=(1:5)*2*pi; sprintf(' %5.3f\n',x) 5.6 n=input(' unesi cijeli broj n = '); v=(1:2:n).^2 5.7 % Naći najmanji pozitivni % cijeli broj q za koji % vrijedi 2 -q = 0: x=1; q=0; while x>0 x=x/2; q=q+1; q 5.8 % Naći najmanji cijeli broj p % tako daje 1 + 2 -p = 1 % u aritmetici s pomičnim % zarezom: x=1; p=0; y=1; z=x+y; while x~=z y=y/2; p=p+1; z=x+y; p 2*y eps Primjetite da 2*y daje najmanji realni broj različit od nule u Matlab-u, tj. eps. 5.9 method = 'bilinear'; switch lower(method) case {'linear','bilinear'} disp('method is linear') case 'cubic' disp('method is cubic') case 'nearest' disp('method is nearest') otherwise disp('unknown method.')
12 M. Essert: Matlab programski 5.10 %Formatirani ispis dobiva se upotrebom sprintf funkcije: disp('n sum(1:n) n*(n+1)/2 ') disp('------------------------------') for n=1:10 disp(sprintf(' %3.0f %5.0f %5.0f'...,n,sum(1:n),n*(n+1)/2)); 5.11 % Script file SineTable.m % % Ispisuje kratku tablicu proračuna sinusa. % n = 21; x = linspace(0,1,n); y = sin(2*pi*x); disp(' ') disp(' k x(k) sin(x(k))') disp('------------------------') for k=1:21 degrees = (k-1)*360/(n-1); disp(sprintf(' %2.0f %3.0f %6.3f'...,k,degrees,y(k))); disp( ' '); disp('x(k) je dan u stupnjevima.') disp(sprintf('jedan stupanj = %5.3e radijana',pi/180)) 5.12 % Script File Zoom % % Nacrtajte (x-1)^6 uz točku x=1 sa % slijedno povećanom skalom. % Izračunavanje (x-1)^6 preko % x^6-6x^5 + 15x^4-20x^3 + 15x^2-6x +1 % dovodi do ozbiljnih promišljanja. close all k=0; for delta = [.1.01.008.007.005.003 ] x = linspace(1-delta,1+delta,100)'; y = x.^6-6*x.^5 + 15*x.^4-20*x.^3... + 15*x.^2-6*x + ones(100,1); k=k+1; subplot(2,3,k) plot(x,y,x,zeros(1,100)) axis([1-delta 1+delta -max(abs(y)) max(abs(y))])
M. Essert: Matlab programski 13 SCRIPTA 6.1 ime1.m h=input('korak h= '); x=0:h:2; y=x.^2 2*x+1; y1=sin(x); plot(x,y,'r-.',x,y1,'g:<') 6.2 ime2.m h=input('korak h= '); x=0:h:pi; y=cos(x).*(x<=pi/2)+(-x+pi/2).*(x>pi/2); plot(x,y) 6.3 epicikloida.m a=12; b=5; t=0:0.005:10*pi; x=(a+b)*cos(t)-b*cos((a/b+1)*t); y=(a+b)*sin(t)-b*sin((a/b+1)*t); plot(x,y) axis equal axis ([-25 25-25 25]) grid on title('epicikloida: a=12, b=5') xlabel('x(t)'), ylabel('y(t)') 6.4 % ovo je test m-datoteka nazvana test.m h=input('mesh size h = '); x=(0:h:1); lx=length(x); y=x.^2; int=(h/2)*(y(1)+2*sum(y(2:(lx-1)))+y(lx) ) % trapezno pravilo za integral s egzaktnom vrijednošću 1/3 Računalna matematika, FSB Zagreb, 2008.
14 M. Essert: Matlab programski INLINE FUNKCIJA 6.5 f=inline('exp(x)-1'),f(2) f=inline('log(a*x)/(1+y^2)') f=inline('log(a*x)/(1+y^2)','x','y','a') 6.6 fd_deriv.m function y=fd_deriv(f,x,h) %FD_DERIV Aproksimacija derivacije if nargin < 3, h=sqrt(eps); y=(feval(f,x+h) -feval(f,x))/h; fd_deriv(@sqrt,0.1) f=inline('exp(-x)/(1+x^2)'); fd_deriv(f,pi) M-FUNKCIJE FUNCTION dodaje novu funkciju. Nove funkcije sadržavaju stare, a spremaju se u datoteku s imenom istim kao ime funkcije, uz ekstenziju '.m'. Početak datoteke je sintaktički čvrsto određen. Komentar poslije funkcijske definicije koristi se u help-u. Primjer: function [mean,stdev] = stat(x) %STAT Interesting statistics. n = length(x); mean = sum(x) / n; stdev = sqrt(sum((x - mean).^2)/n); Podfunkcija (subfunction) koja je vidljiva drugim funkcijama unutar iste datoteke definira se nakon već napisane funkcije. function [mean,stdev] = stat(x) %STAT Interesting statistics. n = length(x); mean = avg(x,n); stdev = sqrt(sum((x-avg(x,n)).^2)/n); %------------------------- function mean = avg(x,n) %MEAN subfunction mean = sum(x)/n; Podfunkcije nisu vidljive izvan datoteke u kojoj su definirane.
M. Essert: Matlab programski 15 6.7 maxentry.m function y=maxentry(a) %MAXENTRY Nalazi najveci broj u matrici A y=max(max(abs(a))); maxentry([1 2; 11-4; 8 2]) 6.8 area.m function [A]=area(a,b,c) %Izračunava površinu trokuta koji ima stranice % dužine a, b i c % Inputs: % a, b,c duljine stranica % Output: % A površina trokuta % Usage: % Pov = area(2,3,4) % Napisao M.M., FSB Zagreb, 05.03.2003. s = (a+b+c)/2; A=sqrt(s*(s-a)*(s-b)*(s-c)); 6.9 flogist.m function [f,fprime]=flogist(x,a) %FLOGIST logističa funkcija i njena derivacija f= x.* (1-a*x); fprime=1-2*a*x; f=flogist(2,.1) [f,fprime]=flogist(2,.1) flogist(1:4,2) 6.10 comfun.m function comfun(x,y,z) %COMFUN prikaz funkcije s tri string argumenta disp(x), disp(y) disp(z) comfun('ab','ac','ad') comfun ab cd eg disp('hello'), disp hello diary ('moja.txt'), diary moja.txt sqrt 2 % sto nam daje???? Računalna matematika, FSB Zagreb, 2008.
16 M. Essert: Matlab programski 6.11 marks.m function [x_sort, x_mean, x_med, x_std]=marks(x) % MARKS statistička analiza vektora x_sort=sort(x); if nargout>1, x_mean=mean(x); if nargout>2, x_med=median(x); if nargout>3, x_std=std(x); marks([12 3 4 5-4 5]) [a,b]=marks([12 3 4 5-4 5]) [a,b,c]=marks([12 3 4 5-4 5]) [a,b,c,d]=marks([12 3 4 5-4 5]) 6.12 defn.m function z=defn(x,y) z=-x*y; moja5-16.m clear % ovaj program poziva funkciju de_fn.m a=input('lijeva krajnja točka a = '); b=input('desna krajnja točka b = '); N=input(' broj podintervala, N = '); ya=input('početna vrijednost u x=a, ya= '); h=(b-a)/n; x=a+h*(1:(n+1)); lx=length(x); y(1)=ya; for j=1:n y(j+1)=y(j)+h*defn(x(j),y(j)); plot(x,y) 6.13 function [x,iter]=sqrt_newton(a,tol) % SQRT_NEWTON - traženje kvadratnog korijena Newtonovom metodom % X=SQRT_NEWTON(A,TOL) vraća X kao rješenje korijena koji je >= 0 % TOL je tolerancija konvergencije (pretpostavljena je EPS) % [X, ITER]=SQRT_NEWTON(A,TOL) vraća također i broj iteracija ITER if nargin < 2, tol=eps; x=a; iter=0; xdiff=inf; fprintf(' k x_k rel_promjena\n') while xdiff>tol iter=iter+1; xold=x; x=(x+a/x)/2;
M. Essert: Matlab programski 17 xdiff=abs(x-xold)/abs(x); fprintf('%2.0f: %20.16e %9.2e\n',iter,x,xdiff) if iter>50 error('ne konvergira nakon 50 iteracija!') REKURZIVNE FUNKCIJE 6.14 function koch(pl,pr,level) %KOCH Recursively generated Koch curve. % KOCH(PL, PR, LEVEL) recursively generates a Koch curve, % where PL and PR are the current left and right points % and LEVEL is the level of recursion if level==0 plot([pl(1),pr(1)], [pl(2),pr(2)]); %Join pl and pr hold on else A=(sqrt(3)/6)*[0 1; -1 0]; % Rotate/scale matrix pmidl=(2*pl + pr)/3; koch(pl,pmidl,level-1) % Left branch ptop=(pl + pr)/2 + A*(pl-pr); koch(pmidl,ptop,level-1) pmidr=(pl + 2*pr)/3; koch(ptop,pmidr,level-1) koch(pmidr, pr, level-1) % Left mid branch % Right mid branch % Right branch a) pl=[0;0]; pr=[1;0]; for k=1:4 subplot(2,2,k) koch(pl,pr,k) axis('equal') title(['koch curve: level = ', num2str(k)], 'FontSize',16) b) level=4; edges=7; for k=1:edges pl=[cos(2*k*pi/edges); sin(2*k*pi/edges)]; pr=[cos(2*(k+1)*pi/edges); sin(2*(k+1)*pi/edges)]; koch(pl,pr,level) axis('equal') title('koch snowflake','fontsize',16,'fontangle','italic') Računalna matematika, FSB Zagreb, 2008.
18 M. Essert: Matlab programski Fibonacci sequence 6.15 a) function f = Fib1(n) % Returns the nth number in the % Fibonacci sequence. F=zeros(1,n+1); F(2) = 1; for i = 3:n+1 F(i) = F(i-1) + F(i-2); f = F(n); b) function f = Fib2(n) % Returns the nth number in the % Fibonacci sequence. if n==1 f = 0; elseif n==2 f = 1; else f1 = 0; f2 = 1; for i = 2:n-1 f = f1 + f2; f1=f2; f2 = f; c) function f = Fib3(n) % Returns the nth number in the % Fibonacci sequence. if n==1 f = 0; elseif n==2 f = 1; else f = Fib3(n-1) + Fib3(n-2); d) function f = Fib4(n) % Returns the nth number in the % Fibonacci sequence. A = [0 1;1 1]; y = A^n*[1;0]; f=y(1);
M. Essert: Matlab programski 19 FUNKCIJE S VARIJABILNIM BROJEM ARGUMENATA 6.16 Moments.m function varargout=moments(x) %MOMENTS Moments of a vector. % [m1,m2,...,m_k]=moments(x) returns the first, second,..., % k'th moments of the vector X, where the j'th moment % is SUM(X.^j)/LENGTH(X). for j=1:nargout, varargout(j)={sum(x.^j)/length(x)}; >> m1=moments(1:4) m1 = 2.5000 >> [m1,m2,m3]=moments(1:4) 6.17 companb.m function C=companb(varargin) %COMPANB Block companion matrix % C=COMPANB(A_1,A_2,...,A_m) is the block companion matrix % corresponeding to the n-by-n matrices A_1,A_2,...,A_m. m=nargin; n=length(varargin{1}); C=diag(ones(n*(m-1),1),-n); for j=1:m Aj=varargin{j}; C(1:n,(j-1)*n+1:j*n)= -Aj; >> X=ones(2); C=companb(X,2*X,3*X) C = -1-1 -2-2 -3-3 -1-1 -2-2 -3-3 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 Računalna matematika, FSB Zagreb, 2008.
20 M. Essert: Matlab programski POLINOMI 6.18 Legeandre-ovi polinomi zadani su rekurzivnom jednadžbom: (n+1)p (n+1) (x)=(2n+1)xp n (x) np n-1 (x), P 0 =0; Nacrtajte prva četiri Legeandrova polinoma. Legre.m x=-1:.01:1; p1=x; p2=(3/2)*x.^2-1/2; p3=(5/2)*x.^3-(3/2)*x; p4=(35/8)*x.^4-(15/4)*x.^2+3/8; plot(x,p1,'r:',x,p2,'g--',x,p3,'b-.',x,p4,'m-') box off leg('\itn=1','n=2','n=3','n=4',4) xlabel('x','fontsize',12,'fontangle','italic') ylabel('p_n','fontsize',12,'fontangle','italic') title('legre Polynomials','FontSize',14) text(-.6,.7,'(n+1)p_{n+1}(x)=(2n+1)x P_n(x) - n P_{n-1}(x)',... 'FontSize',12,'FontAngle','Italic') Primjetite: leg-a se može pozicionirati uz pomoć zadnjeg argumenta: -1: nadesno od crteža, 0: automatski (na 'najboljoj' poziciji), 1: gore desno (pretpostavljena vrijednost), 2: gore lijevo; 3: dolje lijevo, 4: dolje desno. Polinom n-tog reda: y=p(x)= a 1 x n + a 2 x n-1 +... + a n x 1 + a n+1 uz poznate koeficijente [a 1 a 2... a n a n1 ] za poznatu vrijednost x može se izračunati direktno po gornjoj formuli: poli.m y=0; n=length(a)-1; for k = 1:n + 1 y = y + a(k)*x.^(n-k+1) >> a=[2-7 -2]; x=3; dok za više vrijednosti, područje vrijednosti x-a, program se samo proširuje vektorom y vrijednosti: polinom.m n = length(a)-1; nx = length(x); y = zeros(1,nx); for k = 1:n + 1 y = y + a(k)*x.^(n-k+1) >> a=[2-7 -2]; x=[3:.2:10];
M. Essert: Matlab programski 21 Isto se može načiniti i s pomoću funkcije polyval. >> help polyfun polyval polyfit polyder polyint conv deconv spline - izračunava polinom - traži koeficijente polinoma koji predstavlja podatke - derivira polinom - integrira polinom analitički - množi polinome - dijeli polinome - interpolira kubični spline % korijeni (nule) polinoma P = [1-12 0 25 116]; %polinom roots(p) ans = 11.7473 2.7028-1.2251 + 1.4672i -1.2251-1.4672i r = ans; PP = poly(r) PP = 1.0000-12.0000-0.0000 25.0000 116.0000 % množenje polinoma a = [1 2 3 4]; b = [4 9 16]; c = conv(a,b) c = 4 17 46 75 84 64 % vrijednost polinoma u točki(-ama) polyval(a, 2) ans = 26 polyval(a, [2 13-6 19]) Fitting Zadano je m-točaka: { X i, Y i } m I=1 Treba naći polinom p stupnja n tako da je p(x i ) priblžno jednako y i za sve i=1:m. To se postiže funkcijom polyfit koja za zadani red polinoma n daje koeficijente polinoma p tako da je suma od i=1:m za kvadrat razlike odsupanja (p(x i )-y i ) 2 minimalna. x = [1 3 7 21]; %fitting y = [2 9 20 55]; polyfit(x,y,2) ans = -0.0251 3.1860-0.8502 Nađite polinom trećeg reda koji u 20 točaka u intervalu [-2,2] po metodi najmanjih kvadrata aproksimira funkciju f(x)=1/(x+(1-x)^2). x=linspace(-2,2,20); Računalna matematika, FSB Zagreb, 2008.
22 M. Essert: Matlab programski y=1./(x+(1-x).^2); p=polyfit(x,y,3); plot(x,y,'*',x,polyval(p,x),' '); Objasnite dobivene koeficijente polinoma p: -0.1170-0.2067 0.4599 0.9426 Nađite egzaktnu interpolacija zadanih podataka preko spline funkcije. x=linspace(-2,2,20); y=1./(x+(1-x).^2); xx=linspace(-2,2,60); yy=spline(x,y,xx); plot(x,y,'*',xx,yy,' ') 6.19 polifit.m p=[1 6 11 6]; x=0:.25:4; y=polyval(p,x)+randn(1,length(x)); plot(x,y, * ), Title( Ulazni podaci ), pause while 1 n=input( Red polinoma n= ); if n<=0, break, c=polyfit(x,y,n) fit=polyval(c,x) plot(x,fit,x,y, o ), pause 6.20 inter.m xd = 1 : 4; yd = [0 1 0 2]; x = 1 : 0.1 : 4; y = polyval(polyfit(xd,yd,length(xd)-1),x); plot(x,y,xd,yd,'o')