Sunteți pe pagina 1din 5

© Carmen-Sanda Georgescu, Tudor Petrovici, Radu Popa

Metode numerice. Fisa de laborator nr. 9:


CALCUL MATRICIAL(II). Rezolvarea sistemelor de ecuatii neliniare
(Metoda iterativa Jacobi, Metoda Gauss-Seidel, Metoda lui Newton,
Metoda lui Newton-Raphson)

6. REZOLVAREA SISTEMELOR DE ECUAŢII NELINIARE

Fie un sistem de ecuaţii neliniare de forma


f i ( x1 , x 2 , K , x n ) = 0 , i = 1,2, K , n , (9.1)

care poate fi scris sub forma vectoriala: F ( X ) = 0 , F:R n


→ R, F(X)=[f1(X) f2(X) . . . fn(X) ]
si X=[x1 x2 . . . xn] (9.2)
Sistemul (9.2) este echivalent cu sistemul: X = G ( X ) , G:Rn → R, G(X)=[g1(X) g2(X) . . . gn(X) ]
si X=[x1 x2 . . . xn], unde gi(X) sunt alese astfel incat daca xi= gi(X), pentru i=1,2, . . . ,n atunci
fi(X)=0 (9.3)

6.1. METODA ITERATIVĂ JACOBI PENTRU REZOLVAREA SISTEMELOR NELINIARE


Algoritm: Pornind un proces iterativ cu vectorul de start X(0)=[x(0)1 x(0)2 . . . x(0)n], vectorul soluţie se
calculează iterativ cu relaţia:

X (k +1) = G X (k ) ( ) , (9.4)
ale carei componente sunt:

( ) ( )
xi(k +1) = g i x1(k ) , x 2(k ) ,K , x n(k ) = g i X (k ) , i = 1,2, K , n . (9.5)
In fond, se considera sistemul neliniar sub forma:
⎧ f (x ( ) , x ( ) , K, x ( ) ) = 0
k +1 k k

⎪ f (x , x
( ) ( ) ,K, x ( ) ) = 0
1 n
⎪ 1
k
2
k +1 k
2 n
⎨ 1 2 , (9.6)
⎪ KKK
⎩ n 1 (
⎪ f x ( k ) , x ( k ) , K , x ( k +1 ) = 0
2 n )
din care se rezolva (explicit sau numeric) fiecare ecuaţie fi pentru xi(k +1) in funcţie de x (jk ) , j = 1, n si

j ≠ i . Notă: Functia iterativa seamana cu metoda substitutiilor succesive pentru f ( x ) = 0 si cu metoda


iterativa Jacobi pentru sisteme de ecuaţii algebrice liniare. Conditia de convergenţă este:
n
∂g i ( X )
∑ ≤ λ < 1, i=1,2, . . . ,n (9.7)
j =1 ∂x j

iar pentru o alegere potrivită a aproximaţiei iniţiale (de start) X (0 ) , soluţia iterativă tinde catre solutia
exactă α, adică: lim X (k ) → α .
k →∞
Exemplul 1: Folosind metoda iterativa Jacobi cu 3 iteratii, sa se rezolve sistemul de ecuatii neliniare
x3-3*x*y2+1=0
3*x2-y3=0
folosind solutia de start x0=1, y0=1
Pas1: Se expliciteaza x=g1(y) si y=g2(x) din a doua ecuatie si respectiv din prima ecuatie
Se obtine sistemul echivalent x=sqrt(y3/3*y), y=sqrt((x3+1)/3*x)
Pas2: Daca g1(y)= sqrt(y3/3*y) si g2(x)= sqrt((x3+1)/3*x), atunci conditiile de convergenta (9.7) devin
sqrt(3)/3 ≤ λ , (sqrt(3)/3)*sqrt(x3/(x3+1)) ≤ λ cu λ<1; se observa ca exista λ<1 care sa satisfaca
simultan cele doua inegalitati (spre exemplu λ=sqrt(3)/2 )
Pas3: Se construeste schema iterativa Jacobi
xk+1=sqrt(yk2/3), yk+1=sqrt((xk3+1)/3*xk), cu k=0,1,2, . . . cu solutia de start x0=1, y0=1
Comentariu: La iteratia a 3-a se obtine cea mai buna valoare a solutiei x3= 0.47905, y3= 0.88384
Dupa ietratia a 4-a solutiile incep sa se departeze usor de solutia „exacta” (Vezi Problema 1 la APLICATII)
si se stabilizeaza dupa iteratia a 19-a la valorile x= 0.50000, y= 0.86603

