Documente Academic
Documente Profesional
Documente Cultură
y
0
i
(x) = y
i+1
(x), i = 1, 2, . . . , n 1
y
0
n
(x) = f(x, y
1
(x), y
2
(x), . . . , y
n
(x)).
Sistemul sub form a matricial a
y
0
(x) = f(x, y),
cu
y =
_
_
y
1
(x)
y
2
(x)
.
.
.
y
n
(x)
_
_
, f(x, y) =
_
_
f
1
(x, y
1
(x), . . . , y
n
(x))
f
2
(x, y
1
(x), . . . , y
n
(x))
.
.
.
f
n
(x, y
1
(x), . . . , y
n
(x))
_
_
.
Tipuri de probleme:
probleme cu condi tii ini tiale sau probleme Cauchy conditii suplimentare ntr-un
punct initial x
0
,
y(x
0
) = y
0
.
Rezolvarea determinarea progresiv a a solutiei pe o retea de puncte x
0
, x
1
, x
2
, . . .,
x
max
.
Tipuri de metode:
metode directe (pas cu pas, sau unipas) solutia la un pas x
m
numai pe baza
informatiilor din nodul anterior, x
m1
, si, eventual, din intervalul [x
m1
, x
m
].
metodele Euler si Runge-Kutta
metode indirecte (sau multipas) solutia la un pas x
m
pe baza informatiilor
de la mai multi pasi anteriori x
m1
, x
m2
, . . .
metodele Adams-Moulton, Milne, Fox-Goodwin si Numerov.
probleme cu condi tii la limit a bilocale sau problemele de tip Dirichlet conditii
asupra valorilor solutiei si derivatelor la capetele unui interval [x
min
, x
max
].
2
13.2 Metoda dezvolt arii n serie Taylor
Importanta furnizeaz a criterii pentru evaluarea preciziei metodelor de interes practic.
Fie problema Cauchy:
y
0
= f(x, y),
y(x
0
) = y
0
.
Dezvoltarea solutiei n serie Taylor n vecin atatea lui x
0
:
y(x) = y(x
0
) +
x x
0
1!
y
0
(x
0
) +
(x x
0
)
2
2!
y
00
(x
0
) + . . .
Propagarea solutiei de la punctul de retea x
m
la punctul x
m+1
:
y
m+1
= y
m
+ hy
0
m
+
h
2
2
y
00
m
+ . . . ,
cu
h = x
m+1
x
m
.
Cu ct h este mai mic, seria converge mai rapid si y
m+1
aproximeaz a mai bine valoarea
exact a y(x
m+1
) a solutiei.
Din ecuatia diferential a
y
0
m
= f(x
m
, y
m
).
Derivnd ambii membri ai ecuatiei diferentiale
y
00
m
=
f
x
+
f
y
y
x
x
m
,y
m
=
f
x
+ f
f
y
x
m
,y
m
.
Rezult a formula de propagare
y
m+1
= y
m
+ hf(x
m
, y
m
) +
h
2
2
f
x
+ f
f
y
x
m
,y
m
+ O(h
3
).
Metod a direct a, de tip explicit.
Denitia 13.1 O metod a este de ordinul p dac a furnizeaz a o solu tie echivalent a cu dez-
voltarea Taylor a solu tiei exacte pn a la termeni de ordinul h
p
.
3
13.3 Metoda lui Euler (metoda liniilor poligonale)
Aproximatia liniar a a metodei dezvolt arii n serie Taylor:
y
m+1
= y
m
+ hf(x
m
, y
m
), m = 0, 1, 2, . . . ,
cu
h = x
m+1
x
m
.
Metod a direct a de ordinul 1, de tip explicit
y
x x
m
x
0
x
1
y
m
y
0
y
1
x
m+1
y
m+1
y y x = ( )
h
. . .
FIGURA 13.1. n metoda Euler se aproximeaz a solutia exact a cu o linie poligonal a.
Erorile de trunchiere si de rotunjire se propag a de la un pas la altul.
Algoritmul predictor-corector al lui Euler (metod a de ordinul 2):
1. se calculeaz a valoarea predictor y
p
m+1
din formula predictor:
y
p
m+1
= y
m
+ hf(x
m
, y
m
),
2. se calculeaz a recurent valoarea corector y
c
m+1
din formula corector
y
c
m+1
= y
m
+
h
2
f(x
m
, y
m
) + f(x
m+1
, y
p
m+1
)
.
nlocuind de ecare dat a y
p
m+1
cu valoarea anterioar a y
c
m+1
, pn a cnd se obtine
precizia dorit a
y
c
m+1
y
p
m+1
, > 0.
4
13.4 Metodele Runge-Kutta
Propriet ati:
metode directe (pas cu pas) posibilitatea autopornirii.
solutia prin metoda Runge-Kutta de ordinul p este echivalent a cu dezvoltarea n
serie Taylor pn a n h
p
.
necesit a numai evaluarea functiei f(x, y), nu si a derivatelor.
Fie ecuatia:
y
0
= f(x, y).
Propagarea solutiei prin metoda dezvolt arii n serie Taylor:
y
m+1
= y
m
+ hf(x
m
, y
m
) +
h
2
2
f
x
+ f
f
y
xm,ym
+ . . .
Se caut a o formul a de propagare care s a depind a de f(x, y), dar nu si de derivatele sale:
y
m+1
= y
m
+
p
X
i=1
w
i
k
i
,
_
_
k
i
= hf(
i
,
i
)
i
= x
m
+
i
h
i
= y
m
+
i1
X
j=1
ij
k
j
.
Se alege:
1
= 0,
11
= 0,
1
= x
m
,
1
= y
m
.
Rezult a:
_
_
k
1
= hf(x
m
, y
m
)
k
2
= hf(x
m
+
2
h, y
m
+
21
k
1
)
k
3
= hf(x
m
+
3
h, y
m
+
31
k
1
+
32
k
2
)
Metoda Runge-Kutta p = 1:
y
m+1
= y
m
+ hf(x
m
, y
m
)
metoda lui Euler.
5
Metoda Runge-Kutta p = 2:
y
m+1
= y
m
+ w
1
k
1
+ w
2
k
2
,
k
1
= hf(x
m
, y
m
)
k
2
= hf(x
m
+
2
h, y
m
+
21
k
1
),
sau
y
m+1
= y
m
+ w
1
hf(x
m
, y
m
) + w
2
hf(x
m
+
2
h, y
m
+
21
hf(x
m
, y
m
)).
Dezvolt am dup a puterile lui h:
y
m+1
= y
m
+ (w
1
+ w
2
)hf(x
m
, y
m
) + h
2
w
2
2
f
x
+ w
2
21
f
f
y
x
m
,y
m
.
Comparnd cu dezvoltarea n serie rezult a:
_
_
_
w
1
+ w
2
= 1
w
2
2
= 1/2
w
2
21
= 1/2.
Nu are solutie unic a solutie posibili a:
2
=
21
= 1
w
1
= w
2
= 1/2.
Formulele metodei Runge-Kutta de ordinul doi:
y
m+1
= y
m
+
1
2
(k
1
+ k
2
),
unde
k
1
= hf(x
m
, y
m
)
k
2
= hf(x
m
+ h, y
m
+ k
1
),
sau
y
m+1
= y
m
+
h
2
[f(x
m
, y
m
) + f(x
m
+ h, y
m
+ hf(x
m
, y
m
))].
algoritmul predictor-corector al lui Euler (formula predictor nlocuit a n cea corector).
Metoda Runge-Kutta p = 4 (varianta cea mai important a):
y
m+1
= y
m
+
1
6
(k
1
+ 2k
2
+ 2k
3
+ k
4
), m = 0, 1, 2, . . . ,
cu
_
_
k
1
= hf(x
m
, y
m
)
k
2
= hf(x
m
+ h/2, y
m
+ k
1
/2)
k
3
= hf(x
m
+ h/2, y
m
+ k
2
/2)
k
4
= hf(x
m
+ h, y
m
+ k
3
).
Eroarea de trunchiere:
T
= Kh
5
.
6
Sisteme de ecuatii diferentiale de ordinul nti:
y
0
i
(x) = f
i
(x, y
1
(x), y
2
(x), . . . , y
n
(x)), i = 1, 2, . . . , n,
Formulele Runge-Kutta p = 4:
y
m+1,i
= y
m,i
+
h
6
h
f
1,i
+ 2(
f
2,i
+
f
3,i
) +
f
4,i
i
, i = 1, 2, . . . , n,
cu
_
f
1,i
= f
i
(x
m
, {y
m,i
})
f
2,i
= f
i
(x
m
+ h/2, {y
m,i
+ (h/2)
f
1,i
})
f
3,i
= f
i
(x
m
+ h/2, {y
m,i
+ (h/2)
f
2,i
})
f
4,i
= f
i
(x
m
+ h, {y
m,i
+ h
f
3,i
}).
#include "memalloc.h"
/*=========================================================================*/
void RungeKutta(float x, float h, float y0[], float y[], int n,
void Func(float,float[],float[]))
/*---------------------------------------------------------------------------
Utilizeaza metoda Runge-Kutta de ordinul 4 pentru a propaga solutia unui
sistem de ecuatii diferentiale ordinare de ordinul 1
y[i] = f[i](x,y[1],...,y[n]), i = 1..n
x - punctul initial
h - distanta pe care este propagata solutia
y0[] - valorile componentelor solutiei in punctul initial x
y[] - valorile solutiei propagate in punctul x + h
n - numarul ecuatiilor diferentiale
Func - rutina utilizator care returneaza membrii drepti f[i](...) ai
ecuatiilor; definitie:
void Func(float x, float y[], float f[]);
---------------------------------------------------------------------------*/
{
int i;
float h2, h6;
float *f1, *f2, *f3, *f4;
f1 = Vector(1,n);
f2 = Vector(1,n);
f3 = Vector(1,n);
f4 = Vector(1,n);
h2 = 0.5*h;
Func(x,y0,f1);
for (i=1; i<=n; i++) y[i] = y0[i] + h2*f1[i];
Func(x+h2,y,f2);
for (i=1; i<=n; i++) y[i] = y0[i] + h2*f2[i];
Func(x+h2,y,f3);
for (i=1; i<=n; i++) y[i] = y0[i] + h *f3[i];
Func(x+h,y,f4);
h6 = h/6.0;
for (i=1; i<=n; i++)
y[i] = y0[i] + h6*(f1[i] + 2*(f2[i] + f3[i]) + f4[i]);
FreeVector(f1,1);
FreeVector(f2,1);
FreeVector(f3,1);
FreeVector(f4,1);
}
7
Exemplu:
y
00
+ y = 0
cu conditiile initiale:
y(x
0
) = y
0
y
0
(x
0
) = y
0
0
.
Solutia general a: y(x) = Asinx + B cos x.
Forma echivalent a a ecuatiei sistem de dou a ecuatii de ordinul nti:
y
0
1
= y
2
y
0
2
= y
1
,
cu conditiile initiale:
y
1
(x
0
) = y
0
y
2
(x
0
) = y
0
0
.
Caz particular:
y
1
(0) = 0,
y
2
(0) = 1,
solutia
y
1
(x) = sin x,
y
2
(x) = cos x.
8
/*---------------------------------------------------------------------------
Rezolva un sistem de ecuatii diferentiale ordinare de ordinul 1 prin metoda
Runge-Kutta de ordinul 4
---------------------------------------------------------------------------*/
#include <math.h>
#include "memalloc.h"
/*=========================================================================*/
void Func1(float x, float y[], float f[])
/*---------------------------------------------------------------------------
Returneaza membrii drepti ai sistemului de ecuatii diferentiale
---------------------------------------------------------------------------*/
{
f[1] = y[2];
f[2] = -y[1];
}
/*=========================================================================*/
void RungeKutta(float x, float h, float y0[], float y[], int n,
void Func(float,float[],float[]))
{
. . . . . . . . . .
}
/*=========================================================================*/
void main()
{
int i, n;
float h, x, xmin, xmax;
float *y, *y0;
printf("n = "); scanf("%i",&n); /* ordinul sistemului */
y0 = Vector(1,n);
y = Vector(1,n);
printf("xmin = "); scanf("%f",&xmin); /* domeniul de integrare */
printf("xmax = "); scanf("%f",&xmax);
for (i=1; i<=n; i++) /* conditiile initiale */
{ printf("y0[%i] = ",i); scanf("%f",&y0[i]); }
printf("h = "); scanf("%f",&h); /* pasul */
printf(" x y\n");
x = xmin;
while (x < xmax) { /* ciclul de propagare */
RungeKutta(x,h,y0,y,n,Func1);
x += h; /* actualizeaza */
for (i=1; i<=n; i++) y0[i] = y[i]; /* conditiile initiale */
printf("%10f",x);
for (i=1; i<=n; i++) printf("%10f",y[i]);
printf("\n");
}
FreeVector(y0,1);
FreeVector(y ,1);
}
9
Bibliography
[1] C.W. Gear, Numerical Initial Value Problems in Ordinary Dierential Equations
(Prentice-Hall, Englewood Clis, NJ, 1971).
[2] L.Gr. Ixaru, Metode numerice pentru ecua tii diferen tiale cu aplica tii (Editura Acad-
emiei, Bucuresti, 1979).
[3] J. Stoer si R. Bulirsch, Introduction to Numerical Analysis (Springer-Verlag, New
York, 1980).
[4] M. Toma si I. Od agescu, Metode numerice si subroutine, Editura tehnic a, Bucuresti,
1980).
[5] W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Flannery, Numerical Recipes in
C: The Art of Scientic Computing, Second Edition (Cambridge University Press,
Cambridge, 1992).