38
Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru controlul derulării unui program 4.1 . if - end, if – else - end, if - elseif else - end, if – elseif - end - execută un grup de instrucţiuni pe baza unei condiţii logice. Instrucţiunea condiţională if ... if expresie_logica grup de instructiuni end ... i=2.0; j=input('j= '); if i+j>0 fprintf('(i+j)^2=%7.2f\n', (i+j)^2 ); end Instrucţiunea if - else - end (clauza else) ... if expresie_logica grup1 de instructiuni else grup2 de instructiuni end ... Se citeşte o matrice şi este testat un element X=input('matricea X='); i=input('linia='); j=input('coloana='); if X(i,j)>0 fprintf('X(%d,%d)=%6.2f este numar pozitiv\n',i,j,X(i,j)); else fprintf('X(i,j)=%6.2f este negativ sau zero\n', X(i,j)); end Se citesc 2 şiruri de caractere si se compară lungimile sir1=input('sir1= ','s'); sir2=input('sir2= ','s'); if length(sir1) > length(sir2) fprintf('sir1: %s are mai multe caractere\n',sir1); else 'sir2 are car. mai multe sau este egal cu sir1' fprintf('Ultimul car. din sir2 este: %s\n', sir2(end)); end

Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

  • Upload
    others

  • View
    24

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

1

PROGRAMARE MATLAB

Prof.dr.ing. Iulian Lupea

CURS 3

4. INSTRUCŢIUNI pentru controlul derulării unui program 4.1 . if - end, if – else - end, if - elseif – else - end, if – elseif - end - execută un grup de instrucţiuni pe baza unei condiţii logice.

Instrucţiunea condiţională if ... if expresie_logica grup de instructiuni end ...

i=2.0; j=input('j= '); if i+j>0 fprintf('(i+j)^2=%7.2f\n', (i+j)^2 ); end

Instrucţiunea if - else - end (clauza else) ... if expresie_logica grup1 de instructiuni else grup2 de instructiuni end ...

Se citeşte o matrice şi este testat un element X=input('matricea X='); i=input('linia='); j=input('coloana='); if X(i,j)>0 fprintf('X(%d,%d)=%6.2f este numar pozitiv\n',i,j,X(i,j)); else fprintf('X(i,j)=%6.2f este negativ sau zero\n', X(i,j)); end

Se citesc 2 şiruri de caractere si se compară lungimile sir1=input('sir1= ','s'); sir2=input('sir2= ','s');

if length(sir1) > length(sir2) fprintf('sir1: %s are mai multe caractere\n',sir1); else 'sir2 are car. mai multe sau este egal cu sir1' fprintf('Ultimul car. din sir2 este: %s\n', sir2(end)); end

Page 2: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

2

Instrucţiunea if - elseif - else - end (clauza elseif) a=input('a='); b=input('b='); % compara 2 val. numerice => 3 cazuri if a>b disp('a>b') elseif a<b disp('a<b'); else %a==b disp('valori numerice egale') end

MATLAB apelează implicit funcţia display după orice expresie executată şi neurmată de ;

% n este pozitiv, par sau impar n=input('n= '); if n <= 0 %Daca n este negativ sau zero afiseaza un mesaj de eroare. disp('valoarea furnizata trebuie sa fie pozitiva'); elseif rem(n,2)==0 %Daca n este pozitiv si par, imparte n la 2 si afiseaza. % remainder (~= reminder) A1 = n/2; disp('n par si pozitiv'); else %Daca n este pozitiv si impar imparte la 2 si afiseaza A2 = n/2; disp('n impar si pozitiv'); end % a aparţine itervalelor: … -20… -10… 0… 10 a=input('a= '); %carui interval apartine a? if a<-20 disp('a<-20') % afiseaza tablou caractere elseif a<-10 disp('-20 <= a <-10') elseif a<0 disp('-10 <= a <0') elseif a<10 disp( '0<=a<10') else disp('a>=10') end

% else poate lipsi după elseif poate să nu mai existe clauza else %test valoare a(2) a=input('dati valori vector a='); if a(2)<-5 | a(2)>5 disp(‘a(2)<-5 sau a(2)>5') elseif a(2)<0 disp('a(2)apartine [-5 0)’) end % pt. a(2) intre [0 si 5] nu se afiseaza mesaj

Instrucţiunea switch - case … otherwise

Page 3: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

3

switch expresie %scalar sau sir de caractere/string case valoare_1 grup #1 instructiuni % se execută dacă: % expresie == valoare_1 =>true case valoare_2 grup #2 instructiuni % se execută dacă: %expresie == valoare_2 =>true ...... case valoare_n grup n instructiuni otherwise grup #n+1 instructiuni % se execută dacă expresie nu egalează nici un caz end

% switch poate rezolva mai multe condiţii într-un % singur caz prin folosirea acoladelor { } (cell array). var=input('var= '); switch var+1-1 % expresie case 1 disp('1'); case {2,3,4} %cell array disp('var este 2 sau 3 sau 4'); case 7 disp('7') otherwise disp('altã valoare'); end var1=input('var1=') switch var1 case -1 clc, 'clear commands' case 0 clear, 'sterg workspace' case 1 x=input('x='); exp(x) otherwise % traseaza poligon cu laturi egale şi varfuri pe cerc de rază unitară % sunt folosite numere complexe pas=input('.1<pas<.5, pas=') plot( exp(i*(-pi:pas:pi)), '-*'); end % selectare caz prin tablou caractere

sircar = input('Tastati o culoare: ','s'); % descriptor s pentru citire sir car. switch sircar % valoarea citita este tablou de caractere case 'rosu' disp('ati tastat rosu'); case 'galben' fprintf('ati tastat %s\n', sircar); case {'albastru','violet'} % cell array { } disp('ati tastat albastru sau violet'); otherwise disp('ati tastat altceva decat rosu, galben, albastru, violet'); fprintf('sir %s,primul car:%s, ultimul: %s, total: %2.0f \n', ... sircar(:), sircar(1), sircar(end), length(sircar)) end

Page 4: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

4

Spre deosebire de limbajul C, daca un caz este adevărat şi acesta se execută, se sare după end fără a folosi instrucţiune break. In C se execută implicit şi cazurile următoare (daca nu există instrucţiunea break). 4.3. Instrucţiunea de ciclare For

- Execută o instrucţiune sau un grup de instrucţiuni de un număr cunoscut dinainte de ori:

for index = start:increment:end grup de instructiuni end

x=3:8; %sau x=[3 4 5 6 7 8]; suma=0; %initializam variabila suma for i=1:length(x) suma=suma + x(i); end

suma % se afiseaza 33 % acelaşi rezultat cu: sum(3:8), sum([3:8]) sau sum(x)

x(1)= input('Dati prima valoare '); % fie x(1)=20

for n = 2 : 11 x(n) = 2 * x(n - 1); %se adaugă valori in vect. x(i) end

Rezulta valorile: 20 40 80 160 320 640 1280 2560 5120 10240 20480 20-40 este prima octavă audibilă, 10000-20000 ultima octavă

% pas=2 for k=1:2:n . . . end

n=100; % increment <0 for k=n:-1:1 . . .

end Indexul ia valorile dintr-un tablou 1D sum=0; for i=[1 -1 3 -3 10 -6] % i ia pe rând valorile din tablou sum=sum+i; end sum

Ciclul For cu indexul asociat unei matrice 2D sum=0; for i=[1 2 3; 4 5 6] sum=sum+i; end sum fprintf('sum(1)=%f sum(2)=%f\n', sum(1), sum(2)); ... sum = 6 % 1+2+3 linia 1 15 % 4+5+6 linia 2 sum(1)=6.000000 sum(2)=15.000000

Variabila i va fi o matrice coloana şi va lua succesiv valorile: [1;4], [2;5] şi [3;6] Variabila sum este matrice coloană şi va lua succesiv valorile: [1;4], [3;9] şi [6;15]

Page 5: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

5

Se calculează valorile funcţiei 7x^2+x+1 pentru 2 seturi de abscise: -7:.1:-6 linia#1 din x şi 6: 2:26 linia#2 din x

k=1; for x=[-7:.1:-6; 6:2:26] %length(-7:.1:-6) == length(6:2:26) =>1 y(:,k)=7*x.^2+x+1; % coloana k primeste valori k=k+1; end y plot(-7:.1:-6, y(1,:) , '-*'); pause(3); plot(6:2:26, y(2,:) , '-*')

Comparaţie sin(x) şi x - Relaţia lui Euler

i=sqrt(-1); %valoarea implicita a lui i, % Relaţia lui Euler: e^(ix) = cos(x) + i*sin(x)

