a a 5 -6 lezione di laboratorio Laurea Ingegneria CIVILE Lauree Specialistiche in Ingegneria CHIMICA, ELETTRONICA, AMBIENTE a.a. 2007-2008 1 Come creare un grafico 2-D Sintassi per disegnare una curva con: • specifica dei dati nel vettore x e/o y • specifica del colore e dello stile della linea plot(x, y, ‘colore_stilelinea’) Sintassi per disegnare più curve: plot(x1, y1,’r*’,x2, y2,‘b-’,...) 2 Completamento di un grafico Per completare un grafico si può aggiungere: • un titolo: title('Grafico ed …'); • la griglia: grid; • le label sugli assi: xlabel('x');ylabel('y') 3 Editore grafico Uno dei modi per migliorare l’aspetto di un grafico è il seguente: selezionare View e, dal menu che compare, scegliere Plot Edit Toolbar; nella finestra compare una seconda barra. 4 Come operare con l’editor grafico Le icone indicate dalle linee, consentono di inserire testo, frecce e linee su una figura. Cliccando sull’icona si ottengono i tool del plot che consentono di modificare la grafica della figura. 5 Come inserire un testo sulla figura 1. Selezionare l’icona T dalla barra oppure cliccare su ‘Insert’ e scegliere TextBox 1. Posizionarsi nel punto desiderato e scrivere 2. Scrivere x_3 per ottenere x3 (opp. x^3 per x3) 3. cliccare fuori dal riquadro per rendere attivo lo scritto 6 Come inserire una freccia sulla Selezionare figura • l’icona oppure dal menu di Insert selezionare Arrow • Posizionarsi nel punto di inizio della freccia, trascinare il mouse tenendo premuto il suo tasto sinistro fino al punto di arrivo della freccia. 7 Esercizio 1 a - Scrivere un file script che consenta di disegnare, sull’intervallo [0,4], le funzioni: y=3*sin(pi*x) e y=exp(-0.2*x) nella stessa finestra grafica. Si consideri la partizione x=0:0.02:4. b - Inserire le label per gli assi x, y ed il titolo. c - Usare gtext per indicare i vari punti di intersezione delle due curve. d - Memorizzare il file col nome grafico. 8 File grafico.m clear all x=0:0.02:4; y=3*sin(pi*x); plot(x,y,'r'),xlabel('x');ylabel('y');grid hold on y1=exp(-0.2*x); plot(x,y1,'g') %osservare il numero delle intersezioni gtext('x1');gtext('x2');gtext('x3');gtext('x4'); % oppure %C=strvcat(‘x1’,’x2’,’x3’,’x4’); %gtext(C) title('Grafico ed intersezioni di 3*sin(pi*x) e exp(0.2*x)') hold off 9 Risultato esercizio 1 » title('Grafico ed …') gtext etichetta asse y »gtext('x3') » ylabel('y') etichetta asse x » xlabel('x') 10 Esercizio 2 Scrivere un file script che consenta di disegnare, nell’intervallo [-2,2] e su due “finestre grafiche distinte ”, il grafico della funzione: f(x)=exp(-x2)cos(20x) che viene definita nella function fun. Si utilizzino i due comandi MATLAB: • plot per la figura 1 • fplot per la figura 2. N.B. Nell’utilizzare il comando plot si può considerare la partizione x=[-2:0.1:2] . 11 Soluzione esercizio 2: comando plot function y=fun(x) y=exp(-x.^2).*cos(20*x); figure(1) x=[-2:0.1:2]; y=fun(x); plot(x,y),title('Comando plot') xlabel('x');ylabel('y'); grid 12 Soluzione esercizio 2: comando fplot function y=fun(x) y=exp(-x.^2).*cos(20*x); figure(2) I=[-2,2]; fplot('fun',I), grid % Matlab ver.6 % utilizzabile anche nella ver. 7 title('Comando fplot') xlabel('x');ylabel('y') figure(3) % metodo alternativo I=[-2,2]; fplot(@fun,I), grid % Matlab ver.7 title('Comando fplot') xlabel('x');ylabel('y') 13 Figura 1 14 Figura 2 e 3 (sono uguali) 15 Comandi plot e fplot E’ possibile utilizzare i comandi plot e fplot, senza definire un file function esterno: x=[-2:0.1:2]; y=exp(-x.^2).*cos(20*x); figure(1) plot(x,y),grid %oppure f='exp(-x.^2).*cos(20*x)';%stringa %y=eval(f); %crea il vettore di dimensione % =length(x) %plot(x,y),grid f='exp(-x.^2).*cos(20*x)';% stringa figure(2) 16 fplot(f,[-2,2]),grid Comando ezplot Il comando ezplot consente di graficare funzioni date in forma implicita ed in forma parametrica figure(1) ezplot('x.^2-y.^2-1',[-4 4 -4 4]) %forma implicita 17 figure(2) ezplot('cos(t)','sin(t)') % forma parametrica 18 Più grafici in una finestra grafica E’ possibile inserire più di un grafico nella stessa finestra grafica . 1) % Comando fplot fplot(@(x)[sin(2*x) x.*exp(-x)], [-1 1]) %Matlab7 % Comando plot x=-1:0.1:1; 2) y1=sin(2*x); y2=x.*exp(-x); plot(x,y1,x,y2) 1 0.5 0 -0.5 Alternativamente si può -1 utilizzare il comando hold on: -1.5 fplot('sin(2*x)',[-1 1]) hold on fplot('x.*exp(-x)',[-1 1]) hold off -2 -2.5 19 -3 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 Più finestre grafiche in una sola figura: subplot %file figure x=0.1:.1:5; subplot(2,3,1);plot(x,x); title('y=x');xlabel('x'); ylabel('y'); subplot(2,3,2);plot(x,x.^2); title('y= x^2');xlabel('x'); ylabel('y'); subplot(2,3,3),plot(x,x.^3); title('y= x^3');xlabel('x'); ylabel('y'); subplot(2,3,4),plot(x,cos(x)); title('y=cos(x)');xlabel('x');ylabel('y'); subplot(2,3,5),plot(x,cos(2*x)); title('y=cos(2x)');xlabel('x');ylabel('y') subplot(2,3,6),plot(x,cos(3*x)); title('y=cos(3x)');xlabel('x');ylabel('y') % I colori e lo spessore sono stati % aggiunti utilizzando i tool del plot 20 Risultati file figure 21 Comandi: plot e semilog Due modi di graficare la funzione y e x 0,50 x Scala lineare su entrambi gli Assi 6 x 10 21 plot 10 5 x=0:0.1:50; y=exp(x); subplot(1,2,1);plot(x, y); grid;title('plot') subplot(1,2,2); semilogy(x,y); grid;title('semilogy') 10 4 10 25 semilogy 20 15 3 10 10 2 10 1 0 0 20 40 60 10 5 0 0 20 40 Scala logaritmica sull’Asse Y 60 22 Esercizio 3 (Esame 02/12/2002) Si considerino i sistemi lineari Ai xi=bi, i=1,2,3, con i vettori dei termini noti bi, i=1,2,3, scelti in modo che la soluzione dei sistemi sia i=[1,1,1,1]T, i=1,2,3. Supponiamo che: 15 6 8 11 6 6 5 3 i A1 , A i A1 per i 2, 3. 8 5 7 6 11 3 6 9 23 Quesito 1 Si determini, mediante MATLAB, il condizionamento K2(Ai ), i = 1, 2, 3 e si verifichi che K2(Ai ) = (K2 ( A1 ) )i , i=2, 3. Si spieghi il motivo di tale relazione e se ne prevedano le conseguenze. 24 Quesito 2a Si costruisca un file MATLAB: Cognome_Nome.m, che una volta avviato: a) faccia visualizzare una schermata con i dati personali (cognome, nome, matricola, corso di Laurea) ed una breve presentazione del problema; 25 Quesito 2b b) mediante un ciclo for, determini i dati Ai , bi , i=1, 2, 3; risolva quindi i sistemi Ai x i b i applicando il metodo di Gauss con pivoting parziale; calcoli l’errore relativo in norma 2; 26 Quesito 2c c) faccia visualizzare una tabella riassuntiva che riporti: intestazione: indice iter soluzione errore e su ogni riga il valore dell’indice i della matrice, il numero di iterazioni iteri effettuate nel raffinamento, la soluzione corrispondente x i scritta come vettore riga e l’errore relativo erri ; Si utilizzino i seguenti formati di stampa: 1 cifra intera per il valore di i ; 2 cifre intere per il valore di iteri ; 10 cifre decimali e formato virgola fissa per le componenti di x i ; 2 cifre decimali e formato esponenziale per erri . 27 Soluzione teorica del Quesito 1 Proprietà della matrice A e conseguenze: 1 A1 A1T A11 A1T A1 2 A A1 T 1 A11 K 2 A1 A1 2 2 A1 2 2 A1 A1 A1T A11 A11 1 1 2 A A1 A 1 1 max A1 min A1 28 Soluzione teorica del Quesito 1 Proprietà delle matrici A i , i 2, 3 A 2 A1 A 2 A per la simmetria di A 1 . 2 A2 A 2 1 2 2 T 2 A A A quindi: A A A A2 A K 2 A2 A 2 1 2 2 2 2 1 2 1 2 2 Analogamente per i = 3. 1 1 1 1 K2(A1) 1 1 29 2 Istruzioni relative al Quesito 1 % file script: punto1.m clear all disp('Numero di condizionamento delle matrici Ai') A1=[15 6 8 11 ; 6 6 5 3 ; 8 5 7 6; 11 3 6 9]; cond_Ai=[];cond_A=[]; for i =1:3 Ai=A1^i; cond_Ai=[cond_Ai,cond(Ai)]; % vettore dei cond(Ai) cond_A=[cond_A,cond(A1)^i]; % vettore dei cond(A1)^i end disp('cond(Ai)') disp(num2str(cond_Ai,'%13.3e')) disp('(cond(A1))^i') disp(num2str(cond_A,'%13.3e')) 30 Output punto1 >> punto1 Numero di condizionamento delle matrici Ai cond(Ai) 6.499e+003 4.224e+007 2.746e+011 (cond(A1))^i 6.499e+003 4.224e+007 2.745e+011 Indicheremo con K1, K2, K3 il condizionamento in norma 2 delle matrici A1, A2, A3 rispettivamente. Conseguenze del numero di condizionamento grande? 31 Calcolo della soluzione di 446 199 A2 272 330 199 272 330 106 131 141 , 131 174 199 141 199 247 A2 x b 2 1247 1 1 577 , b2 1 776 1 917 >> x2=A2\b2 % Operatore \ Numero di cifre significative perse x2 = >> nc=log10(K2) 1.00000000037954 nc = 7.6257 0.99999999968201 1.00000000023455 0.99999999948547 >> err2=norm(x2-alpha)/norm(alpha) 10 cifre signific., err2 = 3.76e-010=.376e-009 32 9 decimali corretti Oltre che sul numero di cifre significative che si perdono, come incide il valore grande di K2(A2)? >> A2m=A2; >> A2m(2,2)=A2(2,2)+1e-3; % perturbazione data % sulla matrice >>pert=norm(A2-A2m)/norm(A2) pert = 1.0546e-006 % entità della perturbazione >> x2m=A2m\b2 % soluzione perturbata x2m = 2.06050813471394 0.11143302866360 1.65544907516937 -0.43770893706830 >> err2m=norm(x2m-alpha)/norm(alpha) 33 err2m = 1.0501 >100% !!! Istruzioni relative al Quesito 2a clear all disp('Cognome e nome studente: XXXX XXX') disp('Numero di matricola: XXXX') disp('Corso di Laurea: XXXX') disp(' ') disp('Questo programma calcola e visualizza la soluzione dei ') disp('sistemi lineari A_i x_i=b_i, i =1,2,3, con i vettori b_i tali che sia') disp('alpha=[1,1,1,1]'',essendo: ') A1=[15 6 8 11;6 6 5 3;8 5 7 6;11 3 6 9]; disp('A1=');disp(A1) disp( 'e A_i= A1^i per i=2,3.') 34 Output file Cognome_Nome.m >> Cognome_Nome Cognome e nome studente: XXXX XXX Numero di matricola: XXXX Corso di Laurea:XXXX Questo programma calcola e visualizza la soluzione dei sistemi lineari A_i x_i=b_i, i =1,2,3, con i vettori b_i tali che sia alpha=[1 1 1 1]', essendo: A1= 15 6 8 11 6 6 5 3 8 5 7 6 11 3 6 9 35 e A_i= A1^i per i=2,3. Istruzioni relative al Quesito 2b Istruzioni di Gausspv_r.m tab=[]; toll=1e-13; alpha=ones(4,1); % soluzione for i =1:3 A=A1^i; b=A*alpha; % vettore termini noti % [L,U,P] %La chiamata =dilu(A); Gausspv_r è: [x,iter] = Gausspv_r(A,b,toll) %y=L\(P*b); %x=U\y; %[x,iter]=Raff_iter(A,b,L,U,P,x,toll); residuo=b-A*x; norm_residuo=norm(b-A*x); err=norm(alpha-x)/norm(alpha); tab=[tab;[i,iter,x',err,norm_residuo]]; 36 end Risultati File Quesito 2b Tabella Quesito 2c fprintf('i iter \t\t\t soluzione \t\t \t\t errore residuo\n') fprintf('%1d %2d %14.10f %14.10f %14.10f %14.10f %10.2e %10.2e \n',tab'); i iter 1 0 1.0000000000 2 0 1.0000000007 3 0 0.9999998145 soluzione 1.0000000000 1.0000000000 0.9999999994 1.0000000004 1.0000001554 0.9999998854 errore residuo 1.0000000000 8.17e-015 3.55e-015 0.9999999991 6.81e-010 1.97e-013 1.0000002514 1.84e-007 0.00e+000 Nell’ultimo caso calcolando la stima del numero di cifre che si perdono, si ottiene: Numero di cifre significative perse >> nc=log10(K3) nc = 11.4386 37 Istruzioni utilizzate in Raff_iter function [x,iter]=Raff_iter(A,b,L,U,P,x,toll) %_________________________________________ ... iter=0; residuo=b-A*x; while norm(residuo)>toll*norm(b)& iter<100 y=L\(P*residuo); err=U\y; x=x+err; residuo=b-A*x; iter=iter+1; end if iter==100 disp('Raggiunto il numero massimo di iterazioni') end 38 Esercizio 4 Sia dato il sistema lineare avente la matrice dei coefficienti ed il vettore dei termini noti così assegnati: 4 1 0 0 0 0 3 1 5 2 0 0 0 2 0 2 6 3 0 0 1 A b 0 0 3 5 1 0 1 0 0 0 1 3 1 3 0 0 0 0 1 2 4 39 Quesiti 1 e 2 1. Si studi la convergenza dei metodi di Jacobi, Gauss-Seidel e Rilassamento in serie (SOR) per il sistema assegnato. 2. Si dica quale di questi metodi è il più veloce giustificando teoricamente la risposta e calcolando, mediante Matlab, i raggi spettrali delle rispettive matrici di iterazione ed il valore ottimale del parametro per il metodo SOR. 40 Quesito 3a 3. Si costruisca un file MATLAB che: a) calcoli la soluzione numerica del problema assegnato applicando il metodo con convergenza migliore e fissando una precisione non inferiore a 1.e-4, nmax=20 ed un vettore di innesco pari a x0=[1 1 1 1 1 1]T; 41 Quesito 3b b) faccia visualizzare una tabella riassuntiva che riporti: intestazione: iterazioni soluzione residuo; e su ogni riga, il numero dell’ iterazione i , la soluzione approssimata corrispondente e la norma xi del residuo resi ; Si utilizzino i seguenti formati di stampa: 2 cifre intere per il valore di i ; 5 cifre decimali e formato virgola fissa per la soluzione approssimata x i ; 1 cifra decimale e formato esponenziale per la norma del residuo erri . 42 Convergenza dei metodi Caratteristiche di A: a) diagonalmente dominante Jacobi conv. b) tridiagonale anche Gauss-Seidel converge; inoltre: BGS 2 BJ R BGS 2R BJ c) simmetrica d) definita positiva perché è a), c) e tutti gli elementi sulla diagonale principale sono positivi. 43 Qual è il metodo più veloce? Per la proprietà d) SOR converge per : 0 < < 2; è inoltre il metodo più veloce se si assume: ott 2 1 1 BGS . 44 Istruzioni relative al Quesito 2 I0=[4 5 6 5 3 2];I1=[1 2 3 -1 1]; A=diag(I0)+diag(I1,-1)+diag(I1,1) D=diag(diag(A)); [n,m]=size(A); B_J=eye(n)-inv(D)*A; % metodo di Jacobi rho_J=max(abs(eig(B_J))) R_J=-log(rho_J) omega=1; % metodo di Gauss-Seidel OE=omega*tril(A,-1); B_GS=eye(n)-omega*inv(D+OE)*A; rho_GS=max(abs(eig(B_GS))) R_GS=-log(rho_GS) omega_ott=2/(1+sqrt(1-rho_GS)) % metodo SOR OE=omega_ott*tril(A,-1); B_r=eye(n)-omega_ott*inv(D+OE)*A; rho_r=max(abs(eig(B_r))) 45 R_r=-log(rho_r) Risultati file Quesito 2 rho_J = 0.7196 R_J = 0.3290 rho_GS = 0.5179 R_GS = 0.6580 omega_ott = rho_r = 1.1804 0.1804 R_r = 1.7126 46 Istruzioni relative al Quesito 3 b=[3 -2 1 -1 3 4]';K=cond(A,inf); precisione=input('precisione = '); % 1.e-4 toll=precisione/K % toll = 9.3310e-006 x0=ones(n,1);omega=omega_ott;nmax=20; [x,iter,res,rho]=Gauss_Seidel_ril(A,b,x0,omega,nmax,toll); it=[0:iter]';tab=[it x res]; s='--------------------------------------------'; disp(s) fprintf('iter soluzione errore\n') fprintf('%2d %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %9.1e\n',tab'); 47 Risultati file Quesito 3 iter soluzione errore -----------------------------------------------------------------0 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 2.5e+000 1 0.40980 -1.22145 -0.09326 -0.11434 0.56155 1.84897 1.1e+000 2 1.17181 -0.48443 0.47164 -0.41692 0.18755 1.91655 4.2e-001 3 0.81686 -0.80030 0.67260 -0.59295 0.15916 1.92112 1.3e-001 4 0.97411 -0.87533 0.76977 -0.63672 0.14526 1.92850 3.4e-002 5 0.96788 -0.90620 0.79022 -0.64659 0.14099 1.92969 8.7e-003 6 0.97811 -0.91270 0.79491 -0.64914 0.14028 1.92989 1.1e-003 7 0.97819 -0.91376 0.79599 -0.64961 0.14015 1.92993 3.4e-004 8 0.97849 -0.91415 0.79622 -0.64972 0.14011 1.92995 5.1e-005 9 0.97855 -0.91421 0.79627 -0.64974 0.14010 1.92995 1.3e-005 10 0.97855 -0.91422 0.79628 -0.64975 0.14010 1.92995 2.5e-006 Si invitano gli studenti a determinare la soluzione con precisione = 1.e-8 e riportare le componenti della soluzione approssimata con 10 cifre e48 virgola fissa. Esercizio 5 (Esame 05-12-05) Sia data la seguente matrice: 6.36091 0 1.6685 A 0.9371 0 2.5369 1.6685 0.9371 0 2.5000 0 0 0 0 3.4695 0 0 0 0 0 0 0 0 1.8615 2.5369 0 1.8615 4.6653 0 0.8399 0 2.0000 0 0.8399 0 5.8043 e vettore b tale che la soluzione del sistema Ax b sia [1 1 1 1 1 1]' . 49 Quesiti 1, 2 e 3 1 - Dopo aver determinato con MATLAB gli autovalori, si deduca motivando la risposta, la caratteristica fondamen_ tale della matrice; 2 - si determini il condizionamento in norma 2 e si dica, sempre motivando la risposta, se il sistema è ben condi_ zionato calcolando, inoltre, il numero di cifre significative che si perdono, rispetto alle 16 del MATLAB, risolvendo il sistema; 3 - Si costruisca un file MATLAB: Cognome_NomeStudente.m che, una volta avviato: 50 Quesiti a), b) e c) a- faccia visualizzare una schermata con i dati personali e una breve presentazione del problema; b- calcoli la soluzione numerica del sistema assegnato con il metodo di Gauss e raffinamento iterativo con una tolleranza di 1e-14 e calcoli l’errore relativo; calcoli anche, sempre con lo stesso metodo, la soluzione del sistema che ha la stessa matrice dei coefficienti e vettore termini noti perturbato, rispetto a quello dato, nel termine b(4) della quantità 10 4 ; c- faccia visualizzare una tabella in cui si riporti: intestazione: iterazioni soluzione errore, il numero di iterazioni eseguite nel raffinamento, la soluzione ottenuta e l’errore relativo nel primo e nel 51 secondo caso Quesito 4 utilizzando i seguenti formati di stampa: 3 cifre e formato intero per il numero dell’ iterazione, 6 cifre decimali e virgola fissa per le soluzioni nei due casi, 2 cifre decimali e formato floating point per l’errore nel primo caso. 4- Si confrontino e si commentino i risultati. 52 Istruzioni relative al quesito 1 clear all clc % Costruzione della matrice d=[6.36091 2.5 3.4695 4.6653 2 5.8043]; n=length(d); d1=zeros(1,n-1); d2=[-1.6685 0 0 -0.8399];d3=[-0.9371 0 1.8615]; d4=zeros(1,n-4);d5=2.5369; A1=diag(d1,1)+diag(d2,2)+diag(d3,3)+diag(d4,4)+diag(d5,5); A2=A1'; A=(A1+A2+diag(d)) alpha=ones(n,1);b=A*alpha Simmetria=(A==A'); if Simmetria==1 disp('A e'' simmetrica') end autovalori=eig(A) if autovalori>0 disp('A e'' definita positiva') 53 end Istruzioni relative ai quesiti 2 e 3 K2=cond(A) % stima cifre perse cifre_perse=round(log10(K2)) toll=1e-14; [x,iter]=Gausspv_r(A,b,toll); err_rel=norm(x-alpha)/norm(alpha); bp=b; bp(4)=b(4)+1e-4;pert=norm(b-bp)/norm(b) [x1,iter1]=Gausspv_r(A,bp,toll); err_rel1=norm(x1-alpha)/norm(alpha); tab=[[iter;iter1] [x';x1'] [err_rel;err_rel1]]; st='%3d'; for i=1:n st=[st,' %10.6f ']; end st=[st,'%10.2e \n']; fprintf('iter \t\t\t\t soluzione \t\t\t\t\t\t errore \n\n') fprintf(st,tab') 54 Risultati quesito 1 A = 6.3609 0 -1.6685 -0.9371 0 2.5369 b = 6.2922 2.5000 3.6625 2.8883 2.0000 9.3628 format short 0 2.5000 0 0 0 0 -1.6685 0 3.4695 0 0 1.8615 A e' simmetrica A e' definita positiva -0.9371 0 0 4.6653 0 -0.8399 0 0 0 0 2.0000 0 2.5369 0 1.8615 -0.8399 0 5.8043 autovalori = 1.0000 2.0000 2.5000 4.3000 6.0000 9.0000 55 Tabella dei risultati iter soluzione 0 1.000000 0 1.000002 1.000000 1.000000 1.000000 1.000000 1.000000 1.000022 errore 1.000000 1.000000 1.000000 1.11e-016 1.000002 9.21e-006 pert=7.9240e-006 K2 = 9.0001 Quindi: cifre_perse = Il condizionamento K2 di A è buono. A piccole perturbazioni sui dati corrispondono piccole variazioni sui risultati. 1 56