6.2. METODA ITERATIVĂ GAUSS-SEIDEL PENTRU REZOLVAREA SISTEMELOR


NELINIARE
Algoritm: In scopul imbunatatirii vitezei de convergenta a procesului iterativ Jacobi, metoda lui
Gauss si Seidel utilizeaza o schema iterativa obtinuta astfel (conditiile de convergenta raman cele de la
metoda Jacobi): intr-o ecuaţie oarecare fi a sistemului (9.6) toate valorile solutiei deja obtinute la
iteratia curenta, adica ecuaţia:

( )
f i x1(k +1) , x 2(k +1) , K , xi(k +1) , xi(+k1) , K , x n(k ) = 0 (9.8)

se rezolva (explicit sau numeric) pentru x


(k +1) in funcţie de x (k +1) , K , x (k +1) , x (k ) , K , x (k ) .
i 1 i −1 i +1 n
Exemplul 2: Folosind metoda iterativa Gauss-Seidel cu 3 iteratii, sa se rezolve sistemul de ecuatii neliniar
x3-3*x*y2+1=0
3*x2-y3=0
folosind solutia de start x0=1, y0=1
Pas1: Se expliciteaza x=g1(y) si y=g2(x) din a doua ecuatie si respectiv din prima ecuatie
Se obtine sistemul echivalent x=sqrt(y3/3*y), y=sqrt((x3+1)/3*x)
Pas2: Daca g1(y)= sqrt(y3/3*y) si g2(x)= sqrt((x3+1)/3*x), atunci conditiile de convergenta (9.7) devin
sqrt(3)/3 ≤ λ , (sqrt(3)/3)*sqrt(x3/(x3+1)) ≤ λ cu λ<1; se observa ca exista λ<1 care sa satisfaca
simultan cele doua inegalitati (spre exemplu λ=sqrt(3)/2 )
Pas3: Se construeste schema iterativa Gauss-Seidel
xk+1=sqrt(yk2/3), yk+1=sqrt((xk+13+1)/3*xk+1), cu k=0,1,2, . . . cu solutia de start x0=1, y0=1
Comentariu: La iteratia a 3-a se obtine cea mai buna valoare a solutiei x3= 0.47905, y3= 0.87882
Dupa ietratia a 4-a solutiile incep sa se departeze usor de solutia „exacta” (Vezi Problema 1 la APLICATII)
si se stabilizeaza dupa iteratia a 13-a la valorile x= 0.50000, y= 0.86603

6.3. METODA NEWTON GENERALIZATĂ PENTRU REZOLVAREA ITERATIVĂ A


SISTEMELOR NELINIARE
Algoritm: Se considera sitemul neliniar (9.1) şi o solutie iniţială (de start) X (0 ) a acestuia.
Schema iterativa Newton generalizata se prezinta sub forma :
⎧ ( k +1 ) (
= x1 −k) ( )
f 1 x1(k ) , x 2(k ) , K, x n(k )
⎪ x1
⎪ ( )
∂f 1 x1(k ) , x 2(k ) , K, x n(k )

⎪ ∂x1
⎪ ( k +1 ) (
= x2 −k) (
( k +1 ) ( k )
f 2 x1 , x 2 , K, x n(k ) )
⎪ x2
⎪ ( )
∂f 2 x1(k +1) , x 2(k ) , K, x n(k )
⎨ (9.9)
⎪ ∂x 2
⎪KKKKKKKKKKKKKKK
⎪ ( k +1 )
= (k ) − f i x1 ( i −1 n )
(k +1) , K , x (k +1) , x (k ) , K , x (k )