for x=0: pi/30 : 2*pi %pas real de 6 grade fprintf('x=%6.4f sin(x)=%7.4f %g+ %gi\n', x, sin(x), real(exp(i*x)), imag(exp(i*x)) ); end ... programul afişează: x=0.0000 sin(x)= 0.0000 1+ 0i x=0.1047 sin(x)= 0.1045 0.994522+ 0.104528i x=0.2094 sin(x)= 0.2079 0.978148+ 0.207912i % Observăm: x ≈ sin(x) pentru x=mic x=0.3142 sin(x)= 0.3090 0.951057+ 0.309017i % pi/180 rad; pi/36 rad x=0.4189 sin(x)= 0.4067 0.913545+ 0.406737i x=0.5236 sin(x)= 0.5000 0.866025+ 0.5i x=0.6283 sin(x)= 0.5878 0.809017+ 0.587785i x=0.7330 sin(x)= 0.6691 0.743145+ 0.669131i ……..

Instrucţiunea for în corpul unei alte instrucţiuni for for imbricat:

lin=5; col=12;

for i =1:lin %se repeta de lin ori for j =1:col %repeta de lin x col ori B(i,j) = 1/(i+j-1); end B5x12 end plot(B) % fiecare coloana o curbă plot(1:lin,B,'-*') % fiecare coloana o curbă plot(1:col, B, '-*') % o linie=o curba % abscisa are 5 valori 1:lin abscisa are 12 valori 1:col

Page 6: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

6

∑ −===

n

inx iXVAR1

212 )][( µσ

Matricea generată B5x12=

Două variante pt. calcul Sinus din vector x de valori:

1.Ciclul for versus 2.vectorizare %Cod scalar: x=1:.1:10; for k=1:length(x) y(k)=sin(x(k)); end plot(x,y)

Cod echivalent prin vectorizare: x=1:.1:10; y=sin(x); plot(x,y '-*')

x=-5:0.1:25; %Cod scalar: for k=1:length(x) y(k)=x(k)+sin(x(k)); end plot(x,y)

x=-5:0.1:25; y=x+sin(x); plot(x,y)

Calcul VARIANŢA:

% 1.Ciclul for x=[1 2 3 4] miu = sum(x)/length(x); %mediasuma=0; for i=1:length(x) suma=suma +(x(i)-miu)^2 end variance1=suma/length(x); % variance1 -> 1.25

% 2.Vectorizare miu = sum(x)/length(x);

variance2=sum(( x-miu).^2)/length(x); sau: …sum((x-miu).*(x-miu))… sau: (x-miu)*(x-miu)’

Page 7: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

7

%Numărare elemente ai pozitive din vector a=input(`Tastati sir numeric= `); %exemplu [5 -3 1 -9 4 1] contor=0; for i=1:length(a) if a(i)>0 contor=contor+1; end end display(contor);

Varianta Labview cu Select

Citire/ scriere tablou de caractere sirC=input('sir=','s' ); j=length(sirC); for i=1:length(sirC) sirB(j)=sirC(i); %se copiaza in ordine inversă caracterele j=j-1; % i creşte, j scade end sirB % sirC: abcdef -> sirB: fedcba

Calculul funcţiei sin(x) folosind dezvoltarea în serie Taylor:

1)!+(2nx)(-1=(x)

12n+n

0=n∑∞

sin n0=nT∑=

∞ =>

)+2n)+(2nxT=T

2

nn 3(21−⋅+

x=input('Dati valoarea lui x [radiani] pt calcul sin(x): ') n=input('Numar iteratii n= ') suma=x; T=x; %suma partiala si termenul curent for i=0:n T=-T*x^2/(2*i+2)/(2*i+3); suma=suma+T; end fprintf('Valoare calc= %20.15f \n Val calc Matlab=%20.15f\n',suma,sin(x) ); Rulare: Dati valoarea lui x [radiani] pt calcul sin(x):.4 Numar iteratii n= 6 Valoare calc= 0.389418342308650 Val calc Matlab= 0.389418342308651

Calcule cu matrice (relativ la DP şi DS)

Suma elementelor aij de pe diagonala principală DP (i = j) folosind un ciclu for: a= [2 -1 3; ... -9 4 1; ... 2 2 2] sum=0; nc= length(a(1,:)) %lin 1 şi toate coloanele for i=1:nc sum=sum + a(i,i); fprintf('i=%d j=%d a=%.3f\n',i,i,a(i,i)); end sum

Page 8: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

8

Suma elem. aij de pe diagonala secundară DS (i+j=n+1) folosind un ciclu for sumDS=0; n=nc; for i=1:n sumDS=sumDS + a(i,n+1-i); end sumDS

Suma elementelor pozitive situate deasupra DP şi deasupra DS Se citeşte matricea pătratică: a=[1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7]. Se parcurg elementele matricei unu câte unu pe linii şi se calculează suma elementelor

pozitive situate deasupra DP şi deasupra DS. Fiecare element însumat va îndeplini simultan trei condiţii:

Condiţii de poziţie în matrice: 1) i<j selectează elementele aij situate deasupra DP 2) i+j<n+1 selectează elem. deasupra DS Condiţia de valoare este: 3) a(i, j)>0

Varianta 1: se parcurge întreaga matrice a=input(`Intr. Matrice patratica=`) % tastati: [1 8 3 ;-9 4 1; 2 2 2] n=length(a(:,1)); % (toate liniile, coloana 1) sum=0; for i=1:n %ciclu exterior: ciclarea liniilor for j=1:n %ciclu interior: ciclarea coloanelor if i<j & i+j<n+1 & a(i,j)>0 %expresie logica sum=sum+a(i,j); fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j)); end end end sum Varianta 2: parcurge numai zona de interes for i=1: floor(n/2) %ciclu exter.=ciclare prima jumatate linii for j=i+1 : n-i %ciclu interior=cicl. coloane între DP şi DS if a(i,j)>0 sum=sum+a(i,j); fprintf('i=%d j=%d a=%.3f\n',i ,j , a(i,j)); end end end

Sumă elem pozitive 'triunghi dreapta' exclusiv diagonale Varianta #1 a=magic(5) n=length(a(:,1)); % (toate liniile, coloana 1) sum=0; for j=ceil(n/2): n

Page 9: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

9

%for exter. = ciclare coloane (jumatatea a doua) / sau ceil(n/2)+1 for i= (n+1-j+1): j-1 %for interior = cicl. linii între DS şi DP sum=sum+a(i,j); fprintf('i=%d, j=%d, a=%.3f\n',i ,j , a(i,j)); end end; display(sum); Varianta #2 (mai multe ciclări şi condiţionări) for i=2: n-1 %ciclu exter. = ciclare linii if (i<=floor(n/2)) for j=(n+1-i+1): n % cicl. coloane de la DS la n sum=sum+a(i,j); fprintf('i=%d, j=%d, a=%.3f\n',i ,j , a(i,j)); end elseif i>ceil(n/2) for j=i+1 : n % cicl. coloane de la DP la n sum=sum+a(i,j); fprintf('i=%d, j=%d, a=%.3f\n',i ,j , a(i,j)); display('jos'); end end end; display(sum);

Produsul a două matrice a şi b

Dacă A este matrice: all(A) %AND pe fiecare coloană all(all(A)) AND pe col. apoi AND pe unica linie %verificarea: >> a*b == c ans =

1 1 1 1 1 1

a=input('matricea a='); b=input('matricea b='); [aL aC]=size(a); [bL bC]=size(b); c=zeros(aL,bC); if(aC ~= bL) 'nu se pot inmulti matricele' else for i=1:aL for j=1:bC for k=1:aC

c(i,j)=c(i,j)+a(i,k)*b(k,j); end end end display(c) if all(all(a*b == c)) %verificare 'corect' end end

Să se calculeze valorile funcţiei Fi(r, ζ) de variabile r şi ζ folosind două cicluri For: ze=[0.03 0.05 0.1 0.20 0.50]; r=0 : 0.01 : 2.5; %Fi=zeros(length(ze), length(r)); for i=1:length(ze) for j=1:length(r)

