Sunteți pe pagina 1din 7

CURSUL 7.

ECUAŢII DIFERENŢIALE ORDINARE

Una din problemele fundamentale, din multe domenii ştiinţifice şi inginereşti, este
problema modelării şi simulării. Scilab-ul furnizează o serie de mijloace pentru
dezvoltarea şi simularea diferitelor tipuri de modele. Unul dintre cele mai
cunoscute modele este cel guvernat de ecuaţiile diferenţiale ordinare.

7.1. Ecuaţii diferenţiale ordinare de ordinul întâi

O ecuaţie diferenţială ordinară de ordinul întâi este o ecuaţie în care


necunoscuta este o funcţie y(x) ce depinde de o singură variabilă şi care satisface o
relaţie de tipul
y '  x   f  x, y  x 
O ecuaţie diferenţială are în general o infinitate de soluţii şi pentru selectarea uneia
singure se impun condiţii suplimentare. Cea mai utilizată condiţie în acest sens este
condiţia Cauchy.
Problema Cauchy pentru ecuaţii diferenţiale constă în determinarea unei
 y( x)  f ( x, y ( x))
funcţii y(x) astfel ca  .
 y ( x0 )  y0
Se împarte intervalul [x0, x0+L] pe care se caută soluţia în subintervale egale de
lungime h: x0<x1<x2<…<xn= x0+L. Iniţial se cunoaşte y0=y(x0). Trebuie
determinat yi , pentru i>0, în funcţie de valorile (xk,yk), k<i.
În fiecare metodă de determinare a lui yi se caută ca eroarea care se face să fie cât
mai mică. Adică, dacă y(xk)=yk pentru k<i, atunci, formula care determină pe yi să
fie astfel ca |y(xi)-yi|=O(hs) cu s cât mai mare, ceea ce inseamnă că diferenţa
|y(xi)-yi| este mică pentru h mic.
Valorile soluţiei în punctele xi se aproximează prin numerele yi care se determină
cu formulele de mai jos.
7.1.1.Metode uni-pas

Se numesc astfel metodele în care pentru calculul lui yi se folosesc doar valorile
pentru x şi y la pasul i-1.
Avem

y  x  h   y  x   0h y '  x  t dt  0h f  x, y  x  t dt . (1)


În funcţie de cum se aproximează integrala se obtin diverse metode pentru
estimarea lui y(x+h).

7.1.1.1. Metoda Euler:


y  x  h   y ( x)  0h y '  x  t dt 
   
(2)
 y  x   y '  x h  O h  y  x   hf  x, y  x   O h
2 2

adică

 
y  xi 1  h   y  xi 1   f  xi 1 , y  xi 1  h  O h 2 .
Putem calcula aproximativ atunci pe yi astfel:
yi  yi 1  h  f ( xi 1 , yi 1 ), i  1, n (3)
În acest caz s=2, iar metoda se numeşte metoda lui Euler.

7.1.1.2. Metoda predictor-corector


Să calculăm integrala (1) prin metoda trapezelor. Găsim :

y ( x  h)  y  x  
h
2
 
 y ' x   y ' x  h   O h3 
(4)
 y  x    f  x, y  x   f  x  h, y  x  h   O h3
h
2
 
Prin urmare această metodă ne conduce la:

yi  yi 1 
h
 f xi 1 , yi 1   f xi , yi  (5)
2
Formula (5) conţine pe yi implicit, dar pentru h mic, membrul II din (5) este o
contracţie ca funcţie de yi, deci se poate determina yi din (5) prin aproximaţii
succesive:
 yip  yi 1  hf  xi 1 , yi 1  predictor

 c
 
 yi  yi 1  f  xi 1 , yi 1   f xi , yi corector
h
2
p
 (6)

 yip  yic noul predictor

Prin repetarea ultimelor doua ecuaţii din (5) până | yip  yic | devine suficient de mic
se ajunge la yi din (5) cu precizia dorită. Metoda se numeşte predictor-corector şi
aproximează soluţia ecuaţiei diferenţiale mai bine ca metoda Euler: s=3.

7.1.1.3. Metoda Euler perfecţionată:


Dacă în (4) înlocuim y(x+h) cu y* astfel ca |y(x+h)-y*|=O(h2) atunci (4) se mai
scrie:

yx  h   yx  
h
2
 
f  x, y  x   f x  h, y*  O h3   (7)

Acest lucru poate fi realizat dacă luăm y*=y(x)+hf(x,y(x)), (conform cu (2)), caz în
care (7) devine:

yx  h   yx  
h
2
 f x, yx   f x  h, ( yx   hf x, yx   O h3   (8)

De aici deducem următoarea formula de calcul aproximativ:


h
y i  y i 1   f ( xi 1 , yi 1 )  f ( xi , yi 1  h  f ( xi 1 , yi 1 ), i  1, n (9)
2
cunoscută sub numele de metoda Euler perfecţionată. Eroarea la un pas este O(h3).

7.1.1.4 Metode de tip Runge-Kutta


Aceste metode constau în a determina o aproximare pentru y(x+h) astfel:
a) Se determină k1, k2,..kq prin:
k1 h   hf  x, y  x 
k h   hf  x   h, y  x    k h 
 2 2 21 1
 (10)
.......

kq  hf x   q h, y  x    q ,1k1 h    q , 2 k2 h   ..   q , q 1kq 1 h  
b) Se determină z(h) ca aproximare pentru y(x+h) prin:
z h   y  x   p1k1 h   p2k2 h   ...  pq kq h  (11)

