aa 7 8 lezione di laboratorio Laurea Ingegneria CIVILE Lauree Specialistiche in Ingegneria CHIMICA, ELETTRONICA, AMBIENTE a.a. 2007-2008 Comando ezsurf ezsurf 0.4 0.3 0.5 0.2 0.1 0 0 -0.1 -0.5 2 -0.2 1 2 0 1 -0.3 0 figure(1) -0.4 -1 -1 z='X.*exp(-(X.^2+Y.^2))'; Y -2 -2 X ezsurf(z,[-2,2,-2,2]); %se non si specifica l’insieme la superficie è disegnata nel dominio di default -2*pi<x<2*pi,-2*pi<y<2*pi colorbar; title(' ezsurf') Comando ezcontour Con il comando contour tracciamo le linee di livello nel dominio fissato, se non si fornisce vengono plottate nel dominio di default figure(2) z='X.*exp(-(X.^2+Y.^2))'; 2 ezcontour(z,[-2,2,-2,2]); X exp(-(X. 2+Y.2)) 1.5 1 Y 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 Comando ezsurf Il comando ezsurf permette di rappresentare anche superfici date in coordinate parametriche ad esempio: figure(3) funx='2*cos(s)'; funy='2*sin(s)'; funz='z'; ezsurf(funx,funy,funz) x = 2 cos(s), y = 2 sin(s), z = z z 5 0 -5 2 1 1 0 -1 y -2 -2 0 -1 x 2 Comando surf % Le istruzioni servono per i tre grafici che seguono. x=-2:.2:2;y=-2:.2:2; [X,Y]=meshgrid(x,y); Z=X.*exp(-(X.^2+Y.^2)); surf 0.4 0.3 0.5 % comando surf figure(4) surf(X,Y,Z);colorbar 0 title('surf') 0.2 0.1 0 -0.1 -0.5 2 -0.2 1 2 1 0 0 -1 -1 -2 -2 -0.3 -0.4 Comando contour contour 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 figure(5) contour(X,Y,Z,20) -0.5 0 0.5 1 1.5 2 % si specifica il numero di curve %contour(X,Y,Z,[-.4:.2:.4]) %si specificano i valori in cui si vogliono le curve title('contour') Comando quiver quiver 2.5 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 figure(4) [px,py]=gradient(Z,.2,.2);%[px,py]=gradient(Z); quiver(X,Y,px,py) title('quiver') quiver e contour 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 figure(5) contour(X,Y,Z,20;hold on quiver(X,Y,px,py);hold off 0.5 1 1.5 2 Esercizio 1 Sia dato il seguente problema alle derivate parziali (pde): ut 3ux 0 x 0,10 , t 0 u x , 0 x x 2 exp 2 x 2 2 2 u 0, t t 3t 2 exp -2 3t 2 Quesiti a, b a) Si verifichi che la funzione: 2 1 u x, t x 3t 2 exp 2 x 3t 2 è soluzione del problema. b) Si valuti l’errore assoluto che si commette se si usa il “metodo upwind” ed il “metodo implicito”, fissando il numero di intervalli temporali M = 10, al variare del passo temporale k e considerando il valore del passo spaziale h=0.25. Si indichi con N il numero degli intervalli spaziali sull’asse x. Soluzione del quesito a): Verifica 1 u x, t x 3t 2 exp 2 x 3t 2 ux exp 2 x 3t 2 2 ; 1 4 x 3t 2 ut 3 exp 2 x 3t 2 Quindi 2 2 2 1 4 x 3t 2 2 ut 3ux 0, e: u x,0 x 2 exp 2 x 2 , 2 u 0, t 3t 2 exp 2 3t 2 . 2 Quesito b): Metodo UPWIND Approssimazioni utilizzate: ui , j 1 ui , j u , x , t t i j k ui , j ui 1, j u x , t x i j h ck 3k 0 si ottiene: Indicando quindi h h u i , j 1 1 u i , j u i 1, j 2 u i ,0 xi 2 *exp 2* xi 2 u 3t 2 *exp 2* 3t 2 j j 0, j i 1, 2, , N , j 0,1, i 0,1, 2, , N 2 j 0,1, Problema discreto Se si assume per ogni livello temporale j: T U j u1, j , u2, j , , uN , j , V j u0, j ,0, T ,0 t j ,0, T ,0 , il problema discreto diventa: U j 1 AU j V j Sappiamo che se: ck 1, h il metodo CONVERGE quando h, k 0 . Costruzione delle formule Dalle relazioni: ui , j 1 1 ui , j ui 1, j i 1,2, , N , j 0,1, si ottiene, per ogni livello temporale j, tenendo anche conto della condizione al contorno la seguente equazione vettoriale: u1 j 1 1 u2 j 1 uN j 1 0 j 0 u1 j u 2j 0 . 1 uN j 0 Forma della matrice A Si deduce allora che la matrice A, di dimensioni NxN ,per ogni j, ha la forma: 1 A 0 e, nell’ipotesi 0 , 1 0 1, risulta: A A 1 1 1 1. Il metodo è condizionatamente stabile!!! Quesito b): Metodo IMPLICITO In questo caso si colloca la pde in x ,t i j 1 e si approssimano le derivate parziali con: ui , j 1 ui , j u , t xi ,t j1 k ui , j 1 ui 1, j 1 u x xi ,t j1 h due differenze all’indietro!! ck 3k Si indica ancora: h h , il problema diventa: Problema discretizzato con il metodo implicito 1 ui , j 1 ui 1, j 1 ui , j 2 ui ,0 xi 2 * exp 2* xi 2 u 3t 2 * exp 2 3t 2 2 j j 0, j i 1, 2, i 0,1, Indicando ancora: U j u1, j , u2, j , V j 1 u0, j 1 , 0, , 0 t j 1 , 0, T , N , j 0,1, ,N j 0,1, T , uN , j , T , 0 , si ottiene il sistema: Sistema relativo al metodo implicito AU j 1 U j V j 1 sistema lineare, 1 A 0 Poiché risulta: 0 , La formula per l’errore è: 1 1 E j 1 A E j 1 A 1 1 h, k , il metodo converge quindi per: h, k !!! Convergenza incondizionata!!! Istruzioni relative al quesito b) clear all; clc t0=0;x0=0;xN=10;h=0.25; M=10;c='3';c1=eval(c); f='(x-2).*exp(-2*(x-2).^2)';% cond. iniziale g='-(3*t+2).*exp(-2*(3*t+2).^2)';%cond.contorno r='0';%termine noto fprintf(['M =',num2str(M),'\n\n h k k+h alpha err_imp err_up \n']) Uveras='(X-c1*T-2).*exp(-2*(X-c1*T-2).^2)'; for k=[0.05 h/3 0.1 0.5] alpha=c1*k/h; hpk=h+k; [x,t,sol1]=PDE_upwind(t0,M,x0,xN,h,k,c,r,f,g); [x,t,sol2]=PDE_implicito(t0,M,x0,xN,h,k,c,r,f,g); [X,T] = meshgrid(x,t);Uvera=eval(Uveras); err1=abs(Uvera-sol1);% matrice degli errori: upwind err2=abs(Uvera-sol2);% matrice degli errori: implicito errore_max_up=max(max(err1)); errore_max_imp=max(max(err2)); tab=[h k h+k alpha errore_max_imp errore_max_up]; fprintf('%6.2f %8.4f %8.4f %6.2f %13.4e %13.4e \n',tab') end Function PDE_upwind x=(x0:h:xN)'; x(end)=xN; N=length(x)-1; tM=k*M+t0; t=linspace(t0,tM,M+1)'; U0=eval(f).*ones(N+1,1); %condizione iniziale U(x,t0) vv=eval(g).*ones(M+1,1); %condizione al contorno U(x0,t) Vj=zeros(N,1); Uj=U0(2:N+1);sol=U0'; t=t0;x=x(2:end); for j=1:M alpha=(eval(c)*k/h).*ones(N,1); tnoto=eval(r).*ones(N,1); A=diag(1-alpha)+diag(alpha(2:end),-1); Vj(1)=vv(j); Uj1=A*Uj+alpha(1)*Vj +k*tnoto; sol=[sol;[vv(j+1); Uj1]']; Uj=Uj1; t=t+k; end t=linspace(t0,tM,M+1)';x=[x0;x]; Function PDE_implicito x=(x0:h:xN)'; x(end)=xN; N=length(x)-1; tM=k*M+t0; t=linspace(t0,tM,M+1)'; U0=eval(f).*ones(N+1,1); %condizione iniziale U(x,t0) vv=eval(g).*ones(M+1,1);%condizione al contorno U(x0,t) Vj1=zeros(N,1);sol=U0';Uj=U0(2:N+1); t=t0;x=x(2:end); for j=1:M t=t+k; alpha=(eval(c)*k/h).*ones(N,1); tnoto=eval(r).*ones(N,1); A=-diag(alpha(2:end),-1)+diag(1+alpha); Vj1(1)=vv(j+1); b=Uj+alpha(1)*Vj1 +k*tnoto; Uj1=A\b; sol=[sol;[vv(j+1); Uj1]']; Uj=Uj1; end t=linspace(t0,tM,M+1)';x=[x0;x]; Risultati al variare del passo k h 0.25 0.25 0.25 0.25 k 0.05 h/3 0.1 0.5 0.6 1 1.2 6 M = 10 Errore max IMP Err max UPW 0.2467 0.1249 0.2878 4.4409e-016 0.2957 0.3387 0.3523 9.9564e+006 h+k 0.30 0.3333 0.35 0.75 1: entrambi i metodi sono consistenti: O h k sono stabili, e quindi convergono. 1: l’ implicito converge, upwind è instabile! e quindi non converge. 1 Osservazione sul caso Linee caratteristiche : x 3t x0 k 1 1 1 = coeff. angolare delle caratteristiche!!! h 3 c il metodo upwind fornisce: 0 1 con A 0 1 0 . 0 U j 1 AU j Vj Commenti sul caso 1 Si ottiene, per la forma di A, U j 1 t j u1, j T uN 1, j u2, j se j 0 U1 0 u1,0 u2,0 uN 1,0 Sono valori corretti perché assegnati dalle condizioni. Lo stesso per j > 0. In questo caso, il metodo upwind calcola la soluzione esatta, i nodi sono tutti sulle rette caratteristiche!!!! T Rappresentazione della soluzione e delle curve di livello % % Rappresentazione della superficie e delle % curve di livello % k=h/3 [X,T]=meshgrid(x,t); figure(1) S=surfl(X,T,sol1); %surfl title('soluzione approssimata:metodo upwind') xlabel('x'),ylabel('t') figure(2) C=contour(X,T,sol1,20); %20 curve di livello title('Curve di livello') xlabel('x'),ylabel('t') Superficie: metodo upwind h=0.25, k=h/3 Soluzione approssimata: metodo upwind 0.4 0.2 0 -0.2 -0.4 1 10 0.5 t 5 0 0 x Andamento della soluzione al variare di t per x fissato. Si ottiene selezionando Figure Palette dal menu del tasto View; sulla sinistra compare la lista delle variabili coinvolte. La figura presentata si ottiene premendo su sol1. Cliccando su una linea si individua a quale componente della sol1 corrisponde. 0.4 0.3 0.2 0.1 0 -0.1 -0.2 -0.3 -0.4 2 4 6 8 10 Migliore definizione dei comandi PLOT, SURF, CONTOUR Se si vuole definire meglio le figure, conviene utilizzare istruzioni del tipo: H=surf(X,T,sol1); set(gca,'Fontsize',14) % 14 punti per pollice set(H, 'LineWidth',2) % spessore della linea Istruzioni analoghe per plot e contour Esercizio 2 Si consideri il seguente problema misto ai valori iniziali ed al contorno, con coefficienti non costanti: ut 2tux 0 1 u( x , 0) f x 2 1 x 1 u(0, t ) g t 1 t 4 x 0, 3 , t 0 x0 t0 Quesiti a, b a) Si determinino le linee caratteristiche e si verifichi che la soluzione del problema ai valori iniziali su tutto l’asse reale, soddisfa anche la condizione al bordo per x = 0. b) Si valuti il massimo dell’errore assoluto che si commette usando il “metodo upwind” ed il “metodo implicito” se si fissa il tempo finale tM=3 e si prendono i passi spaziali h=0.5,0.2,0.1. Soluzione del quesito a) Per individuare le caratteristiche della pde data, si risolve il problema di Cauchy: dx 2t x 0 x0 dt Esso ha la soluzione x t 2 x0 x0 x t 2 p x, t x, t e p(x,t) è la linea che collega Si verifichi ora che u x, t f x t 2 con x0 ,0 1 1 x t è la soluzione del problema pde+ condizione iniziale che soddisfa anche la condizione assegnata al bordo. 2 2 Soluzione del quesito b) clear all; clc t0=0;tM=3; % in questo caso si assegna tmax x0=0;xN=3;c='2*t';t=tM;c1=eval(c);h=[0.2 0.1 0.05]'; k=h./c1; M=round((tM-t0)./k); alpha=c1*k./h; f='1./(1+x.^2)'; %condizione iniziale g='1./(1+t.^4)'; %condizione al contorno r='0'; Uveras='1./(1+(X-T.^2).^2)'; % soluzione vera tab=[]; for i=1:length(h) [x,t,sol1]=PDE_upwind(t0,M,x0,xN,h(i),k(i),c,r,f,g); [x,t,sol2]=PDE_implicito(t0,M,x0,xN,h(i),k(i),c,r,f,g); %soluzione vera e errore massimo del metodo [X T]=meshgrid(x,t);Uvera=eval(Uveras); if i==1 %grafici per h=0.2 e k=h/6 grafici end err1=abs(Uvera-sol1);err2=abs(Uvera-sol2); err1max=max(max(err1));err2max=max(max(err2)); tab=[tab;err2max err1max]; end tab=[h k h+k alpha tab]; fprintf(['h k k+h alpha err_imp err_upw \n']) fprintf('%6.2f %8.4f %8.4f %6.2f %13.4e %13.4e \n',tab') File grafici (prima parte) figure() surf(X,T,Uvera) set(gca, 'FontWeight','bold','Fontsize',12) title('Soluzione vera');xlabel('x');ylabel('t') titolo1=['- h =', num2str(h(i))]; for m=1:2 if m==1 sol=sol1; titolo=['metodo upwind',titolo1]; elseif m==2 sol=sol2; titolo=['metodo implicito',titolo1]; end File grafici (seconda parte) figure() surf(X,T,sol) set(gca, 'FontWeight','bold','Fontsize',12) title(['Soluzione approssimata:', titolo]); xlabel('x');ylabel('t') figure() [C,H]=contour(X,T,sol,20);% 20 linee di livello set(gca, 'FontWeight','bold','Fontsize',12) set(H,'LineWidth',2) title(['Curve di livello:',titolo]) xlabel('x'); ylabel('t') Rappresentazione della soluzione vera Superficie approssimata: metodo upwind k=h/6 Curve di livello: metodo upwind k=h/6 Superficie approssimata: metodo implicito k=h/6 Curve di livello: metodo implicito k=h/6 Errori in t= tM=3 h k k+h alpha err_imp 0.20 0.0333 0.2333 1.00 3.1685e-001 0.10 0.0167 0.1167 1.00 2.1497e-001 0.05 0.0083 0.0583 1.00 1.3615e-001 err_upw 2.0392e-001 1.2541e-001 7.2635e-002 La tabella si riferisce al tempo finale tM=3; i valori di k sono stati calcolati con la relazione k=h/c(tM) dove c(tM)=2*tM e quindi k=h/6. Esercizio 3 Sia dato il seguente problema alle derivate parziali a coefficienti non costanti: ut ( t 2 x )u x e t ( x 2t 2 ) x 0 x 4, t 0 2 u ( x , 0 ) x 0 x 4, u(0, t ) 0 t 0. con soluzione vera: t (1) u( x , t ) e x . 2 Quesiti 1) e 2) 1) Si verifichi che la funzione (1) è soluzione del problema proposto e si calcoli, in corrispondenza del passo spaziale h=0.2, il passo temporale k massimo per cui il metodo esplicito converge. 2) Si valuti, per il passo spaziale h=0.2 e fissando il tempo finale tM=1, l’errore assoluto massimo che si commette usando il “metodo upwind”ed il “metodo implicito”. Quesito 3) 3) Si costruisca una tabella che riporti l’intestazione: t sol1 sol2 err1 err2 con le quantità t, sol1, sol2, err1, err2 rappresentanti rispettivamente, i nodi temporali, la soluzione numerica e l’errore ottenuti con i due metodi, da riportare uno ogni due, valutati in corrispondenza del valore x=2, utilizzando i seguenti formati di stampa: 3 cifre decimali e formato virgola fissa per i nodi, 6 cifre decimali e formato esponenziale per la soluzione nei due metodi, 2 cifre decimali e formato virgola mobile per l’errore nei due metodi. Istruzioni per risolvere i quesiti 1) e 2) clear all; clc t0=0;tM=1; x0=0;xN=4; h=0.2; c='t.^2+x'; t=tM;x=xN;k=h/eval(c);M=round((tM-t0)/k); r='exp(-t).*(2*t.^2+x).*x'; f='x.^2'; % condizione iniziale U(x,t0) g='0'; % condizione al contorno U(x0,t) [x,t,sol1]=PDE_upwind(t0,M,x0,xN,h,k,c,r,f,g); [x,t,sol2]=PDE_implicito(t0,M,x0,xN,h,k,c,r,f,g); [X T]=meshgrid(x,t); Uvera=X.^2.*exp(-T); % soluzione vera err1=abs(Uvera-sol1); err2=abs(Uvera-sol2); Costruzione delle tabelle: quesiti 2) e 3) err1max=max(max(err1));% massimo dell’errore err2max=max(max(err2));% massimo dell’errore tab=[h k h+k err2max err1max]; fprintf([h k k+h err_imp err_upw \n']) fprintf('%6.2f %8.4f %6.2f %13.4e %13.4e \n',tab') x_val=2; j=round((x_val-x0)/h)+1; tab1=[t sol1(:,j) sol2(:,j) err1(:,j) err2(:,j)]; tab1_rid=[tab1(1:2:end,:);tab1(end,:)]; fprintf(' \n\n Tabella per x=2 \n\n t \t\t sol1 \t\t sol2 \t\t err1 \t\t err2 \n') fprintf(' %7.3f %14.6e %14.6e %10.2e %10.2e \n', tab1_rid') Istruzioni per la rappresentazione grafica h1=num2str(h); k1=num2str(k); titolo1=['metodo upwind-h=',h1,', k=', k1]; titolo2=['metodo implicito-h=',h1,', k=',k1]; figure(1) surf(x,t,Uvera),xlabel('x'),ylabel('t'),title('Soluzione vera') figure(2) surf(x,t,sol1),xlabel('x'),ylabel('t') title(['Soluzione approssimata:',titolo1]) figure(3) surf(x,t,sol2),xlabel('x'),ylabel('t') title(['Soluzione approssimata:',titolo2]) figure(4) contour(x,t,sol1,20),xlabel('x'),ylabel('t') title(['Curve di livello:',titolo1]) figure(5) contour(x,t,sol2,20),xlabel('x'),ylabel('t') title(['Curve di livello:',titolo2]) Tabelle dei risultati: quesiti 2) e 3) Tabella per x=2 t sol1 0.000 4.000000e+000 0.080 3.717258e+000 0.160 3.454842e+000 0.240 3.211372e+000 0.320 2.985532e+000 0.400 2.776066e+000 0.480 2.581778e+000 0.560 2.401536e+000 0.640 2.234266e+000 0.720 2.078954e+000 0.800 1.934646e+000 0.880 1.800444e+000 0.960 1.675506e+000 1.000 1.616261e+000 h sol2 4.000000e+000 3.726409e+000 3.471142e+000 3.233120e+000 3.011265e+000 2.804522e+000 2.611861e+000 2.432298e+000 2.264889e+000 2.108743e+000 1.963017e+000 1.826920e+000 1.699703e+000 1.639202e+000 k 0.20 0.0400 k+h 0.24 err1 0.00e+000 2.48e-002 4.63e-002 6.49e-002 8.09e-002 9.48e-002 1.07e-001 1.17e-001 1.25e-001 1.32e-001 1.37e-001 1.41e-001 1.44e-001 1.45e-001 err_imp 3.6397e-001 err2 0.00e+000 3.39e-002 6.26e-002 8.66e-002 1.07e-001 1.23e-001 1.37e-001 1.47e-001 1.56e-001 1.62e-001 1.66e-001 1.68e-001 1.68e-001 1.68e-001 err_upw 2.4374e-001 Rappresentazione della soluzione vera Superficie approssimata: metodo upwind Curve di livello: metodo upwind Superficie approssimata: metodo implicito Curve di livello: metodo implicito