212tan),(

rrarFi

−=

ζζ

Page 10: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

10

Fi(i,j)=atan2( 2*ze(i)*r(j), 1-r(j)^2 ); end end % atan2(Y,X) unghiul returnat poate fi în cele 4 cadrane plot(r,Fi); Obs: funcţia a fost calculată mai sus fără ciclări, folosind calcul compact matriceal.

Ciclul For şi tabloul de structuri Se citesc valori într-un tablou de structuri; este parcurs tabloul iar câmpurile structurii participă la calcule.

n=input('Numar persoane='); for i=1:n stud(i).nume=input('nume=','s'); stud(i).note=input('matrice='); end for i=1:n %i = indice structură din tablou [l c]=size(stud(i).note); nr=l*c; % număr note media=sum(sum(stud(i).note))/nr; if all(all(stud(i).note >= 5)) & media > 7 fprintf('Student: %s are note bune\n', stud(i).nume) end end

4.4. Instrucţiunea de ciclare While cu condiţionare anterioară

-execută un grup de instrucţiuni de un număr nedefinit de ori, sub controlul unei condiţii logice.

while expresie logica bloc de instructiuni end (1)Se evaluează expresie logica (E_L). (2) Daca E_L este True se executa bloc de instructiuni si se trece iar la (1)

(3)Dacă E_L este False se trece direct după end

i=-2; while i<7 i=i+1; end i

%suma elementelor x(2)… x(5)din sirul x x=-3:7; suma=0; i=2; while i<=5 suma=suma+x(i); i=i+1; end suma amplasare elemente in sir:

x(1) x(2) x(3) x(4) x(5) ... -3 -2 -1 0 1 ...

Suma patratelor elem. din şir:

x=6:-1:1; %sau x=[6 5 4 3 2 1]; suma=0; %initializam variabila suma i=1; %initializam „indicele” i

%instructiune while in corpul while

m=input('linii m= '); n=input('coloane n= '); i=1; while i<=m %se repeta de m ori

Page 11: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

11

n_e= length(x) while i <= n_e suma=suma + x(i)^2; i=i+1; %indicele incrementeaza end suma

j=1; while j<=n %se repeta de m x n ori A(i,j) = 1/(i + j - 1); j=j+1; end i=i+1; end i, j %afişează i şi j plot(A); % este mai dificila gestionarea indicilor %decât în cazul folosirii ciclului for

Calcul sinus (dezvoltare Taylor) prin folosirea ciclului While x=input('Dati valoarea lui x [radiani] pt calcul sin(x) ') suma=x; T=x; ii=0; %suma partiala si termenul curent while abs(T) > 1.e-12 T=-T*x^2/(2*ii+2)/(2*ii+3); suma=suma+T; ii=ii+1; end fprintf('Valoare calc= %20.15f \nVal calc Matlab=%20.15f\nii=%d\n',suma,sin(x),ii ); Rulare: Dati valoarea lui x [radiani] pt calcul sin(x) .4 Valoare calc= 0.389418342308650 Val calc Matlab= 0.389418342308651 ii=6

CURS 4 1. Poziţionare braţ robot cu trei cuple de rotaţie 1.1. Implementare animaţie Coordonatele cuplelor 2 , 3 şi a vârfului sunt date de trei vectori de poziţie în planul complex. O poziţie în planul complex este dată de modul şi funcţia exponenţial complexă de exponentul (unghiul) dorit:

1. vector de lungime l1 şi unghi φ1: 1

12ϕjelcup =

2. vect. precedent + vect. lungime l2 şi unghi φ2: 2

223ϕjelcupcup +=

3. poziţie sarcină (varf) 3

33var ϕjelcupf += Apelând la formula lui Euler : l·e^(ix) = l· [ cos(x) + i*sin(x) ], se poate afirma: - abscisele celor 3 pozitii sunt proiecţiile pe axa reală a celor 3 vectori complecşi. - ordonatele celor 3 pozitii sunt proiecţiile pe axa imaginară a celor 3 vectori complecşi. 1.2.Aplicaţie: rotire numai element 3 (cupla 3) si vectori de pozitie j=sqrt(-1); l1=3; l2=3; l3=2; % lungime elemente l1, l2, l3 fi1=pi/3; fi2=pi/6; % unghi fix cupla#1 şi cupla#2

Page 12: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

12

cup2=l1*exp(j*(fi1)); % poziţie cuplă fixă #2 cup3=cup2+l2*exp(j*(fi2)); % poziţie cuplă fixă #3

for fi3=pi/3:pi/30:3*pi/3 % elementul 3 se roteste cu pas pi/30 %line([0,real(cup3)], [0 imag(cup3)]) %vec. pozitie cupla3 varf=cup3+l3*exp(j*(fi3)); %line([0,real(varf)], [0 imag(varf)]) % vec. poz. varf

%se traseaza o configuratie a bratului cu line() lc=line([0 real(cup2) real(cup3) real(varf)],... % lista abscise [0 imag(cup2) imag(cup3) imag(varf)],... % ordonate 'linewidth',3,'Color',[0 0 0] ) %negru pause(.5); %se sterge configuratia curenta a bratului cu line() lc=line([0 real(cup2) real(cup3) real(varf)],... [0 imag(cup2) imag(cup3) imag(varf)],... 'linewidth',3,'Color',[1 1 1] ) %alb end

1.3. Se roteşte numai elementul #2 iar elementele 1 şi 3 păstrează orientarea: j=sqrt(-1); l1=3; l2=2.5; l3=2; % % lungimi elemente l1, l2, l3 fi1=pi/3; fi3=pi/6; % unghi fix cupla#1 si cupla#3 cup2=l1*exp(j*(fi1)); % pozitie cupla fixa #2 for fi2=pi/3:pi/30:2*pi cup3=cup2+l2*exp(j*(fi2)); % pozitie cupla #3 varf=cup3+l3*exp(j*(fi3)); % pozitie varf line([0,real(cup3)], [0 imag(cup3)]) lc=line([0 real(cup2) real(cup3) real(varf)],... % lista abscise [0 imag(cup2) imag(cup3) imag(varf)],... % ordonate 'linewidth',3,'Color',[0 0 0] ); pause(.1); set(lc, 'Color',[1 1 1] ); end set(lc, 'Color',[0 0 0] );

Page 13: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

13

Temă: să se vizualizeze poziţa curentă cu linie plină iar configuraţia precedentă a braţului cu linie subţire înainte de a fi ştearsă apoi totul se repetă pentru noua configuraţie. Obs.: Deplasarea pe traiectorie a vârfului robotului între două configuraţii se face în general cu modificarea simultană a celor trei unghiuri în cuple.

2. Scheme logice asociate instrucţiunilor de decizie şi de ciclare Schemele logice conţin: Blocul de start, B.de stop,

B. intrare date, B. ieşire date (paralelograme), B. de decizii logice (romb), B. de atribuiri şi calcul (dreptunghi) Blocurile sunt interconectate prin săgeţi orientate.

if expresie_logica grup de instructiuni end

….. if expresie_logica grup1 de instructiuni else grup2 de instructiuni end …..

for index = start:increment:end

grup de instructiuni end

while expresie logica

bloc de instructiuni end

Page 14: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

14

switch expresie % scalar sau sir de caractere/string case valoare1 grup1 instructiuni case {valoare21, valoare22, valoare23} % cell array grup2 instructiuni . . . case valoare n grupn instructiuni otherwise grup n+1 instructiuni end

Să se traseze schema logică asociată programului de mai jos: conţine decizii multiple în corpul ciclului for Programul contorizează numărul de apariţii în şirul x a valorilor 1, 2, 3 şi restul de valori. x=input('Tastati un sir de valori x=[...] '); v1=0; v2=0; v3=0; v=0; for i=1:length(x) if x(i) ==1 v1=v1+1; elseif x(i) == 2 v2=v2+1; elseif x(i) ==3 v3=v3+1; else v=v+1; end end fprintf('v1=%d v2=%d v3=%d v=%d\n',v1,v2,v3, v); Observaţi: 1.Asemănarea deciziei multiple realizate cu if-elseif şi cea realizată cu switch-case 2. S-au compus schemele logice pentru for şi if-elseif (sau switch) 3.Linia întreruptă mărgineşte corpul instrucţiunii de ciclare for şi conţine deciziile multiple.

3. Variante - se înlocuieşte condiţia de valoare: x(i) ==3 cu condiţia de interval: x(i) ∈ [3 5): for i=1:length(x) if x(i) ==1 v1=v1+1; elseif x(i) == 2 v2=v2+1; elseif 3<=x(i) & x(i) <5 v3=v3+1; else

Page 15: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

15

v=v+1; end end Se rescrie secvenţa prin folosirea instrucţiunii Switch-case respectiv numai If: Exemplul rescris cu instrucţiunea switch-case for i=1:length(x) switch x(i) case 1 v1=v1+1; case 2 v2=v2+1; otherwise if 3<=x(i) & x(i) <5 v3=v3+1; else v=v+1; end end end Obs: dacă apar intervale de valori pentru x nu se poate rescrie numai folosind instrucţiunea switch

Exemplul rescris folosind numai instrucţiunea if ... for i=1:length(x) if x(i)==1 v1=v1+1; end if x(i)==2 v2=v2+1; end if 3<=x(i) & x(i) <5 v3=v3+1; end if x(i)~=1 & x(i)~=2 & (x(i)<3 | x(i)>=5) v=v+1; end end Obs: dacă x(i) diferit de 1 şi x(i) diferit de 2 şi ( x(i) <3 sau x(i) >= 5) % x(i)∉[3 5)

4. Ordonări de şiruri numerice 4.1 Sortare prin metoda selecţiei a) este folosită funcţia predefinită sort() a=input('Va sorta in ord. descresc.\nIntroduceti un sir: ') asort=sort(a,'descend'); n=length(a); b) prin program for i=1:n-1 poz_max=i; for j=i+1:n if a(j)>a(poz_max) poz_max=j;%retine pozitie element maxim end end aux=a(i);a(i)=a(poz_max);a(poz_max)=aux; %interschimba end display(a); display(asort); 4.2. Sortare prin metoda bulelor a=input('Va sorta in ord. descresc.\nIntroduceti un sir: ') asort=sort(a,'descend'); n=length(a); for i=n-1:-1:0 for j=1:i % elem. cel mai mare este plasat ultimul in subsirul de indici 1,...,i if a(j)<a(j+1) aux=a(j); a(j)=a(j+1); a(j+1)=aux; end end end a asort