Coeficienţii ,, p se determină din condiţia ca r(h)=y(x+h)-z(h)=O(hs) pentru un s


cât mai mare. Se găseste:
1 1
a) pentru q=2, s=3 rezultă  2  2,1  p1  t p2  1  t . Pentru t=3/4, y(x)
2t 2t
înlocuit cu yi-1 şi z(h) cu yi+1 se obtin formulele:

k1  hf  x, yi 1 

  2 2 
k 2  hf  xi 1  h, yi 1  k1 
  3 3  (12)
 1 3
 yi  yi 1  k1  k 2
 4 4

numite formule Runge-Kutta de ordin 2


1 1 1 1
ii) pentru q=4, s=5 se găseste de exemplu  2  ,21  ,  3  ,31  0,32 
2 2 2 2
 4  1,41  0,42  0,43  1 , ceea ce conduce la formulele:

k1  hf ( xi 1 , yi 1 )

k 2  hf  xi 1  h , yi 1  k1 
  2 2

  h k2 
k3  hf  xi 1  , yi 1   (13)
  2 2
k 4  hf  xi 1  h, yi 1  k3 

 y  y  1 k  2k  2k  k , i  1, n
i 1
 i 6
1 2 3 4

cunoscute ca formulele Runge-Kutta de ordinul 4.


În ce priveşte convergenţa lui yi la y(xi) avem teorema:
Teorema. Fie f(x,y) de clasa C1 şi |fy(x,y)|<C. Fie intervalul [x0,x0+L] divizat în
părţi egale. Fie |y(xi+1)-yi|<C1hs+  , în situaţia când y(xi)=yi, unde h este pasul
între xi-1 şi xi. Termenul C1hs reprezintă eroarea de metoda, iar  reprezintă
eroarea de rotunjire. Fie r0  y x0   y0 . Atunci pentru x0  xi  x0  L

max | y  xi   yi | e LC C1h s 1  i  r0
L
 (14)
0i 
h

 y ( x)  x * y
EXEMPLU: Fie  Se cere valoarea lui y pentru x=1.
 y ( 0)  1
Soluţie în Scilab:
function f=f(x,y)
f=x*y;
endfunction
function y=Euler(n,x,xx,y)
h=(xx-x)/n;
for i=1:n do
y=y+h*f(x,y);
x=x+h;
end
endfunction
Euler(10,0,1,1)
function y1=EulerPerfectionata(n,x,xx,y1)
h=(xx-x)/n;
for i=1:n do
y1=y1+h/2*(f(x,y1)+f(x+h,y1+h*f(x,y1)));
x=x+h;
end
endfunction
EulerPerfectionata(10,0,1,1)
function y2=RungeKutta(n,x,xx,y2)
h=(xx-x)/n;
for i=1:n do
k1=h*f(x,y2);
k2=h*f(x+h/2,y2+k1/2);
k3=h*f(x+h/2,y2+k2/2);
k4=h*f(x+h,y2+k3);
y2=y2+1/6*(k1+2*k2+2*k3+k4);
x=x+h;
end
endfunction
RungeKutta(10,0,1,1)
ans = 1.5471104
ans = 1.6478813
ans = 1.648721
ans = 1.6487224
Observaţie: În Scilab există funcţii de rezolvare a ecuaţiilor diferenţiale: De
exemplu ode – rezolvarea de ecuaţii diferenţiale ordinare
y=ode(y0,t0,t,f)
[y,w,iw]=ode([type],y0,t0,t [,rtol [,atol]],f [,jac] [,w,iw])
[y,rd,w,iw]=ode("root",y0,t0,t [,rtol [,atol]],f [,jac],ng,g [,w,iw])
y=ode("discrete",y0,k0,kvect,f)
Parametri:
y0: vector real sau matrice (condiţiile iniţiale).
t0: scalar rea (timpul iniţial).
t: vector real (timpuri la care soluţia e calculată).
f: extern (funcţie sau şir de caractere sau listă).
type: unul din şirurile de caractere: "adams" "stiff" "rk" "rkf" "fix" "discrete"
“roots"
rtol,atol: constante reale sau vectori reali de aceeaşi dimensiune ca şi y.
jac: extern (funcţie sau şir de caractere sau listă).
w, iw: vectori reali.
ng: întreg.
g: extern (funcţie sau şir de caractere sau listă).
k0: intreg (timp iniţial).
kvect : vector de întregi.

Solutie cu ode:
function f=f(x,y)
f=x*y;
endfunction
y0=1;x0=0;x=0:0.01:1
y=ode(y0,x0,x,f)
plot(x,y)
ans = 1.6487224
Exerciţii:
 y( x)  y  y  y( x)  y 2 x
 pentru x  1.5 ;  pentru x  1.25 ;
 y (1)  1  y ( 0 )  1

 y  y
2

 y ( x)    
 x  x  pentru x  4
 y (1)  1

a) să se programeze rezolvarea unei ecuaţii prin metoda Euler, cu reprezentarea
grafică a soluţiei.
b) să se programeze rezolvarea unei ecuaţii diferentiale prin metoda Euler
perfectionată. Reprezentaţi grafic soluţia.
c) să se programeze rezolvarea unei ecuaţii prin metoda Euler predictor-corector .
d) să se programeze rezolvarea unei ecuaţii prin metoda Runge Kutta de ordinul 4.
Să se reprezinte grafic soluţia.

S-ar putea să vă placă și