Equazioni del calore e metodo delle linee 1
A. Sommariva
2Keywords: Equazione del calore in Matlab. Eulero esplicito, implicito e theta metodi.
Revisione: 4 maggio 2020
1. Equazione del calore.
Consideriamo l’equazione del calore
∂u
∂t
=
∂∂x2u2+ G, 0 < x < 1, t > 0 u(0, t) = d
0(t), u(1, t) = d
1(t), t ≥ 0 u(x, 0) = f (x), 0 ≤ x ≤ 1
(1)
Sia
• m > 0 intero,
• h
x= 1/m,
• x
j= jh
xcon j = 0, 1, . . . , m.
Se la soluzione `e sufficentemente regolare da
∂
2u
∂x
2(x
j, t) ≈ u(x
j+1, t) − 2u(x
j, t) + u(x
j−1, t)
h
2x, j = 1, . . . , m − 1 (2) posto u
j(t) := u(x
j, t) otteniamo per j = 1, . . . , m − 1 il sistema di equazioni differenziali
u
0j(t) = u
j+1(t) − 2u
j(t) + u
j−1(t)
h
2x+ G(x
j, t) (3)
Nel risolvere il sistema dobbiamo far attenzione alle condizioni sul bordo u
0(t) = d
0(t), u
m(t) = d
1(t)
e ricordare che la condizione iniziale del sistema di equazioni differenziali `e
u
j(0) = f (x
j), j = 1, . . . , m − 1.
Il sistema differenziale (3) pu`o essere riscritto matricialmente. Posto u(t) := [u
1(t), . . . , u
m−1(t)]
Tu
0:= [f (x
1), . . . , f (x
m−1)]
Tg(t) := 1
h
2xd
0(t), 0, . . . , 0, 1 h
2xd
1(t)
T+ [G(x
1, t), . . . , G(x
m−1, t)]
TΛ = 1 h
2x
−2 1 0 0 . . . 0
1 −2 1 0 . . . 0
0 1 −2 1 . . . 0
. . . . . . . . . . . . . . . . . .
0 0 0 0 1 −2
(4)
allora (3) `e equivalente al sistema di equazioni differenziali lineari
u
0(t) = Λu(t) + g(t), u(0) = u
0(5)
1.1. Equazione del calore e metodo delle linee: Eulero esplicito, implicito e θ-metodi Risolvendo u
0(t) = Λu(t) + g(t), u(0) = u
0in t
n= nh
t, n = 0, 1, . . . con
• Eulero esplicito, per u
n+1:= u(t
n+1), si ha v
n+1≈ u
n+1ove
v
n+1= v
n+ h
t(Λv
n+ g(t
n))
v
0assegnato (6)
• Eulero implicito, si ha
v
n+1= v
n+ h
t(Λv
n+1+ g(t
n+1))
v
0assegnato (7)
ovvero
(I − h
tΛ)v
n+1= v
n+ h
tg(t
n+1)
v
0assegnato (8)
con I −h
tΛ definita positiva (e quindi non singolare) poich`e Λ `e definita negativa (per due teoremi di Gerschgorin).
A partire da Eulero esplicito ed Eulero implicito si definiscono i cosidetti θ−metodi in cui
v
n+1= v
n+ (1 − θ)h
t(Λv
n+ g(t
n)) + θh
t(Λv
n+1+ g(t
n+1)) con v
0assegnato.
Si osservi che:
• θ = 0 corrisponde al metodo di Eulero esplicito;
• θ = 1 corrisponde al metodo di Eulero implicito.
0 0.2
0.4 0.6
0.8 1
0 1 2 3 4 5 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Figura 1: Grafico della soluzione dell’equazione del calore (9).
Esempio 1.1. Studiamo numericamente l’equazione del calore
∂u
∂t
=
∂∂x2u2+ G, 0 < x < 1, t > 0 u(0, t) = d
0(t), u(1, t) = d
1(t), t ≥ 0 u(x, 0) = f (x), 0 ≤ x ≤ 1
(9)
per
G(x, t) = (−0.1 + π
2) (exp(−0.1 · t) sin(π x)) d
0(t) = 0, d
1(t) = 0
f (x) = sin(π x)
(10)
avente quale soluzione
u(x, t) = exp(−0.1 · t) sin(π x).
Definiamo il termine noto in g.m
function gt=g(t,x,hx,d0,d1,G)
% Valuta:
% g(t)=(1/hxˆ2)*(d0(t),0,...,0,d1(t))+[G(x1,t),...,G(x_(m-1),t)].
gt=feval(G,x,t);
gt(1)=gt(1)+(1/hxˆ2)*feval(d0,t);
gt(length(gt))=gt(length(gt))+(1/hxˆ2)*feval(d1,t);
e implementiamo il metodo in metodolinee.m
function [V_hist,x_in,t_in,hx,ht]=metodolinee(theta,tfin,m,f,d0,d1,G,sigma)
% INPUT.
% theta : PARAMETRO DEL THETA METODO in [0,1].
% tfin : ISTANTE FINALE.
% m : DETERMINA IL PASSO SPAZIALE CON PASSO h_x=1/m.
% f : u(x,0)=f(x)
% d0, d1 : u(0,t)=d0(t), u(1,t)=d1(t).
% G : (D_t)u=(Dˆ2_x)u+G.
% sigma: IL PASSO TEMPORALE E’ sigma*(hxˆ2)/2.
% OUTPUT.
% V_hist : SOLUZIONE ISTANTE PER ISTANTE. RIGHE INIZIALI -> BASSO t.
% x_in : PUNTI INTERNI NELLA VARIABILE x.
% t_in : PUNTI INTERNI NELLA VARIABILE t.
% hx : PASSO SPAZIALE.
% ht : PASSO TEMPORALE.
hx=1/m; ht=sigma*(hxˆ2)/2; % PASSI SPAZIALI E TEMPORALI.
x=(0:hx:1)’; x_in=x(2:end-1,:);% PUNTI INTERNI.
u0=feval(f,x_in); % VETTORE SOLUZIONE AL TEMPO "0".
t=(0:ht:tfin)’; t_in=t(2:end,1); % TEMPI DA ANALIZZARE.
Lambda=-(1/hxˆ2)*gallery(’tridiag’,m-1); % Lambda=full(Lambda);
iftheta < 1, gt_prev=g(0,x_in,hx,d0,d1,G); end
V_old=u0; V_hist=[V_old’]; err_hist=[]; % INIZIALIZZAZIONI.
for index=1:length(t_in) % STUDIO SOLUZIONE IN TEMPI FINO A tfin.
t_curr=t_in(index); gt_curr=g(t_curr,x_in,hx,d0,d1,G);
switch theta
case 0 % EULERO ESPLICITO.
V_new=V_old+ht*(Lambda*V_old+gt_prev);
gt_prev=gt_curr;
case 1 % EULERO IMPLICITO.
A=eye(size(Lambda))-ht*Lambda;
b=V_old+ht*gt_curr; V_new=A\b;
otherwise % THETA METODO.
A=eye(size(Lambda))-(ht*theta)*Lambda;
b=V_old+ht*(1-theta)*(Lambda*V_old+gt_prev)+ht*theta*gt_curr;
V_new=A\b; gt_prev=gt_curr;
end
V_hist=[V_hist; V_new’]; V_old=V_new;
end
1. Il parametro m determina il passo spaziale h
x= 1/m;
2. se theta=0 allora si utilizza il metodo di Eulero esplicito, mentre se theta=1 Eulero implicito;
3. la variabile tfin determina l’ultimo istante possibile da analizzare;
4. il parametro sigma determina il passo temporale a partire da quello spaziale ovvero h
t= sigma · h
2x/2 dove h
x= 1/m.
Salviamo in demo calore.m
function demo_calore(theta,sigma) if nargin < 2,sigma=1;end
mV=[2 4 8 16]; tfin=5; % SETTINGS.
% ESEMPIO.
G=@(x,t) (-0.1+piˆ2)*(exp((-0.1)*t).*sin(pi*x));
d0=@(t) zeros(size(t));
d1=@(t) exp((-0.1)*t).*sin(pi);
f=@(x) sin(pi*x);
solution=@(x,t) exp((-0.1)*t).*sin(pi*x);
err_hist=[];
for k=1:length(mV)
m=mV(k); % ANALISI SUDD. m PUNTI SPAZIALI.
[V_hist,x_mid,t_mid,hx,ht]=metodolinee(theta,tfin,m,f,d0,d1,G,sigma);
U=feval(solution,x_mid,t_mid(end));
err=norm(U’-V_hist(end,:),inf); % ERRORE METODO.
err_hist=[err_hist;err];
fprintf(’\n \t [m]: %3.0f [ERROR]: %2.2e [hx]: %2.2e [ht]: %2.2e’,...
m,err,hx,ht);
end
Per motivi di stabilit`a tipici di Eulero esplicito, necessita che h
t≤ h
2x/2.
Vediamo su vari esempi cosa succede numericamente. Dopo aver settato in demo calore il parametro theta=0, proprio di Eulero Esplicito, scegliamo per esempio sigma=1.5.
Quindi dalla shell digitiamo quanto segue:
>> demo_calore(0,1.5)
[THETA]:0.000 [TFIN]:5.000 [SIGMA]:1.5e+00
[m]: 2 [ERROR]: 1.45e-01 [hx]: 5.00e-01 [ht]: 1.88e-01 [m]: 4 [ERROR]: 1.40e+04 [hx]: 2.50e-01 [ht]: 4.69e-02 [m]: 8 [ERROR]: 7.32e+100 [hx]: 1.25e-01 [ht]: 1.17e-02 [m]: 16 [ERROR]: NaN [hx]: 6.25e-02 [ht]: 2.93e-03
>>
Segliamo un parametro sigma pi`u piccolo, sigma=1.1.
>> demo_calore(0,1.1)
[THETA]:0.000 [TFIN]:5.000 [SIGMA]:1.1e+00
[m]: 2 [ERROR]: 1.44e-01 [hx]: 5.00e-01 [ht]: 1.38e-01 [m]: 4 [ERROR]: 3.25e-02 [hx]: 2.50e-01 [ht]: 3.44e-02 [m]: 8 [ERROR]: 2.89e+11 [hx]: 1.25e-01 [ht]: 8.59e-03 [m]: 16 [ERROR]: 3.77e+149 [hx]: 6.25e-02 [ht]: 2.15e-03
>>
Il metodo non fornisce evidentemente risultati apprezzabili. Scegliamo ora sigma=1.0:
il metodo di Eulero esplicito finalmente converge.
>> demo_calore(0,1)
[THETA]:0.000 [TFIN]:5.000 [SIGMA]:1.0e+00
[m]: 2 [ERROR]: 1.43e-01 [hx]: 5.00e-01 [ht]: 1.25e-01 [m]: 4 [ERROR]: 3.25e-02 [hx]: 2.50e-01 [ht]: 3.12e-02 [m]: 8 [ERROR]: 7.93e-03 [hx]: 1.25e-01 [ht]: 7.81e-03 [m]: 16 [ERROR]: 1.97e-03 [hx]: 6.25e-02 [ht]: 1.95e-03
>>
In definitiva affinch`e il metodo di Eulero esplicito converga, il passo temporale dev’es- sere scelto dell’ordine di h
2x/2, che in molti casi risulta essere troppo piccolo e rende il metodo non competitivo dal punto di vista computazionale.
Analizziamo ora il comportamento di Eulero implicito (cio`e theta=1).
Tale metodo richiede la risoluzione di sistemi lineari tridiagonali, ma ci`o non `e un problema dal punto di vista computazionale (per ogni t
iil costo e’ O(m)).
Proviamo il comportamento per sigma=1.5,
>> demo_calore(1,1.5)
[THETA]:1.000 [TFIN]:5.000 [SIGMA]:1.5e+00
[m]: 2 [ERROR]: 1.45e-01 [hx]: 5.00e-01 [ht]: 1.88e-01 [m]: 4 [ERROR]: 3.26e-02 [hx]: 2.50e-01 [ht]: 4.69e-02 [m]: 8 [ERROR]: 7.95e-03 [hx]: 1.25e-01 [ht]: 1.17e-02
[m]: 16 [ERROR]: 1.97e-03 [hx]: 6.25e-02 [ht]: 2.93e-03
>>
Per curiosit`a proviamo per sigma=10,
>> demo_calore(1,10)
[THETA]:1.000 [TFIN]:5.000 [SIGMA]:1.0e+01
[m]: 2 [ERROR]: 1.44e-01 [hx]: 5.00e-01 [ht]: 1.25e+00 [m]: 4 [ERROR]: 3.26e-02 [hx]: 2.50e-01 [ht]: 3.12e-01 [m]: 8 [ERROR]: 7.96e-03 [hx]: 1.25e-01 [ht]: 7.81e-02 [m]: 16 [ERROR]: 1.98e-03 [hx]: 6.25e-02 [ht]: 1.95e-02
>>