Page 16: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

16

5. Definirea unei funcţii în Matlab

5.1. Sintaxa definirii unei funcţii:

in1, in2,…inn sunt argumente de intrare (parametri formali) ou1,out2,…outm sunt argumente de ieşire in1, in2,… ou1,out2,… sunt variabile locale ai sunt parametri actuali sau efectivi care au valori concrete la momentul apelului funcţiei ri primesc valorile de la outi. 1. Funcţiile sunt subprograme (apelate) care folosesc parametri de intrare (in1, in2,…) şi parametri de ieşire/calculaţi (ou1,out2,…) pentru a comunica cu programul apelant, cu alte funcţii sau cu fereastra de comenzi. 2. Definiţia funcţiei este salvată într-un fişier ce poartă acelaşi nume cu cel al funcţiei sau altă denumire şi extensia .m In cazul în care numele funcţiei este diferit de al fişierului se foloseşte numele fişierului la apel. Calea spre fişier trebuie setată “Set Path…” dacă fişierul nu se află în directorul curent sau în lista de căi spre directoare. 3. Apelul funcţiei este: nume_fun(a1, a2,…,an) unde a1, a2, …,an sunt parametri efectivi (actuali) având valori concrete/cunoscute (la momentul apelului). 4.Valorile parametrilor efectivi sunt transferate parametrilor formali în ordine de la stânga la dreapta. 5. O funcţie poate fi apelată de mai multe ori; la fiecare apel, prin parametri de intrare, se aplică acelaşi algoritm de calcul unor date de intrare diferite. 6. Folosirea funcţiilor permite modularizarea programului (anumite sarcini de calcul să fie încapsulate) 7. Funcţiile folosesc variabile locale funcţiei, variabile care există numai pe timpul execuţiei funcţiei: în fun_demo1: i, x; la ieşirea din funcţie variabilele locale se pierd (eliberează memoria). 8. Variabilele locale sunt independente de variabilele cu acelaşi nume din programul principal (apelant) sau din alte funcţii. 9. Funcţia poate fi apelată din linia de comandă, dintr-o altă funcţie sau dintr-un fişier script. 10. Funcţiile pot să nu aibă argumente de intrare sau argumente de ieşire. 11. Pentru funcţia apelată dintr-o expresie, apelul se înlocuieşte cu valoarea (valorile) returnată.

5.2. EXEMPLE - definiţii şi apeluri de funcţii 1) Un parametru de intrare şi unul de ieşire function y = average(x) %AVERAGE media elementelor vectorului y = sum(x) / length(x); end

x = parametrul de intrare este vector y = parametrul de ieşire este scalar Funcţia average este salvată în fişierul average.m

APELURI valide ale funcţiei average: v=[1 2 3 -3 5]; ave=average(v)

v=[1 2 3 -3 5]; average(v) ans = 1.6000

average( [1 2 3 -3 5] ) ans = 1.6000

Page 17: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

17

2) Parametrii sunt şiruri de caractere

function sir = salut(nume) sir = [ 'Salutari ' nume ' si felicitari pentru izbanda' ] ; % returneaza concatenare siruri beep; end

Apeluri: nume=' Victor'

salut (nume) salut ('Ionel si Victor')

3) 2 parametri de intrare şi un (1) parametru de ieşire function z=xplusy(x, y); z=x+y; end

x,y doi parametri de intrare z un parametru de ieşire

Se salvează definiţia funcţiei într-un fisier cu numele xplusy.m

APELURI valide ale funcţiei: a=1 b=2 scal1=xplusy(a,b)

a=[1 2 3; 3 4 5] b=[7 8 9; 2 0 4] matr1=xplusy(a,b)

scal2=xplusy(1,2) matr1=xplusy([1 2 3; 3 4 5] , b)

a=7 b=[7 8 9; 2 0 4] matr2=xplusy(a,b) * b' % apel în expresie, matrice 2x3*3x2 matr2=xplusy(7, [7 8 9; 2 0 4])

4) Parametri de intrare (2, 3 sau 4) <= nr. param.formali (4)

function z = xplusy2(x,y, a, b) fprintf('Nr par. actuali=%d\n',nargin) if nargin < 4 b=1; end if nargin < 3 a=1; end z=(x+y)*a*b; end Dacă apelul este cu 3 parametri actuali aceştia sunt automat transferaţi pentru x,y şi a.

se poate apela funcţia cu 2, 3 sau 4 parametri nargin conţine nr. de param. actuali folosiţi la apel Dacă nargin<4 se atribuie parametrului neglijat val. b=1 Dacă nargin<3 se atribuie parametrului neglijat val. a=1 Pentru nr. de param. >4 sau <2 => eroare

Apeluri valide: >> xplusy2(3,5) ans = 8 >> xplusy2(3,5,1) ans = 8

>> xplusy2(3,5,2) ans = 16 >> xplusy2(3,5,2,4) ans = 64

5) 2 parametri de intrare, nu sunt parametri de ieşire

function compar(a,b) if a>b 'a>b' elseif a<b 'a<b' else %a==b 'egalitate'

a,b parametri intrare; nu exista parametri de ieşire Salvăm definiţia în fişierul compar.m APELURI: >>compar(4,6) *Rezultatele sunt tiparite din functie

Page 18: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

18

∑ −==

n

in meaniXstdev

1

21 )2][(

end 5) Un parametru intrare, 2 parametri de ieşire function [s,sp]=sumapoz(x) %returneaza suma si suma elem >0 s=0;sp=0; for i=1:length(x) s=s+x(i); if x(i)>0 sp=sp+x(i);%insumare %x(i)>0 end end end Apel: [suma, sp]=sumapoz([1 5 -3]) Parametrii locali ai functiei pot avea acelasi nume (sp) cu variabilele din secţiunea care apelează

6. Instrucţiunea break determină întreruperea ciclării for sau while şi salt la prima instrucţiune după instrucţiunea end a ciclării. 7. Instrucţiunea continue trece controlul sau realizează salt la prima instrucţiune din următoarea iteraţie în cadrul ciclărilor for sau while.

8. Instrucţiunea return determină ieşirea forţată din funcţie (funcţia apelată f_A) şi întoarcerea după punctul de apel din funcţia apelantă f_An (care a apelat funcţia f_A) (funcţia returnează valorile de la acel moment din parametrul de ieşire).

Se doreşte salvarea în tabloul x (out) de numere aleatoare returnate de rand() pâna la generarea unui număr >0.95 (care se salvează şi acesta); sarcina se realizează într-o funcţie.

Varianta cu break Varianta cu return function out=fun_demo1(in) i=1; while i < in x(i)=rand(1); if x(i)>0.95 'se executa break' break; % intrerupe ciclul while end i=i+1; end out=x; %salvare x in out i

function out=fun_demo2(in) i=1; while i < in x(i)=rand(1); if x(i)>0.95 out=x; %salvam x in out i 'se executa return' return; % iesire din functie end i=i+1; end out=x; %salvare x in out i

Apel: a=fun_demo1(1.e2); Dacă x(i)>0.95 True, iese din ciclu, salvează x in out si iese din functie Altfel executa 1.e2 cicluri, salveaza x in out si iese

Apel: b=fun_demo2(1.e2); Dacă x(i)>0.95 True, salveaza x in out si iese din functie Altfel executa 1.e2 cicluri, salveaza x in out si iese

1. Se apelează o funcţie din corpul altei funcţii - ambele funcţii utilizator sunt definite în acelaşi fişier:

Page 19: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

19

Bulina roşie => breakpoint Săgeata albă => punct de apel funcţie Săgeata verde => poziţie curentă de rulare

>> stat3([1 2 3 4]) % apel functie stat3

% media se calc. în altă funcţie (avg) Obs. funcţia avg se poate de asemenea scrie într-un fişier separat numit avg.m astfel fiecare funcţie va fi salvată în fişierul propriu.

1. Evaluarea repetată a unei formule a) definirea unei funcţii b)folosirea funcţii inline evită definirea funcţiei

function y=f_expresie(x) y=x+sin(x)+x.^2; end

Ex1: un argument: x fun_ex=inline( 'x+sin(x)+x.^2' ); %parametrul este şir de caractere

Sunt permise apelurile: Rez1=f_expresie(2.2) Rez_1=fun_ex (2.2)

Rez2=f_expresie([2.2 3 5]) Rez_2=fun_ex ([2.2 3 5])

c) Ex2: inline cu mai multe argumente: a, om, t

exp_comp=inline ( ’a*exp(j*om .* t)’ ) % tjea ω⋅ la apel parametrii sunt luaţi in ordinea din definitia inline >> exp_comp(1, 3, 0 : .1 : 0.4) % 1->a, 3->om, 0:.1:0.4 ->t

ans = 1.0000 0.9553 + 0.2955i 0.8253 + 0.5646i 0.6216 + 0.7833i 0.3624 + 0.9320i

plot( exp_comp(1, 3, 0 : .1 : 0.4) ,'-*' ) -->

