1 11 a lezione di laboratorio Laurea Specialistica in Ingegneria Matematica Ingegneria dei Sistemi Energetici Laurea Specialistica in Ingegneria Matematica Ingegneria dei Sistemi Energetici a.a
2 Generalità su un problema del 2° ordine di tipo iperbolico Si può assumere per semplicità: (1) Si fa notare che le funzioni al bordo sono non nulle.
3 Approssimazioni utilizzate Si approssimano le derivate parziali seconde con le differenze finite: La condizione iniziale sulla derivata si approssima con una differenza centrale: con errore locale nell’approssimazione delle derivate:
4 Problema discreto Si indica si considera dapprima j = 0, si utilizzano le condizioni iniziali e si ottiene la soluzione approssimata in. Per ci serviremo della seconda equazione del sistema (2) e delle condizioni iniziali/al contorno: Si è posto:
5 Costruzione della forma vettoriale Dalla seconda equazione dello schema assumendo ad esempio N=5 e j=1, si ha: il vettore a primo membro è la soluzione approssimata nei punti al livello 2. V j (N-1) V j (1) U j-1
6 Costruzione della forma vettoriale Poniamo quindi: N.B. Il vettore ha N-1 componenti di cui N–3 uguali a zero!!! Per :
7 Forma vettoriale Si ottiene allora: con la matrice A tridiagonale e simmetrica: I matrice identità, T matrice tridiagonale con 2 sulla diagonale principale e –1 sulle due codiagonali Si ricorda che il metodo converge se
8 Function PDE_iperboliche:parte 1 function [x,t,sol]=PDE_iperboliche(t0,M,x0,xN,h,k,v,r,f,l, g1,g2); alfa=v*k/h;x=(x0:h:xN)';x(end)=xN;N=length(x)-1; f=eval(f).*ones(size(x)); %condizione iniziale U(x,t0) %La presenza del vettore è necessaria per il caso f=cost. U0=f(2:N); vv=eval(l).*ones(size(x)); %condizione iniziale Ut(x,t0) % Calcolo della soluzione al passo 1 t=t0;x=x(2:end-1); tnoto=eval(r).*ones(size(x)); U1=alfa^2/2*(f(1:N-1)+f(1+2:N+1))+(1- alfa^2)*f(2:N)+k*vv(2:N) + 0.5*k^2*tnoto; tM=k*M+t0;t=linspace(t0,tM,M+1)'; v1=eval(g1).*ones(size(t)); %condizione al contorno U(xo,t) v2=eval(g2).*ones(size(t)); %condizione al contorno U(xN,t) Vj=zeros(N-1,1); sol=[f'; [v1(2) U1' v2(2)]];Uj=U1;Uj_1=U0;
9 Function PDE_iperboliche:parte 2 T=2*eye(N-1)-diag(ones(1,N-2),-1)-diag(ones(1,N-2),+1); A=2*eye(N-1)-alfa^2*T; t=t(2); for j=2:M Vj([1,N-1])=[v1(j),v2(j)]; tnoto=eval(r).*ones(size(x)); Uj1=A*Uj-Uj_1+alfa^2*Vj + k^2*tnoto; sol=[sol;[v1(j+1); Uj1 ;v2(j+1)]']; Uj_1=Uj; Uj=Uj1; t=t+k; end t=linspace(t0,tM,M+1)'; x=[x0;x;xN];
10 Esercizio 1 Per le funzioni che forniscono le condizioni, si sono utilizzati gli stessi nomi della function PDE_iperboliche
11 b) graficare la superficie che si ottiene e le sue curve di livello in due figure distinte, utilizzando i comandi surf, per la figura 1, e contour per la figura 2. Analizzare bene e commentare le figure. a) calcolare la soluzione approssimata del problema con il metodo esplicito utilizzando i seguenti valori per i passi k = 0.25, e h = 0.30 ed un numero di intervalli temporali pari a M = 40 ; Quesiti a, b
12 c) Cosa accade per la teoria se si modifica la condizione sull’asse t in g 1 ( t ) = 1 ? d) Risolvere ancora il problema, eseguire i grafici come al punto b) ed evidenziarne le differenze col caso precedente. Riportare inoltre sulla figura 2 ( contour ) anche la retta di equazione t = x/v; cosa rappresenta? Quesiti c, d Lo studente risolva ed analizzi il problema assumendo M = 80, ed utilizzi il comando subplot per le figure di cui al punto b).
13 Calcolo della soluzione: file onda.m clear all;close all;clc % Dati del problema t0=0; M=40; x0=0; xN=10; k=.25;h=.30; %cond.iniziale su t=0 f='(x-5).*exp(-(x-5).^2 )/.76 '; l='0'; %altra cond.iniz.su t=0 g1='0'; %cond. al contorno su x=x0 g2='0'; %cond.al contorno su x=xN r='0'; v=1;alfa=v*k/h; % implementazione del metodo [x,t,sol]=PDE_iperboliche(t0,M,x0,xN,h,k,v,r,f,l,g1,g2);
14 % N.B. Non si costruisce la matrice dei nodi con % meshgrid perché non si valuta la soluzione vera; % l’assegnazione particolare di H1 è stata fatta per % avere una grafica più significativa figure(1) H1=surf(t,x,sol'); % vedi N.B. xlabel('t','FontWeight','bold','Fontsize',12) ylabel('x','FontWeight','bold','Fontsize',12) title(['Soluzione con alfa= ' num2str(alfa)],'FontWeight','bold','Fontsize',12) set(gca,'FontWeight','bold','Fontsize',12) figure(2) [C,H]=contour(x,t,sol,20); axis square xlabel('x','FontWeight','bold','Fontsize',12) ylabel('t','FontWeight','bold','Fontsize',12) title('Curve di livello','FontWeight','bold','Fontsize',12) set(H,'LineWidth',2) %spessore della linea set(gca,'FontWeight','bold','Fontsize',12)
15 Grafico della soluzione numerica Figura 1
16 Altro grafico di sol H2=surf(x,t,sol);% osservare bene % l’istruzione!!!
17 Curve di livello Figura 2
18 Grafico della condizione iniziale f='(x-5).*exp(-(x-5).^2)/.76'; fplot(f, [0 10]), xlabel('x');ylabel('y'); title(['Grafico di f(x)=', f]);
19 Formula di D’Alembert La soluzione analitica del problema di Cauchy sull’asse reale, associato al problema (1), con gli stessi dati iniziali è data, in base alla formula di D’Alembert, da: con i dati assegnati su una linea che non è caratteristica.
20 Soluzione analitica dell’esercizio 1 la soluzione analitica del problema di Cauchy ottenuto dall’esercizio 1 non considerando le condizioni al contorno, è: Tenendo conto che:
21 Soluzione del problema di Cauchy: formula di D’Alembert [X,T]=meshgrid(x,t); sv=inline(f); solvera=1/2*(sv(X+T)+sv(X-T));surf(t,x,solvera') Figura 3
22 Curve di livello della soluzione di D’Alembert figure(4) [C,H]=contour(x,t,solvera,20); axis square Figura 4 Osservare le differenze tra le figure 1 e 3 e tra le figure 2 e 4; giustificare teoricamente le differenze.
23 Soluzione numerica: M=3*40 N.B. 1- Il numero degli intervalli temporali è stato triplicato per evidenziare il fenomeno delle onde; 2- la figura è stata opportunamente ruotata
24 c) Caso con g 1 ( t ) = 1 Imporre la condizione: equivale ad introdurre una discontinuità nel punto (0,0), discontinuità che si propaga lungo la caratteristica passante per tale punto di equazione. Dal punto di vista del calcolo, è sufficiente modificare nel file onda.m solo l’istruzione: % condizione al contorno in (0,tj) g1='0' sostituendola con g1='1';
25 Grafico della soluzione con g 1 ( t )=1 [x,t,sol]=PDE_iperboliche(t0,M,x0,xN,h,k,v,r,f,l,g1,g2); figure(1)... % rimangono le stesse istruzioni figure(2) [C,H]=contour(x,t,sol,20);... % rimangono le stesse istruzioni set(gca,'FontWeight','bold','Fontsize',12) % grafico della retta di equazione t=x/v t1=x/v; % caratteristica passante per (0,0) hold on H3=plot(x,t1,'k'); set(H3,'LineWidth',3) %spessore della linea set(gca,'FontWeight','bold','Fontsize',12)
26 Grafico soluzione numerica in presenza di singolarità Figura 1
27 Altro grafico di sol in presenza di singolarità H2=surf(x,t,sol);
28 Curve di livello senza la retta t = x/v Figura 2
29 Curve di livello e retta caratteristica per (0,0)
30 Generalità su un problema del 2° ordine di tipo parabolico Si può assumere per semplicità: N.B. Condizioni al contorno di Dirichlet
31 Metodo di Crank-Nicolson Si colloca l’equazione differenziale in è approssimata con la media delle differenze centrali relative ai livelli j e j+1 : La è approssimata con una differenza centrale di passo k/2 : i-1ii+1 j j+1
32 Schema di Crank-Nicolson Posto, si ottiene:
33 Costruzione della forma vettoriale Se si assume N=5, dalla prima equazione dello schema per j=0, si ottiene il sistema: V j (1) V j (N-1) V j+1 (1) V j+1 (N-1)
34 Forma vettoriale Per j = 0 abbiamo : Per j=1,2,… poniamo: Si ottiene il sistema lineare: N-3 La quantità nell’ovale è b N-3
35 Caratteristiche delle matrici A, B A, B sono tridiagonali e simmetriche Si ricorda che il metodo converge
36 Function PDE_paraboliche_CN: parte 1 function [x,t,sol]=PDE_paraboliche_CN(t0,M,x0,xN,h,k,c,r, f,g,l); alfa=k*c/h^2;x=(x0:h:xN)'; x(end)=xN; N=length(x)-1; tM=M*k+t0; t=linspace(t0,tM,M+1)'; f=eval(f).*ones(size(x)); %condizione iniziale U(x,0) v1=eval(g).*ones(size(t)); %condizione al contorno U(xo,t) v2=eval(l).*ones(size(t)); %condizione al contorno U(xN,t) U0=f(2:N); sol=f'; Vj=zeros(N-1,1); Uj=U0; bb=alfa*ones(N-2,1); A=-diag(bb,-1)+2*(1+alfa)*eye(N-1)-diag(bb,1); B= diag(bb,-1)+2*(1-alfa)*eye(N-1)+diag(bb,1); N.B. Questa function risolve un problema parabolico del tipo:
37 Function PDE_paraboliche_CN: parte 2 t=t0+k/2;x=x(2:end-1); for j=1:M tnoto=eval(r).*ones(N-1,1); Vj([1,N-1])=[v1(j)+v1(j+1),v2(j)+v2(j+1)]; b=B*Uj+alfa*Vj + 2*k*tnoto; Uj1=A\b; sol=[sol;[v1(j+1); Uj1 ;v2(j+1)]']; Uj=Uj1; t=t+k; end t=linspace(t0,tM,M+1)';x=[x0;x;xN]; Attenzione all’indice j!!!
38 Esercizio 2 Si risolva con il metodo di Crank-Nicolson il seguente problema con le condizioni al contorno miste Dirichlet-Neumann : con passo spaziale h = 0.2, passi temporali k =[ 0.5, 0.25,0.125 ] e numero di intervalli temporali M = Si rappresenti la soluzione e le sue linee di livello. 2- Si calcoli la soluzione approssimata in x=0.4 e t variabile, nel caso M fissato e nel caso tM fissato.
39 Condizioni iniziali ed al contorno Per conservare l’ordine di approssimazione, la condizione viene approssimata con una differenza centrale: Si noti la continuità del problema nel punto ( x 0,t 0 )=(0,0):
40 Posto, si assume: si ottiene quindi: Approssimazione del problema in esame Dall’uguaglianza (*) si ricava:
41 Costruzione del sistema Per i=1,2,3,4 e j = 0, lo schema diventa: V j (1) V j+1 (1) V j+1 (N) V j (N) N.B In questo caso la dimensione di e del sistema è N; occorre infatti calcolare la soluzione anche in x=xN.
42 Sistema relativo al problema in esame Il sistema diventa: dove:
43 Soluzione del problema Il sistema è lineare ad ogni livello j; la matrice dei coefficienti di dimensione NxN ha la forma: A è matrice diagonalmente dominante ( A non singolare ), quindi la soluzione approssimata nei nodi, per i= 1,2,3,4 ad ogni livello, esiste ed è unica.
44 Function Pde_paraboliche_CN1... U0=f(2:N+1);sol=f';Uj=U0;Vj=zeros(N,1); bb=alfa*ones(N-1,1); A=-diag(bb,-1)+2*(1+alfa)*eye(N)-diag(bb,1); A(N,N-1)=-2*alfa; B= diag(bb,-1)+2*(1-alfa)*eye(N)+diag(bb,1); B(N,N-1)= 2*alfa; t=t0+k/2;x=x(2:end); for j=1:M tnoto=eval(r).*ones(N,1); Vj([1,N])=[v1(j)+v1(j+1),2*h*(v2(j)+v2(j+1))]; b=B*Uj+alfa*Vj +2*k*tnoto; Uj1=A\b; sol=[sol;[v1(j+1); Uj1]']; Uj=Uj1; t=t+k; end t=linspace(t0,tM,M+1)';x=[x0;x];
45 Inizializzazione dei dati clear all;close all; f='x'; %condizione iniziale nei nodi (xi,0) g='0'; %condizione al contorno U(xo,t) l='t'; %condizione al contorno Ux(xN,t) r='0'; %termine noto x0=0;xN=1; t0=0; h=.2;c=1; xsol=0.4; ind=round((xsol-x0)/h)+1; tab=[]; k=[ ]; % attenzione si richiede che i valori di k siano % multipli altrimenti la soluzione non può essere confrontata % nei nodi corrispondenti
46 a - Calcolo della soluzione approssimata con M fissato % si può usare il comando sol(:,:,i)solo se le % matrici hanno le stesse dimensioni M=30; tM3=t0+M*k(3); num=fix((tM3-t0)/k(1)); t_fin=t0+num*k(1); % 3.5 valore limite comune for i=1:length(k) [x,t,sol(:,:,i)]=PDE_paraboliche_CN1(t0,M,x0,xN, h,k(i),c,r,f,g,l); n=round((t_fin-t0)/k(i))+1; tab=[tab sol(1:round(k(1)/k(i)):n,ind,i)]; end tab=[t(1:round(k(1)/k(i)):n) tab]; fprintf(' t sol1 sol2 sol3\n') fprintf('%7.4f %10.6f %10.6f %10.6f\n',tab')
47 Soluzione approssimata U(0.4,t) t sol1 sol2 sol t sol1 sol2 sol
48 Rappresentazione della soluzione %____________________________________________________ % % Queste istruzioni inserite nel ciclo consentono di % graficare tutte le soluzioni e relative curve di % livello. %____________________________________________________ jj=1; alfa=k(i)*c/h^2; figure(jj) surf(x,t,sol(:,:,i)); colorbar('vert') title(['Soluzione con alfa= ' num2str(alfa)]) xlabel('x');ylabel('t') figure(jj+1) contour(x,t,sol(:,:,i),20); colorbar('vert') title(['Curve di livello con alfa= ' num2str(alfa)]) xlabel('x');ylabel('t') jj=jj+2;
49 Grafico della soluzione approssimata con M fissato Figura 1
50 Figura 2 Si invitano gli studenti a risolvere l’esercizio 2 con il metodo esplicito, modificando opportunamente la function relativa a tale metodo.
51 b - Calcolo della soluzione approssimata con tM fissato tM=3.5; tab=[]; for i=1:length(k) M=round((tM-t0)/k(i)); [x,t,sol]=PDE_paraboliche_CN1(t0,M,x0,xN,h,k(i), c,r,f,g,l); tab=[tab sol(1:round(k(1)/k(i)):end,ind)]; end tab=[t(1:round(k(1)/k(i)):end) tab]; fprintf(' t sol1 sol2 sol3\n') fprintf('%7.4f %10.6f %10.6f %10.6f\n',tab') Si riportano ora le istruzioni relative al caso tM fissato.
52 Esercizio 3 Sia dato il seguente problema alle derivate parziali di tipo parabolico: con soluzione vera:
53 Quesito 1) e 2) 2) Si valuti, per il passo spaziale h=0.1, passo temporale k=0.02 e M=20, l’errore assoluto massimo che si commette usando il metodo di Crank-Nicolson ed il metodo alle differenze esplicito. Si confrontino e commentino i risultati; soddisfano le aspettative teoriche? 1)Si verifichi che la funzione (1) è soluzione del problema proposto. Lo studente risolva ed analizzi il problema anche con M = 40, facendo le dovute considerazioni sull’errore di troncamento delle approssimazioni effettuate, e su come una perturbazione dovuta alla macchina potrebbe influenzare i risultati.
54 Quesito 3) 3) Si costruiscano due tabelle che riportino l’intestazione: x sol1 sol2 err1 err2 con le quantità x, sol1, sol2, err1, err2 rappresentanti, rispettivamente i nodi spaziali, la soluzione numerica e l’errore ottenuti con i due metodi, da riportare uno ogni due, valutati in corrispondenza dei valori t=0.1 e t=0.4 utilizzando i seguenti formati di stampa: 3 cifre decimali e formato virgola fissa per i nodi, 8 cifre decimali e formato esponenziale per la soluzione, 2 cifre decimali e formato virgola mobile per l’errore.
55 Istruzioni relative al quesito 2) clc; clear all t0=0;M=20;x0=0;xN=2;h=0.1; k=0.02;c=1/2; r='-3*(1+x)';f='x.^3';g='-3*t';l='8-3*t'; % Implementazione dei metodi [x,t,sol_CN]=PDE_paraboliche_CN(t0,M,x0,xN,h,k,c,r,f,g,l); [x,t,sol_esp]=PDE_paraboliche(t0,M,x0,xN,h,k,c,r,f,g,l); % Confronto con la soluzione vera [X,T]=meshgrid(x,t); Uvera=X.^3-3*T; err_CN=abs(Uvera-sol_CN); err_esp=abs(Uvera-sol_esp); errmax_CN=max(max(err_CN)); errmax_esp=max(max(err_esp));
56 Istruzioni relative al quesito 3) alfa=k*c/h^2; disp(' alfa err_CN err_esp') fprintf('\n %7.3f %11.2e %11.2e \n\n', [alfa errmax_CN errmax_esp]) for t_val=[ ] i=round((t_val-t0)/k)+1; tab=[x sol_CN(i,:)' sol_esp(i,:)', err_CN(i,:)', err_esp(i,:)']; tab_rid=tab(1:2:end,:); fprintf([' \n\n Tabella per t=', num2str(t_val), ' \n\n x \t\t sol_CN \t\t sol_esp \t\t err_CN \t\t err_esp \n']) fprintf(' %7.3f %16.8e %16.8e %10.2e %10.2e \n', tab_rid') end
57 Risultati quesito 3):tabella 1 Tabella per t=0.1 x sol_CN sol_esp err_CN err_esp e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e+000 Tabella per t=0.1 x sol_CN sol_esp err_CN err_esp e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e+000 Errori massimi nei due metodi: alfa err_CN err_esp e e-007 alfa err_CN err_esp e e-007
58 Risultati quesito 3): tabella 2 Tabella per t=0.4 x sol_CN sol_esp err_CN err_esp e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e+000 Tabella per t=0.4 x sol_CN sol_esp err_CN err_esp e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e+000 N.B. Il metodo di Crank-Nicolson riproduce ancora la soluzione (errore circa della precisione di macchina). Il metodo esplicito fornisce errore più grande rispetto al caso precedente; cosa succede per valori di t ancora più grandi?
59 Rappresentazione della soluzione figure(1) subplot(211), surf(x,t,Uvera); title('Soluzione vera') xlabel('x');ylabel('t') subplot(212), surf(x,t,sol_esp); title(['Soluzione metodo esplicito con alfa= ' num2str(alfa)]) xlabel('x');ylabel('t') figure(2) surf(x,t,err_esp);colorbar('vert') title(['Errore metodo esplicito con alfa= ', num2str(alfa)]) xlabel('x');ylabel('t')
60 Grafici della soluzione vera ed approssimata
61 Grafico dell’errore col metodo esplicito Si noti che per piccoli valori di t l’errore è piccolo; ma, essendo il metodo instabile, all’aumentare del numero delle iterazioni e per effetto dell’errore di macchina, amplificato dall’instabilità numerica, l’errore diventa sempre più grande.