( )
i
⎪ i
x x ( k +1) ( k +1 ) ( k )
∂f i x1 , K, xi −1 , xi , K, x n(k )
i

⎪ ∂xi

⎩K K K K K K K K K K K K K KK
Se observa ca metoda lui Newton generalizata poate fi folosita numai pentru sistemele care indeplinesc
conditia ca derivatele partiale ∂fi/∂xi≠0, pentru i=1,2, . . . ,n si in toti vectorii care formeaza traiectoria
solutiei catre solutia cautata (sistemul neliniar de la Exemplul 1 si Exemplul 2 nu poate fi abordat cu
aceasta metoda pentru ca spre exemplu [∂( x3-3*x*y2+1)/∂x]x=1,y=1=0 !
Exemplul 3: Folosind metoda iterativa Newton generalizata cu 3 pasi de iterare, sa se rezolve sistemul de
ecuatii neliniar
x2+y2-1=0
x3-y=0
folosind solutia de start x(0)=0.9, y(0)=0.5
Pas1: Daca f1(x,y)= x2+y2-1, f2(x,y)= x3-y, se calculeaza derivatele partiale ∂f1/∂x=2*x si ∂f2/∂y=-1.
Pas2: Se construieste schema iterativa Newton generalizata valabila pentru k=0,1,2, . . .
x(k+1)=x(k) –[ (x(k))2+(y(k))2-1 ]/[ 2*x(k)]
y(k+1)=y(k) – [(x(k))3-y(k)]/[ -1]
Pas3: Se porneste procesul iterativ cu solutia de start x(0)=0.9, y(0)=0.5
Rezulta la primul pas de iteratie
x(1)=x(o) –[(x(0))2+(y(0))2-1]/[ 2*x(0)] ⇒ x(1)= 0.86667
y(1)=y(0) – [(x(0))3-y(0)]/[ -1] ⇒ y(1)= 0.72900
Se continua iteratiile pentru k=1,2, . . . , conform schemei iterative de la pasul 2

6.4. METODA NEWTON-RAPHSON PENTRU REZOLVAREA SISTEMELOR NELINIARE


Algoritm: Sistemul (9.4) se poate scrie pentru diverse forme ale lui G( X ). De exemplu, fie:

G ( X ) = X − A( X ) ⋅ F ( X ) , unde A( X ) = (aij ( X )) este o matrice patrata de ordinul n. In metoda


Newton-Raphson, matricea A se alege a fi inversa matricii Jacobian J, adica: A( X ) = J −1 ( X ) , unde

⎛ ∂f ( X ) ⎞
J (X ) = ⎜ i ⎟ , functiile fi fiind componentele vectorului F.
⎜ ∂x j ⎟
⎝ ⎠
Relaţia iterativă de calcul a solutiei sistemului devine:

( ) ( )
X (k +1) = X (k ) − J −1 X (k ) ⋅ F X (k ) . (9.10)
Daca introducem vectorul de corectie intre doua iteratii succesive:

δX (k +1) = X (k +1) − X (k ) , (9.11)


se observa ca (9.10) devine:

( ) (
J X (k ) ⋅ δX (k +1) = − F X (k ) ) . (9.12)
Dupa rezolvarea sistemului liniar (9.12) si aflarea vectorului de corectie δX(k+1), se obtine din (9.11) solutia
la iteratia curenta: X(k+1).
Se poate utiliza si un coeficient de pondere ω plasat in domeniul 0 < ϖ ≤ 1:
X (k +1) = X (k ) + ϖ ⋅ δX (k +1) . (9.13)
Iteratiile continua pana la realizarea unui criteriu de convergenta impus, cum ar fi:

δxi(k +1)
max
i ( k) i
( )
≤ ε , sau max f i X (k ) ≤ ε , cu ε ales suficient de redus.
x i
Comentariu: O dificultate majora a metodei o constituie necesitatea determinarii Jacobianul functiei F(X)
care contine derivatele partiale ∂fi/∂xj..Algoritmii numerici care implementeaza algoritmul Newton-
Raphson au posibilitatea ca in eventualitatea in care utilizatorul nu foloseste Jacobianul functiei F(X) sa
inlocuiasca il inlocuiasca cu calculul derivatelor partiale prin diferente finite, J(X,h)=∆i j(X,h).
Exemplul 4: Folosind metoda iterativa Newton-Raphson cu 3 iteratii, sa se rezolve sistemul de ecuatii
neliniar
x3-3*x*y2+1=0
3*x2-y3=0
folosind solutia de start x(0)=1, y(0)=1
Pas1: Se formeaza matricea F(X)=[ f1(x,y) f2(x,y)]T =[x3-3*x*y2+1 3*x2-y3]T si matricea jacobian
J(X)=[ ∂f1/∂x(x,y) ∂f1/∂y(x,y); ∂f2/∂x(x,y) ∂f2/∂y(x,y)]=[3*x2-3*y2 -6*x*y; 6*x -3*y2]
Pas2: Se calculeaza F(X(0))=[-1 1]T si J-1(X(0))=[-1/12 1/6;-1/6 0] si se parcurge primul pas al procesului
iterativ cu solutia de start x(0)=1, y(0)=1
[x(1) y(1)]T=[x(0) y(0)]T – J-1(X(0))* F(X(0)) ⇒ [x(1) y(1)]T =[1 1]T-[-1/12 1/6;-1/6 0]* [-1 1]T=[11/12 7/6]
Pas3: Se calculeaza J-1(X(1)) si se parcurge pasul 2 al procesului iterativ
[x(2) y(2)]T=[x(1) y(1)]T – J-1(X(1))* F(X(1))
Pas4: Se continua cautarea solutiei dupa schema iterativa
[x(k+1) y(k+1)]T=[x(k) y(k)]T – J-1(X(k))* F(X(k)), pentru k=2,3, . . .
Functii Octave pentru rezolvarea sistemelor neliniare si/sau transcendente

[x, info, msg] = fsolve (fcn, x0)


Calculeaza solutia ecuatiei transcendente/sitemului transcendent, pornind de la solutia de start x0.
Remarcam ca procesul iterativ de cautare a solutiei este sensibil la valoarea de start
Intrari: Daca fcn, contine numai numele functiei f(x) si x0 este valoarea de start a solutiei, fsolve ,
rezolva ecuatia /sistemul f(x) = 0. Daca fcn este un tablou de doua elemente, primul element este
numele functiei f iar al doilea element este jacobianul j(x)
df_i
jac(i,j) = ----
dx_j
De remarcat ca se poate folosi si functia fsolve_options care poate contine un set de parametrii
pentru fsolve
APLICAŢII
⇒Problema 1. Sa se rezolve sistemul de ecuatii neliniare , folosind functia Octave fsolve
x3-3*x*y2+1=0
3*x2-y3=0
folosind solutia de start x(0)=1, y(0)=1
Sa se compare rezultatul obtinut cu rezultatele obtinute la Exemplele 1 si 2
Rezolvare: Se editeaza functia y=f(x)
octave#1>function y = f (x)
> y(1) = x(1).^3 + 3*x(1).*x(2).^2+1;
> y(2) = 3*x(1).^2 - x(2).^3 ;
>endfunction
apoi se cheama in mediul Octave functia fsolve cu sintaxa
octave#2> [x, info,msg] = fsolve ("f", [1; 1])
Rezulta solutia x si info ( info=1 anunta ca procesul prin care s-a gasit solutia, este convergent)
x =[ 0.476822160309098 0.880260820452681]T, info = 1, msg = solution converged within specified
tolerance
Verificare: octave#3>f(x) # Returneaza ans = -3.77475828372553e-15 -1.33226762955019e-15
⇒Problema 2. Folosind metodele iterative Jacobi si Gauss-Seidel, cu 4 pasi de iterare, sa se rezolve
sistemul de ecuatii neliniar
x3-3*x*y2-2*x+2=0
3*x2*y-y3-2*y=0
folosind solutia de start x0=1, y0=1
⇒Problema 3. Folosind metoda iterativa Newton-Raphson, cu 3 pasi de iterare, sa se rezolve sistemul de
ecuatii neliniar
x2+y2-1=0
x3--y=0
folosind solutia de start x0=0.9, y0=0.5
Sa se compare solutiile obtinute cu solutia care se obtine folosind functia Octave fsolve
x= 0.82603 , y=0.56362
⇒Problema 4. Folosind metoda iterativa Newton generalizata , cu 2 pasi de iterare, sa se rezolve sistemul
de ecuatii neliniare si transcendente
x+3*lg(x)-y2=0
2*x3—x*y-5*x+1=0
folosind solutia de start x0=3.4, y0=2.2
Sa se compare solutiile obtinute cu solutia care se obtine folosind functia Octave fsolve
x= 3.4874 , y= 2.2616
⇒Problema 5. Folosind metoda iterativa Gauss-Seidel , cu 3 pasi de iterare, sa se rezolve sistemul de
ecuatii neliniare si transcendente
sin(x)-y-1.32=0
x-cos(y)-0.5=0
folosind solutia de start x0=1.3, y0=-0.4
Sa se compare solutiile obtinute cu solutia care se obtine folosind functia Octave fsolve
x= 1.44679 , y= -0.32768
⇒Problema 6. Sa se rezolve sistemul de ecuatii neliniare si transcendente, folosind functia Octave fsolve
-2x^2 + 3xy + 4 sin(y) = 6
3x^2 - 2xy^2 + 3 cos(x) = -4
folosind solutia de start x0=1, y0=2
Rezolvare: Se editeaza functia y=f(x)
octave#1>function y = f (x)
> y(1) = -2*x(1).^2 + 3*x(1).*x(2) + 4*sin(x(2)) - 6;
> y(2) = 3*x(1).^2 - 2*x(1).*x(2)^2 + 3*cos(x(1)) + 4;
>endfunction
apoi se cheama in mediul Octave functia fsolve cu sintaxa
octave#2> [x, info,msg] = fsolve ("f", [1; 2]) Observatie…cand nu se specifica Jacobianul lui F…
Rezulta solutia x si info ( info=1 anunta ca procesul prin care s-a gasit solutia, este convergent)
x =[ 0.633445666940771 1.482872760937817]T, info = 1, msg = solution converged within specified
tolerance
Verificare: octave#3>f(x) # Returneaza ans =2.4869e-14 -8.5265e-14
Comentariu: Daca se foloseste Jacobianul functiei F(X) (in sensul definit de metoda Newton-Raphson), va
trebui ca inainte de a se chema functia fsolve in mediul Octave, sa se scrie functia f1 care defineste
Jacobianul sistemului, apoi se cheama in mediul Octave functia fsolve cu sintaxa
octave#3> [x, info] = fsolve (["f" "f1”], [1; 2])
Rezulta solutia: x=0.633445666940845; y= 1.482872760937504
Verificare: octave#3>f(x) # Returneaza ans =2.4869e-14 -8.5265e-14
Comentariu: Daca se foloseste Jacobianul functiei F(X) (in sensul definit de metoda Newton-Raphson), va
trebui ca inainte de a se chema functia fsolve in mediul Octave, sa se scrie functia care defineste
Jacobianul si anume:
octave#2>function y=f1(x)
>y(1,1)=-4*x(1)+3*x(2);
>y(1,2)=3*x(1)+4*cos(x(2));
>y(2,1)=6*x(1)-2*x(2).^2-3*sin(x(1));
>y(2,2)=-4*x(1).*x(2);
>endfunction
apoi se cheama in mediul Octave functia fsolve cu sintaxa
octave#3> [x, info] = fsolve (["f" ; "f1”], [1; 2])
Rezulta solutia: x=0.633445666940845; y= 1.482872760937504