% )]sin()[cos( tjtaea tj ωωω +=⋅

>> x=0: .1 :2*pi >> plot( x , exp_comp(3, pi, x) ) graficul: *partea imaginară a ordonatelor a fost neglijată în grafic

*abscisa de la 0 la 2pi; 3,1415 perioade de cosinus deoarece om=pi; 3 este amplitudinea

3.Variabile globale VG permit folosirea unor variabile în corpul funcţiilor fără ca acele variabile să fie pasate prin parametri în acele funcţii.

Page 20: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

20

Comunicare numai prin parametri Fereastra de comenzi Definiţie fun_1 a=1; b=2; c=5; re=fun_1(a,b,c);

function y=fun_1(pa,pb,pc) …. y=pa+pb+pc; %variabile locale

Variabilele a,b,c şi-au transferat valorile parametrilor formali pa, pb respectiv pc. Valoarea calculată y transferă valoarea variabilei re Comunicare prin parametri şi variabilă globală a=1; b=2; global vgC; vgC=55; re=fun_2(a,b);

function y=fun_2(pa,pb) …. global vgC; ….. y=pa+pb+ vgC;

Variabilele a,b şi-au transferat valorile parametrilor formali pa respectiv pb. Variabila vgC este declarată globală în funcţia apelantă şi apelată (fun_2) deci poate fi folosită în expresii în funcţia apelată fun_2( ) Variabile persistente – sunt locale funcţiei, nu se şterg la ieşirea din funcţie, valoarea lor este reţinută şi regăsită la un nou apel al aceleaşi funcţii; nu pot fi accesate dinafara funcţiei. persistent var_persist; 4. Aplicaţie. Creaţi o funcţie Matlab care trasează grafic funcţia:

)-t(ea=x(t) t- ϕωσ ⋅⋅⋅ cos apelată cu parametrii actuali: a=3, σ=1.2, ω=50, φ=pi/3, timpul t∈[0,3] cu pas 0.005. Apelaţi repetitiv funcţia modificând σ in intervalul 0,..., 2. Funcţia returnează media valorilor. function [ media ] = vibr(a,si,t,om,fi) y=a*exp(-si.*t).*cos(om.*t+fi); plot(t,y) media=sum(y)/length(y); end % script din care se apelează funcţia vibr a=3; om=50; fi=pi/3; t=0:0.005:3; subplot(121);i=1; for si=0:.1:2 media2(i)=vibr(a,si,t,om,fi) pause(.2); grid on; i=i+1; end subplot(122); plot(0:.1:2,media2);grid on;

Page 21: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

21

CURS 5 2. Fişiere script Matlab sau macrouri

Scriptul Matlab este un segment de program Matlab salvat într-un fişier numefis.m. Execuţia fişierului script se obţine prin apelul numelui fişierului numefis (fără extensie) în linia de comandă, în funcţii sau în alte fişiere script. După execuţia fişierului script variabilele locale rămân în spaţiul de lucru al aplicaţiei spre deosebire de funcţie în care variabilele locale se dealocă din memorie.

Un program Matlab are forma fişierelor: nume_script.m şi/sau: nume_functie.m

Din fişierele de funcţii sau fişierele script se pot apela alte funcţii sau fişiere script. Se pot face de asemenea apeluri recursive: - din funcţie se apelează aceeaşi funcţie sau - dintr-un fişier script să se apeleze acelaşi fişier script. Funcţii transmise ca parametru altei funcţii:

Sunt definite trei funcţii apelate: f(), g() şi arie() function [y]=f(x) y=sin(x)+x; end

function [y]=g(x) y=x*cos(x); end

function arie=arieDR(pf1, a,b,n) dx=(b-a)/n; arie=0; for i=1:n % metoda dreptunghiurilor arie=arie+dx* pf1(a-dx/2+i*dx) end end

In corpul funcţiei arie se apelează sub numele formal pf1 funcţia dorită = funcţia trimisă prin parametri actuali @f sau @g şi pentru aceasta se calculează integrala aprox. dintre abscisele a şi b. pf1(a) calculează valoarea funcţiei pentru abscisa a oricare ar fi funcţia apelată.

Apeluri ale funcţiei arieDR(...): %Programul principal sau script (apelant) a=1; b=2; n=10; rezultat1=arieDR( @f, a, b, n) rezultat1 = 2.4568 rezultat2=arieDR( @g, a, b, n+100) rezultat2 = 0.0207

Obs: pf1 este parametru formal din def. funcţiei arie @f, @g parametri actuali = adrese de funcţii la apel funcţie arie

3. Integrarea unei ecuaţii diferenţiale de ordinul întâi 3.1. Ecuaţia diferenţială se pune în forma:

Page 22: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

22

),( yxgdxdy

=

unde y(x) este funcţia necunoscută iar x este variabila independentă. Sunt necesare condiţii iniţiale. Pot fi folosite funcţiile Matlab predefinite: ode23 - foloseşte metoda Runge-Kutta de ordin 2/3 şi ode45 - foloseşte metoda Runge-Kutta de ordin 4/5 3.2. Să se integreze ecuaţia diferenţială de ordinul întâi 15' 2 += xy pe intervalul [-3 4] cu condiţia iniţială y(-3)=50. y(x) este funcţia necunoscută iar x este variabila independentă. Soluţia exactă este xxy += 33/5 + C. Se determină constanta C din condiţia iniţială y(-3)=50 rezultând C=98. Integrala sau soluţia exactă devine: 983/5 3 ++= xxy Să integrăm numeric ecuaţia diferenţială folosind funcţia ode23. Se vor reprezenta grafic comparativ soluţia exactă şi cea rezultată din integrarea numerică. Se defineşte funcţia yprim de forma: function dy = yprim( x, y ) dy=5*x^2+1; end yprim este numele funcţiei Matlab în care este defintă derivata dy a funcţiei y necunoscute. Program principal: [x,y]=ode23('yprim',[-3 4],50); % nume funcţie apelată,interval x, cond. ini. fprintf('numar puncte din integrarea numerica=%d\n',length(x)); y2=5/3*x.^3+x+98; % solutia exacta plot(x,y,'-',x,y2,'+'); grid on;

Obs. Constanta de integrare 98 a soluţiei exacte se deduce din condiţia iniţială y2(-3)=50 sau 5*(-9)-3+C=50. Pasul de integrare la apelul funcţiilor ode23 şi ode45 este ales automat în funcţie de gradientul soluţiei. Se poate impune calculul numeric al funcţiei în punctele specificate ale intervalului de integrare prin apelul: [x,y]=ode23('yprim', [-3: .1 : 4] , 50); Al doilea parametru indică limitele de integrare şi abscisele intermediare. 3.3. Viteza paraşutei Se consideră ecuaţia diferenţială ce descrie viteza v a paraşutei la cădere liberă:

kvmgdtdvm −= ,

unde m=80kg, g=9.81, coeficientul de frecare vâscoasă cu aerul a paraşutei deschise se consideră k=90 iar viteza iniţială la deschiderea paraşutei este v0=35m/s. Comparaţi grafic

Page 23: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

23

soluţia numerică dată de ode23() cu soluţia exactă k

mgekmgvv mtk

+−=−

)/0( pentru 25

secunde. function dv = yprim2( t, v ) m=80; k=90; g=9.81; dv=g-k*v/m; end

v0=35; [t,v]=ode23('yprim2',[0 25], v0); m=80;g=9.81;k=90; v2=(v0-m*g/k)*exp(-k/m*t)+m*g/k; plot(t,v,'-', t,v2,'+'); grid on;

Grafică 2D în MATLAB

Funcţii pentru reprezentări grafice 2D în MATLAB 1. subplot(abc) sau subplot(a, b, c) divizează fereastra în grafice aşezate matriceal:

a=număr linii, b=număr coloane, c=stabileşte poziţia curentă în matrice numărând pe linii: a11, a12… a21…

2. plot(y) - realizează reprezentări grafice în coordonate liniare a) y este vector => reprezintă valorile lui y în funcţie de numărul de ordine al fiecărui element din vector

Exemplul #1 vector x=0 : pi/100 : 4*pi %vector real de 401 elemente y=sin(x); plot(y)

b) y este matrice m x n => plot(y) reprezintă n curbe câte o curbă pentru fiecare coloană a matricei

Exemplu #2 matrice x=0 : pi/100 : 3*pi ma(:,1)= sin(x); %generare coloana 1 ma(:,2)= sin(x+pi/3); %generare col. 2 % faza pi/3 translatează curba % în lungul abscisei plot(ma); % ma este matrice 301 x 2 % 2 coloane → 2 curbe

Page 24: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

24

c) Setare grosime şi culoare curbă în grafic *Setează grosimea (1.6) a liniei plot(r,T, 'LineWidth' , 1.6); *Setează culoarea (red) şi grosimea liniei line(X,Y,Z, 'Color', 'r', 'LineWidth', 4)

d) y este un vector de valori complexe -> va reprezenta plot(real(y), imag(y))

ze=0.04; r=0 : .01 : 3; j=sqrt(-1) %factor complex amplific. depl. 1gdl Ac=1./ (1- r.^2+2*j*ze*r);

