Documente Academic
Documente Profesional
Documente Cultură
Metode numerice:
∂u ∂2u
= D 2.
∂t ∂x
Considerăm condiţia iniţială:
xi = (i − 1)h, i = 1, 2, . . . , M, (14.1)
tn = n∆t, n = 0, 1, 2, . . . (14.2)
Derivata spaţială
µ ¶ µ ¶ µ ¶
h ∂u h2 ∂2u h3 ∂3u
uni−1 = uni − + − + ··· ,
1! ∂x i,n 2! ∂x2 i,n 3! ∂x3 i,n
µ ¶ µ ¶ µ ¶
h ∂u h2 ∂2u h3 ∂3u
uni+1 = uni + + + + ···
1! ∂x i,n 2! ∂x2 i,n 3! ∂x3 i,n
2
Aproximaţie discretizată de ordinul O(h2 + ∆t) a ecuaţiei difuziei în (xi , tn ):
un+1
i = λuni−1 + (1 − 2λ) uni + λuni+1 , i = 2, 3, . . . , M − 1,
cu
D∆t
. λ=
h2
Schemă cu diferenţe progresive pentru derivata temporală → metodă explicită.
un+1
1 = un1 = u00 ,
n+1
uM = unM = u0L .
Cu notaţii matriciale:
un+1 = B · un , n = 0, 1, 2, . . .
1 0 0 un1
λ 1 − 2λ λ un2
... ... ... ..
B = , un = . .
n
λ 1 − 2λ λ uM−1
0 0 1 unM
Crank-
explicit Nicholson implicit
n+1 n+1 n+1
u i -1 u i u i+1
tn+1
∆t
tn
n n n
u i -1 ui u i+1
t1
h
t0
x1 = 0 xi -1 xi xi+1 xM =L
3
/*=========================================================================*/
void PropagExplicit(float D, float u0[], float u[], float dt, float h, int m)
/*---------------------------------------------------------------------------
Propaga solutia u0[] a ecuatiei difuziei cu coeficient constant D,
du/dt = D d2u/dx2,
pe intervalul temporal dt, utilizand schema de discretizare explicita pe o
retea spatiala cu m puncte si pasul h. Returneaza solutia in u[].
---------------------------------------------------------------------------*/
{
float lambda;
int i;
lambda = D * dt/(h*h);
u[1] = u0[1];
u[m] = u0[m];
for (i=2; i<=(m-1); i++)
u[i] = lambda*u0[i-1] + (1-2*lambda)*u0[i] + lambda*u0[i+1];
}
4
Aplicaţie: D = 1:
∂u ∂2u
= 2, x ∈ [0, 1], t > 0,
∂t ∂x
condiţii la limită:
u(0, t) = u(1, t) = 0, t > 0,
condiţie iniţială:
u(x, 0) = sin(πx), x ∈ [0, 1].
Soluţia analitică:
u(x, t) = exp(−π 2 t) sin(πx).
5
14.0.2 Analiza de stabilitate von Neumann
Analiză locală – se presupune că coeficienţii ecuaţiei cu diferenţe pot fi consideraţi
constanţi
Modurile proprii (soluţiile independente) ale ecuaţiei cu diferenţe:
ı – unitatea imaginară
k – numărul de undă spaţial
ξ(k) – factor de amplificare, care este o funcţie complexă de k.
Orice soluţie a ecuaţiei discretizate poate fi reprezentată ca o combinaţie liniară a mod-
urilor proprii.
|ξ(k)| < 1.
ξ = 1 − 4λ sin2 (kh/2).
1 h2
∆t < . (14.4)
2D
Pasul temporal ∆t care asigură stabilitatea algoritmului este limitat superior de o valoare
proporţională cu timpul de difuzie pe distanţa h. → metoda explicită este condiţional
stabilă, iar valoarea λ = 1/2 este critică.
6
0.16
0.14 exact
numeric
0.12
t = 2.0
0.10
0.08 t = 2.5
c
0.06
t = 3.0
0.04
0.02
0.00
0.0 0.2 0.4 0.6 0.8 1.0
FIGURA 14.2. Soluţii exacte şi soluţii numerice prin metoda explicită (cu h = 0.05 şi
∆t = 0.00125) pentru problema de difuzie (14.44)—(14.46).
0.16
0.14 exact
numeric
0.12
t = 2.0
0.10
0.08 t = 2.5
c
0.06
0.04
0.02 t = 3.0
0.00
0.0 0.2 0.4 0.6 0.8 1.0
FIGURA 14.3. Soluţii exacte şi soluţii numerice prin metoda explicită (cu h = 0.05 şi
∆t = 0.0013) pentru problema de difuzie (14.44)—(14.46).
7
14.0.3 Metoda implicită şi metoda Crank-Nicholson
Pentru a obţine un algoritm necondiţionat stabil → schemă de discretizare regresivă
pentru derivata temporală.
−λun+1 n+1
i−1 + (1 + 2λ) ui − λun+1 n
i+1 = ui , i = 2, 3, . . . , M − 1.
A · un+1 = un , n = 0, 1, 2, . . . ,
cu
1 0
−λ 1 + 2λ −λ
... ... ...
A = .
−λ 1 + 2λ −λ
0 1
(condiţii la limită de tip Dirichlet).
Deoarece λ > 0, matricea A este pozitiv definită şi diagonal dominantă.
Factorul de amplificare:
1
ξ= ,
1 + 4λ sin2 (kh/2)
şi
|ξ(k)| < 1
pentru orice ∆t → metoda implicită este necondiţionat stabilă şi tot de ordinul O(h2 +
∆t).
8
/*=========================================================================*/
void PropagImplicit(float D, float u0[], float u[], float dt, float h, int m)
/*---------------------------------------------------------------------------
Propaga solutia u0[] a ecuatiei difuziei cu coeficient constant D,
du/dt = D d2u/dx2,
pe intervalul temporal dt, utilizand schema de discretizare implicita
pe o retea spatiala cu m puncte si pasul h. Returneaza solutia in u[].
---------------------------------------------------------------------------*/
{
float *a, *b, *c;
float lambda;
int i;
a = Vector(1,m);
b = Vector(1,m);
c = Vector(1,m);
lambda = D * dt/(h*h);
b[1] = 1.0; c[1] = 0.0; u[1] = u0[1];
for (i=2; i<=(m-1); i++) {
a[i] = -lambda;
b[i] = 1.0 + 2*lambda;
c[i] = -lambda;
u[i] = u0[i];
}
a[m] = 0.0; b[m] = 1.0; u[m] = u0[m];
TriDiag(a,b,c,u,m);
FreeVector(a,1);
FreeVector(b,1);
FreeVector(c,1);
}
9
Metodă de ordinul O((∆t)2 + h2 ) – aproximarea ecuaţiei difuziei la tn+1/2 ≡ tn + ∆t/2
şi utilizarea unei scheme cu diferenţe centrale pentru derivata temporală.
Considerăm dezvoltările în jurul momentului tn+1/2 ,
µ ¶ µ 2 ¶
n+1 n+1/2 ∂u 1 2 ∂ u
ui = ui + (∆t/2) + (∆t/2) + ··· ,
∂t i,n+1/2 2 ∂t2 i,n+1/2
µ ¶ µ 2 ¶
n n+1/2 ∂u 1 2 ∂ u
ui = ui − (∆t/2) + (∆t/2) − ···
∂t i,n+1/2 2 ∂t2 i,n+1/2
−λun+1 n+1
i−1 + (1 + 2λ) ui − λun+1 n n
i+1 = λui−1 + (1 − 2λ) ui + λui+1 ,
n
i = 2, 3, . . . , M − 1,
cu
1 D∆t
λ= .
2 h2
Reprezentarea matricială:
A · un+1 = B · un , n = 0, 1, 2, . . . ,
A, B – matrici tridiagonale
A – pozitiv definită, dominant diagonală şi nesingulară.
Factorul de amplificare
1 − 4λ sin2 (kh/2)
ξ=
1 + 4λ sin2 (kh/2)
Metoda Crank-Nicholson este necondiţionat stabilă şi are ordin de precizie înalt, O((∆t)2 +
h2 ).
10
/*=========================================================================*/
void CrankNicholson(float D, float u0[], float u[], float dt, float h, int m)
/*---------------------------------------------------------------------------
Propaga solutia u0[] a ecuatiei difuziei cu coeficient constant D,
du/dt = D d2u/dx2,
pe intervalul temporal dt, utilizand schema de discretizare Crank-Nicholson
pe o retea spatiala cu m puncte si pasul h. Returneaza solutia in u[].
---------------------------------------------------------------------------*/
{
float *a, *b, *c;
float lambda;
int i;
a = Vector(1,m);
b = Vector(1,m);
c = Vector(1,m);
lambda = 0.5 * D * dt/(h*h);
b[1] = 1.0; c[1] = 0.0; u[1] = u0[1];
for (i=2; i<=(m-1); i++) {
a[i] = -lambda;
b[i] = 1.0 + 2*lambda;
c[i] = -lambda;
u[i] = lambda*u0[i-1] + (1.0 - 2*lambda)*u0[i] + lambda*u0[i+1];
}
a[m] = 0.0; b[m] = 1.0; u[m] = u0[m];
TriDiag(a,b,c,u,m);
FreeVector(a,1);
FreeVector(b,1);
FreeVector(c,1);
}
0.08
0.06
0.04
c
0.02 exact
implicit
Crank-Nicholson
0.00
0.0 0.2 0.4 0.6 0.8 1.0
FIGURA 14.4. Soluţia exactă şi soluţiile numerice prin metoda implicită şi prin metoda
Crank-Nicholson (cu h = 0.05 şi ∆t = 0.025) la momentul t = 3.0 pentru problema de di-
fuzie (14.44)—(14.46).
11
Bibliography
[1] N. Racoveanu, Gh. Dodescu, I. Mincu, Metode numerice pentru ecuaţii cu derivate
parţiale de tip parabolic (Editura Tehnică, Bucureşti, 1977).
[2] W.F. Ames, Numerical Methods for Partial Differential Equations, (Academic Press,
New York, 1977).
[3] A. Samarski, V. Andreev, Méthodes aux différences pour équations elliptiques (MIR,
Moscou, 1978).
[4] L.Gr. Ixaru, Metode numerice pentru ecuaţii diferenţiale cu aplicaţii (Editura Acad-
emiei, Bucureşti, 1979).
[5] R.L. Burden, J.D. Faires, Numerical Analysis, Third Edition (Prindle, Weber &
Schmidt, Boston, 1985).
[6] S.E. Koonin, D.C. Meredith, Computational Physics, Fortran Version (Addison-
Wesley, Redwood CA, 1990).
[7] W.H. Press, S.A. Teukolsky, W.T. Vetterling, B.P Flannery, Numerical Recipes in C,
Second Edition (Cambridge University Press, Cambridge, 1992).