%vector val. complexe subplot(211); % 1=linie, 2=col., % pozitia 1 devine curenta plot(Ac, ' - +' ) %trasează real(Ac) vs. imag(Ac) subplot(212); % 1=linie, 2=col., % pozitia 2 devine curenta plot(real(Ac), imag(Ac), '-+' ) % identic cu plot(Ac)

3. plot(x, y)

a) x şi y sunt vectori reprezintă grafic vectorul y (ordonate) în funcţie de vectorul x (abscise) primul punct din grafic: x(1), y(1) punctul al doilea din grafic: x(2), y(2) … ultimul punct: x(end), y(end) % acelaşi număr de valori în vectorii x şi y

b) x vector, y matrice coloanele / liniile matricei y vor fi reprezentate în funcţie de vectorul x

subplot(131); plot(r, real(Ac)); grid on; subplot(132); plot(r, imag(Ac)); grid on; subplot(133); plot(r, [real(Ac); imag(Ac)], 'linewidth', 2); grid on; % r=vector, % [real(Ac); imag(Ac)]= matrice 2 linii

c) plot(x1,y1, x2,y2) => în acelaşi grafic sunt reprezentate curbele (x1, y1) şi (x2, y2) x1, y1 = 2 vectori; x2, y2 = 2 vectori

r2j+r-11=A 2c ζ

Page 25: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

25

plot(r, real(Ac), r, imag(Ac) );

%sau plot( r, [real(Ac); imag(Ac)] ); identice 4. Funcţia STEM: reprezentarea discretă prin “tulpini”

x=0 : pi/10 : 3*pi %vector real de elemente y=sin(x); stem(x, y)

stem

5. Funcţia STAIRS

Reprezentare în trepte x=0 : pi/10 : 3*pi %vector real y=sin(x); stairs(x, y)

stairs

6. Grafic de bare verticale

x=0 : pi/6 : 2*pi %vector real de 6 valori y=sin(x); subplot(1,2,1); bar (y); grid on; %y în funcţie de indici subplot(1,2,2); bar (x,y) ; grid on;

7. Grafic coordonate polare (u,R)

u=0 : pi/10 : 2*pi; % unghi R=sin(u) .* cos(u); % Raze % cu interpolare liniară între puncte polar(u, R);

8. comet(y) şi

Page 26: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

26

comet(x,y) % realizează reprezentare dinamică a unei curbe 2D printr-un punct care se deplasează şi trasează curba. 9. Exemplu cu funcţia FFT + module de numere complexe Profilul unei funcţii periodice este de forma:

t2

+t+t2

=f(t) 00 04cos5.1cos3cos1 ω

ωω⋅

Se trasează grafic funcţia şi se pun în evidenţă componentele armonice ale profilului (amplitudinea şi argumentul fiecărui cosinus):

t=0:0.01:5; w0=10; % 501 valori f1=1*cos(w0/2*t)+3*cos(w0*t)+1.5*cos(4*w0/2*t); subplot(211); plot(t,f1); grid on; %se observa graficul periodic în timp

Y1 = fft(f1); % fft() → Fast Fourier Transform % par. actual: f1= vec.501 valori reale → returnează vec.501 val. complexe subplot(212); stem( abs(Y1(1:length(Y1)/4))); grid on; % grafic module pentru primele 501/4 din Y1 vs. indici

Y1 = vector de numere complexe returnat:

10. Reprezentare în coordonate logaritmice şi semilogaritmice loglog(x,y) scalează ambele axe folosind logaritmul în baza 10 * valorile 10-1 , 100 , 101 , 102 ,… sunt echidistante pe abscise şi ordonate semilogx(x, y) scalează logaritmic axa x (…10-1 , 100 , 101 , 102 ,…sunt echidistante pe x=abscisa) semilogy(x, y) scalează logaritmic axa y (…10-1 , 100 , 101 , 102 ,…sunt echidistante pe y=ordonata) x=0 : pi/100 : 10*pi %5 perioade, vector real de 1001 elemente y=sin(x); semilogx(x, y, 'linewidth',2) ; grid on;

Page 27: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

27

subplot(211); semilogx(abs(Y1(1:length(Y1)/4) ), 'linewidth',2); grid on; % scalare logaritmică după x subplot(212); semilogy(abs(Y1(1:length(Y1)/4) ), 'linewidth',2); grid on; % scalare logaritmică după y

11. fplot(‘nume_fun’, limite, n) % reprezintă grafic o funcţie în limitele specificate, n valori de calcul % definitie functie f2() - salvată in fisierul f2.m function y=f2(x) y=sin(x) .* x; return * apel fplot cu reprezentare grafică: fplot('f2', [-22 44], 1000); grid on; % reprezintă grafic funcţia f2 definită în fişierul f2 sau: * apel fplot fără trasare grafic: [x,y]=fplot('f2', [-22 44], 1000); % NU reprezită functia ci numai returneaza vectori % 1000 abscise şi 1000 ordonate în [x, y] plot(x,y); grid; % apelăm plot(x,y) pentru reprezentare grafică. 12. Trasare poligoane pline colorate

subplot(121); fill([1 2 4],[1 6 8],'r') ; grid on; % un poligon, [lista abscise], [lista ordonate] subplot(122); fill([1 2 4],[1 6 8],'r', [2 4 8] , [6 8 9], 'g'); grid on; % doua poligoane

Page 28: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

28

13. Reprezentare vectori complecşi cu originea în (0,0): z = 3.0000 + 4.0000i compass([z, z/i, z*i]) % vector în forma exponenţial complex: compass([ 3*exp(j*pi/3), 2*exp(j*pi/2), 3-1*j]) % unde j=sqrt(-1) 14. Funcţia text(x,y,'string') → scrie text pe figură la poziţia (x,y) >> text(10,700, 'frecv medie'); >> text(19,400, 'frecv maxima')

*Se va scrie relatia lui Euler la poziţia dorită (x,y)= (.1, .22)

>>figure % se creează o nouă fereastră pentru figuri >> text(.1, .22, '\ite^{(i\omega\tau)} = cos(\omega\tau) + i sin(\omega\tau)' ) ↑ pozitie text ↑ it pentru a interpreta şir text conform unor reguli ↑ acolade {} pentru gruparea scrisă la exponent Alfabet grecesc: … \omega \tau \ … » gtext('ze=0.1') %permite interactiv scrierea textului la pozitia dorita pe figura curenta

Page 29: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

29

* pozitia curenta este indicata de axele perpendiculare, * axele sunt poziţionate prin deplasare mouse 1. Tipărire cu format %d, %f, %e, %g la folosirea funcţiei fprintf

x=input('vector x= '); for i=1 : length(x) fprintf('element x(%3d)=%12.3f\n', i, x(i) ); fprintf('element x(%3d)=%12.3e\n', i, x(i) ); fprintf('element x(%3d)=%12.3g\n\n', i, x(i) ); end % s-a folosit \n pentru trecerea cursorului pe randul urmator la inceput după fiecare execuţie a funcţiei fprintf

Rulare Observaţii vector x= [1.01 0.00002] element x( 1)= 1.010 element x( 1)= 1.010e+000 element x( 1)= 1.01 element x( 2)= 0.000 element x( 2)= 2.000e-005 element x( 2)= 2e-005

% se citesc 2 valori %f %e %g %f lipsă cifre utile %e %g a ales f. expon.

Folosim descriptori de format: %d pentru tipărire valori întregi cu semn (decimal) %s pentru tipărire şiruri de caractere (string) %f pentru tipărire valori reale (float) %12.3f valoarea reală se tipăreşte într-un spaţiu de 12 caractere dintre care 3 sunt alocate zecimalelor iar restul punctului zecimal şi părţii întregi. %e tipărire format exponential %g varianta mai compactă dintre %f sau %e şi fără 0 inutil În cadrul parametrului actual de tip ‘şir de caractere’ a funcţiei fprintf, pot fi folosite caractere de formatare a textului (caractere de evitare): \n Linefeed LF + carriage return CR = se

trece (scrie) la inceputul liniei următoare \t Tab (sare la dreapta un număr

de caractere/pozitii de scriere) \r carriage return \b Backspace (inapoi un caracter)

Folosim: \\ pentru a tipări un caracter backslash \ %% pentru tipărirea unui caracter procent % ’’ pentru a tipări un caracter apostrof ' 2. Tipărire în formă tabelară la ecran: x=input('sir de medii x= '); s=0; m=0; b=0; nivel={'slab', 'mediu', 'bun'}; %cell array conţine 3 şiruri de caractere de lungimi diferite fprintf(' \t\tNote studenti\n'); %două taburi (\t) şi trecere la inceputul rândului următor (\n) fprintf(' \t\t----------------\n'); %realizeaza subliniere titlu for i=1:length(x) if x(i)<=6 s=s+1; % %s este descriptor pentru şir de caractere fprintf('student #%d nivel %s =%12.3f s=%d\n', i, nivel{1}, x(i), s) elseif x(i)<=8 m=m+1; fprintf('student #%d nivel %s =%12.3f m=%d\n', i, nivel{2}, x(i), m ) else

Page 30: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

30

b=b+1; fprintf('student #%d nivel %s =%12.3f b=%d\n', i, nivel{3}, x(i), b) end end

Exemplu rulare:

sir de medii x= [4.33 10 6.25 7 9.66] Note studenti ---------------- student #1 nivel slab = 4.330 s=1 student #2 nivel bun = 10.000 b=1 student #3 nivel mediu = 6.250 m=1 student #4 nivel mediu = 7.000 m=2 student #5 nivel bun = 9.660 b=2 3. Funcţiile: fopen, fprintf , fwrite, fclose Scriere în fişier (în locul ecranului) - folosim o secvenţă de forma următoare:

x=input('vector x= '); fid=fopen('c:\fisdate.dat', 'wt'); % write text if fid == -1 display('Nu s-a deschis fisierul\n ') % ex. cale eronată else for i=1:length(x) fprintf( fid, 'element x(%3d)=%12.3f\n', i, x(i) ) end st = fclose(fid) % închide fişier cu ID=fid if st == 0 display('fisier inchis cu success'); end end

Conţinut fişier fisdate.dat:

fid2 = fopen('c:/fis33.bin', 'wb'); % write binar x=fwrite(fid2, 3:300); %return o val.: 298 (val. scrise in fisier) x2=fclose(fid2); %returneaza 0 pentru succes şi -1 altfel

Conţinut văzut cu Wordpad:

Sintaxa de scriere: fid = fopen(cale_numefisier, mod) deschide fişierul în modul specificat prin mod care poate fi: 'r' read (deschide pentru citire din fişier). 'w' write (deschide fişier pentru scriere; dacă există date în fişier acestea se pierd; se generează fişierul dacă este necesar). 'a' append (deschide fişierul pentru scriere; se adaugă date în fişier la urmă; se generează fişierul dacă nu există). 'r+' read and write (deschide fişier pentru citire/scriere; nu generează fişier dacă acesta nu există). 'w+' deschide sau crează fişier pentru read şi write; conţinutul care se găseşte la deschiderea fişierului se pierde. 'a+' read şi append (crează fişierul dacă este necesar) Fişierul poate fi deschis (pentru citire din fişier sau scriere în fişier): în mod text (exemple 'rt' şi 'w+t') sau binar (implicit). fid este identificatorul fişierului deschis (valoare numerică întreagă); daca fişierul nu poate fi deschis, fopen returnează -1 Obs.: funcţiile fscanf este folosită pentru citire text cu format din fişiere. fread = citeşte date binare din fişier.

Page 31: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

31

CURS 6

1. CALCULE CU POLINOAME 1.1. Polinoamele sunt reprezentate prin vectorul coeficienţilor polinomului luaţi în ordine descrescătoare a puterilor.

32)( 2 ++= xxxp => p=[1 2 3] ; %vectorul linie al coeficienţilor

Funcţia polyval - evaluarea polinomului folosind VECTORUL coeficienţilor

p=[1 2 3] ; %vector coeficienţi x=[-18: .2 : 22]; %vector abscise

y=polyval(p, x);

plot(x, y, 'linewidth', 2.6); grid on; Funcţia polyval evaluează un polinom (dat prin coeficienţii polinomului p1) la abscisele din x (parametrul al doilea). 1.2. Adunare şi scădere de polinoame Se adună/scad element cu element coeficienţii de acelaşi ordin. Vectorii coeficienţilor trebuie să aibă acelaşi număr de elemente:

Să se adune polinoamele p1(x) şi p2(x): 32)(1 2 ++= xxxp

43)(2 += xxp )(2)(1)( xpxpxpsum +=

Secvenţa Matlab: p1= [1 2 3]; p2= [0 3 4]; >> p_suma=p1+ p2 p_suma = 1 5 7

1.3. Inmulţire şi împărţire de polinoame cu funcţiile conv şi deconv: )1()32()( 2 −++= xxxxprod Exemplu Matlab: p1=[1 2 3]; p2=[1 -1]; prod=conv(p1, p2) prod = → 1 1 1 -3 [cat, rest]=deconv(prod, p2) cat = → 1 2 3 rest = → 0 0 0 0

[cat, rest]=deconv(prod, p1) cat = → 1 -1 rest = → 0 0 0 0

1322

)(−

++= xxxximp

[cat rest]=deconv([1 2 3], [1 -1])

cat = → 1 3 rest = → 0 0 6 p1_ini = conv(cat, [1 -1]) + rest

p1_ini = → 1 2 3 1.4. Aplicaţie. Înmulţirea a două polinoame date prin vectorii coeficienţilor: Comparaţi coeficienţii obţinuţi prin programul scris şi prin apelul funcţiei conv()

Page 32: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

32

- gradul polinoamelor p1, p2 scrise prin coeficienţi este:

length(p1)-1 respectiv length(p2)-1;

- gradul polinomului produs p12 este: length(p1)+length(p2) - 2 - se alocă length(p1)+length(p2) -1 pozitii în p12. P1=[1 2 3]; p2=[1 -1]; p12= zeros(1,length(p1)+length(p2)-1) for i=1:length(p1) for j=1:length(p2) p12(i+j-1)= p12(i+j-1)+ p1(i)* p2(j); %produsul de pe poziţiile i,j intră în poz. p12(i+j-1) end %ex:i=1,j=1=> p12(2-1) inmultire puteri maxime end %ex:i=3,j=2=>p12(4) inmultire termeni liberi p12 %afisare coef. determinati prin program %pt. comparaţie: prod=conv(p1,p2) %afisare coef. determ prin functia conv()

1.5. Evaluarea polinomului pentru un vector de argumente (scriind expresia polinomială şi operatorul .^ ):

VecArg=[ -2 0 10 10.1 99] % vector (5 argumente)

Val = VecArg .^ 2 + 2*VecArg + 3

Val = 1.0e+004 *

0.0003 0.0003 0.0123 0.0125 1.0002

VArg= 2: 0.5 : 4;

Val2= VArg .^ 2 +2 *VArg + 3

Val2 = 11.0000 14.2500 18.0000 22.2500 27.0000

Operatorul .^ indică ridicarea la putere a fiecărei valori din vectorul de argumente 1.6. Aplicaţie. Să se calculeze determinantul matricei B; elementele matricei sunt polinoame.

=

4+2x+x52+x

2+x6+3x+x10B

2

2

=

2221

1211

pp

pp

Se înmulţesc polinoame pe diagonalele matricei şi se scad polinoame: p11*p22 - p21*p12 ( pe Diag.Secund. se adaugă 0 pt. gradul superior)

detB=conv([10 3 6], [5 2 4]) - conv([0 1 2],[0 1 2] ); detB = 50 35 75 20 20

Page 33: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

33

Polinomul detB rezultat se reprezintă grafic pe un interval: x=-2 : 0.1 : 2; plot(x, polyval(detB,x),'linewidth',1.4)

1.7. Opţional. Să se reprezinte grafic funcţia de variabilă w:

22

21

22

22

))(()(

kk+kwmk+kwmk+kwmwF

2132

32

−+−+−+−

=

pentru coeficienţii: k1=244.5; k2=244.5; k3=244.5; m1=1; m2=1, in intervalul: w=10 : 0.01 : 30; % k1=2; k2=2; k3=4; m1=5; m2=10 detB=conv([-m2 0 k2+k3] , [-m1 0 k1+k2]) - [0 0 0 0 k2^2]; % polinom numitor pZerouri=[-m2 0 k2+k3]; % polinom numărător w=-30 : 0.01 : 30;

FRF11=polyval(pZerouri,w) . / polyval(detB,w);

plot(w,FRF11, 'linewidth',1.7); grid on; h = zoom; h.Motion = 'vertical'; % se alege zoom in (+) si se scalează vertical z1=roots(pZerouri); f_z1=z1/(2*pi) % rad/s respectiv Hz r12=roots(detB); f_r12=r12/(2*pi) * observăm două asimptote verticale la rădăcinile numitorului

1.8. Funcţia roots() calculează rădăcinile unei ecuaţii polinomiale: Analizaţi următorul raport de polinoame (reprezintă funcţia de transfer G(s) ):

1214)( 3

2

++++

=sssssG

num=[1 4 1]; den=[1 0 2 1]; >> roots(num) % rădăcini ec. polinom (zerouri) ans = -3.7321 2 rădăcini reale -0.2679 >> roots(den) % radacini numitor (poli) ans = 0.2267 + 1.4677i 2 răd. complex conjugate 0.2267 – 1.4677i -0.4534 + o răd. reală 1.9. Funcţia pzmap() - calculează polii şi zerourile unei funcţii de transfer (TF) + trasare figură alăturată (poziţie poli şi zerouri în plan complex)

Page 34: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

34

1214)( 3

2

++++

=sssssG

›› pzmap( [1 4 1], [1 0 2 1] ) -cu cerculeţ ○ sunt notate rădăcinile polinomului de la numărător numite “zerouri” - cu x sunt notate rădăcinile de la numitor sau “polii’. Există varianta: ›› [p z]=pzmap([1 4 1],[1 0 2 1]) salvare poli şi zerouri în p şi z , fără reprezentare grafică. 1.10. Descompunerea în sumă de fracţii simple a raportului a două polinoame A(x) şi B(x) Fracţiile conţin la numitor polinoame de ordinul unu.

)(... )()(

)2()2(

)1()1(

)()( xknpx

nrpx

rpx

rxBxA ++++= −−−

unde numim r(1) ,…, r(n) reziduuri iar p(1) ,…, p(n) poli.

Se foloseşte funcţia Matlab: [r, p, k]=residue(A, B) Funcţia se poate apela şi cu efect invers, în forma: [A,B]=residue(r, p, k) caz în care sunt returnaţi coeficienţii polinoamelor A şi B.

Descompunere în fracţii simple a funcţiei G=num/den : >> [r, p, k]=residue(num, den) 12

14)( 3

2

++++

=xxxxxG

num=[1 4 1]; den=[1 0 2 1];

Şirul reziduurilor r(1), r(2), r(3): r = 0.6162 – 1.2316i 0.6162 + 1.2316i -0.2324 Obs: 2 reziduuri complex conjugate + 1 real

Şirul polilor p(1), p(2), p(3): p = 0.2267 + 1.4677i 0.2267 – 1.4677i -0.4534 Obs: 2 poli complex conjugaţi + 1 real

Rest: k = [ ]

Se înlocuiesc valorile obţinute pentru reziduuri şi poli:

-0.4534)( 0.2324-

1.4677i) 0.2267(1.2316i 0.6162

1.4677i) 0.2267(1.2316i - 0.6162

)3()3(

)2()2(

)1()1(1214

)()(

3

2

−−−+

+−−−−

++++

++=++=

==

xxxpxr

pxr

pxr

xxxx

xBxA

1.11. Regresie polinomială Se va aproxima un set de date generat de valorile unui polinom în intervalul -3...5, la care se adaugă valori aleatoare: p=[1 2 1 -5 ]; t=-3:.1:5;

Page 35: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

35

y=polyval(p,t); %calcul val polinomiale y1=y+15*randn(size(y)); fit=polyfit(t,y1,3); y2=polyval(fit,t); plot(t,y,t,y1,t,y2); grid on; 3. GRAFICE 3D 1. Curbe spaţiale (3D) – sintaxa funcţiei plot3() plot3(x,y,z) % x, y, z = vectori de coordonate ale punctelor plot3(x, y, z, ‘tip-linie’); plot3(x1, y1, z1, ‘tip-linie1’, x2,y2,z2, ‘tip-linie2’, …) plot3(X,Y,Z) Exemplu: t=0 : pi/40 : 10*pi; plot3(sin(t), sin(t) .*cos(t), 2*t); grid on; Două curbe spaţiale: plot3(sin(t), sin(t).*cos(t), 2*t, sin(t), cos(t), 2*t); sau: plot3(sin(t), sin(t).*cos(t), 2*t, '+' , sin(t), cos(t), 2*t, '-' ); % prima curba trasata din `+`, a doua din `-` Grafic spaţial dinamic - un punct trasează dinamic curba

comet3(sin(t), sin(t).*cos(t), 2*t); Matrice 3d: a=[1 2 5; 2 4 3 ; 3 4 5]; bar3(a); Curbă spaţială - reprezentare funcţie complexă de variabilă reală: a) trasare curbă

Page 36: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

36

ze=0.1; r=0: .01 :3; Ac=1./(1-r.^2+2*j*ze*r); %factor complex amplificare deplasare statică plot3(r, real(Ac), imag(Ac), 'LineWidth', 1.5); grid on; b) Se vor adăuga linii perpendiculare pe axa Or; liniile leagă puncte echidistante plasate pe axa Or cu puncte de pe curba trasată (puncte de aceeaşi abscisă). Obs. se pot folosi instrucţiunile line sau plot3 intr-un ciclu. Segmentele sunt perpendiculare coborâte de pe curbă pe axa 0r. Lungimea segmentelor reprezintă modulul funcţiei Ac pentru abscisa curentă r. ze=0.1; r=0:.01:3; Ac=1./(1-r.^2+2*j*ze*r); % factor complex amplificare deplasare a0 plot3(r, real(Ac), imag(Ac), 'linewidth', 2.5); grid on;hold on; plot3([0,3], [0,0], [0,0], 'linewidth', 1.5 ); % trasare axa Or for i=0:.02:3 Aci=1./(1-i.^2+2*j*ze*i); line([i,i],[0,real(Aci)], [0,imag(Aci)]) end Curbă spaţială - funcţie complexă ( două bucle): j=sqrt(-1); w=0: 0.001 :2; H11=(1/5)./(0.4-w.^2+j*0.01*w) + (1/2)./(2-w.^2+j*0.02*w); h=plot3(w, real(H11), imag(H11)); set(h, 'LineWidth', 2.7) grid on;

Page 37: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

37

2.Generarea unei REŢELE – MESH, ÎN PLAN [X, Y]=meshgrid(x,y) sau [X, Y]=meshgrid(x) % X – linii identice, fiecare linie conţine valorile vectorului x %Y - coloane identice fiecare coloană conţine valorile vectorului y Funcţia meshgrid foloseşte domeniile 1D specificate prin vectorii x şi y pentru generarea tablourilor X şi Y . Aceste tablouri sunt folosite la evaluarea funcţiilor de două variabile z=f(x,y) prin funcţiile Matlab mesh şi surf cu reprezentare 3D. ›› [X,Y]=meshgrid(0:4, 6:2:10) X = 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 Y = 6 6 6 6 6 8 8 8 8 8 10 10 10 10 10

Domeniul este dreptunghiular: -primul vector 0:4 generează matricea X - liniile sunt identice şi conţin valorile vectorului 0:4 pe axa x -atâtea linii câte valori sunt în vectorul 6:2:10 (direcţia oy). -al doilea vector 6:2:10 generează matricea Y -coloanele sunt identice şi conţin valorile vect. 6:2:10 pe axa y -atâtea coloane câte valori sunt în vect. 0:4 (pe direcţia ox). Cele două matrice X şi Y au acelaşi număr de lin. şi col. PERECHILE (X(i,j), Y(i,j) ) formează reţeaua de puncte din domeniul 2D oxy, dreptunghiular, de definiţie al funcţiei z=f(x,y)

›› [X,Y]=meshgrid(3:6) X = 3 4 5 6 3 4 5 6 3 4 5 6 3 4 5 6 Y = 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6

Domeniul este pătrat. Perechile de puncte din plan sunt de forma: ( X(i,j), Y(i,j) ): (3,3), (4,3), (5,3), (6,3), (3,4), (4,4) etc.

1. Reprezentare suprafeţe funcţia mesh - reprezentare wireframe funcţia surf - suprafeţe netede.

Matlab reprezintă suprafeţe prin cote z = valori ale funcţiei pentru o reţea de puncte din planul oxy. Punctele de cotă z adiacente sunt conectate prin segmente colorate de dreaptă (wireframe) în cazul funcţiei mesh şi colorează faţete pentru comanda surf.

Fie o funcţie de forma z=f(x,y):

( ) 2222 /sin yxyxz ++=

sau: z=sin(ra)/ra, unde ra= 22 yx + . (sau direct: Z=sin( sqrt(X .^2+Y.^2) ) . / sqrt( X .^2+Y.^2);) Etapa #1: se generează reţeaua de puncte din planul x-y [X,Y]=meshgrid(-12:.4:12, -12:.4:12);

%sau meshgrid(-12: .4: 12); Etapa #2: calcul matricea ra de valori intermediare

ra=sqrt(X .^2+Y.^2);

Page 38: Curs 345 Mar2018 upload2018 - UTClujProf.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor 1 PROGRAMARE MATLAB Prof.dr.ing. Iulian Lupea CURS 3 4. INSTRUCŢIUNI pentru

Prof.dr.ing. Iulian Lupea Programarea şi Utilizarea Calculatoarelor

38

Matricele X şi Y sunt ridicate la pătrat element cu element, adunate, apoi radicalii din fiecare element salvaţi în matricea ra. Etapa #3: calcul valori finale funcţie, cu salvare în matricea Z

Z=sin(ra) ./ ra;

Etapa #4: reprezentarea grafică subplot(211); h=mesh(X,Y,Z); % h este handle la grafic grid on; subplot(212); s2=surf(X,Y,Z); % vezi figura alăturată ->

Fiecare matrice X,Y,Z conţine coordonatele x, y respectiv z ale tuturor punctelor din grafic.

Etapa #5: editare grafic: get(h) % listează pe ecran setul de proprietăţi ale graficului asociat set(h, 'LineWidth', 1.7)

%set(h, …) se impune lăţimea liniei de trasare a graficului sau alte proprietăţi ale graficului asociat.

title('Functia sinc cu surf'); xlabel('axa x'); ylabel('axa y'); text(0, 0, 0.5 ,’vârf’); Exemplul #2:

[X,Y]=meshgrid(-10:16); Z=sqrt(X .^2+Y .^2); surf(X,Y,Z);