Sunteți pe pagina 1din 14

METODE MUMERICE LUCRRI DE LABORATOR

#07

LUCRAREA #07

REZOLVAREA SISTEMELOR DE ECUAII II

REZUMATUL I SCOPUL LUCRRII


n laboratorul precedent s-au studiat metodele directe de rezolvare a sistemelor de
ecuaii liniare, respectiv, metoda eliminrii lui Gauss cu pivotare parial i pentru
rezolvarea sistemelor tridiagonale.
Prezenta lucrare este continuarea lucrrii precedente i are drept scop prezentarea
i elaborarea unor funcii n MatLab pentru metodele de rezolvare a sistemelor de
ecuaiilor algebrice liniare, respectiv metodele iterative Jacobi i Gauss-Seidel i de
asemenea pentru sistemele tridiagonale. Metodele indirecte sau iterative au ca baz
pornirea la o aproximaie iniial x0 i de la o relaie de iteraie i construirea unui ir de
aproximaii xk, care converge n anumite condiii ctre soluia exact a sistemului. Procesul
iterativ se oprete atunci cnd aproximaia de ordinul k se ncadreaz ntre limitele unei
precizii stabilite iniial. Cele mai cunoscute sunt metoda Jacobi, metoda Gauss-Seidel,
metoda relaxrii.
n final se prezint i funcia predefinit MatLab pentru rezolvarea sistemelor de
ecuaii neliniare.

CUPRINSUL LUCRRII
1. Metoda iterativa Jacobi
2. Metoda iterativ Gauss-Seidel
3. Rezolvarea sistemelor neliniare
4. Aplicaii de laborator

95

#07

Rezolvarea sistemelor de ecuaii II

1. Metoda iterativ Jacobi


Se consider un sistem liniar de n ecuaii i n necunoscute, care se scrie sub forma
A x b .
Metoda folosete descompunerea matricei sistemului A sub forma: A D C , n
care D este matricea diagonal corespunztoare matricei A (matricea care are pe diagonala
principal elementele de pe diagonala principal a matricei i restul elementelor egale cu
0) , care trebuie s fie nesingular, lucru care necesita ca nici un element de pe diagonala
principal s fie 0, iar matricea C conine restul elementelor matricei A.
n acest caz sistemul devine:

D x C x b x D 1 C x D 1 b

(7.1)

De aici rezult relaia de iteraie care genereaz aproximaiile succesive ale soluiei
sistemului:

x ( k 1) B x ( k ) d

(7.2)

unde s-a notat: B D 1 C aa zisa matrice de iteraie i d D 1 b, k 0,1, 2,... , aa


zisul vector de iteraie.
Formula explicit a aproximantei de ordin (k+1), folosind aproximanta de ordin (k)
este dat de relaia:
n

bi
xik 1

j 1, j i

aii

aij x kj
, i 1..n, k 0,1, 2,...

(7.3)

Identificnd n relaia de mai sus, se poate observa c elementele vectorului de


iteraie sunt de forma :

bi
, i 1, 2,...n
aii

(7.4)

iar elementele matricei de iteraie sunt de forma

aij
aii

, i, j 1, 2,...n si i j

(7.5)

Cu alte cuvinte pentru crearea programului n MatLab nu este nevoie s definim


vectorul i matricea de iteraie, ci s lucrm direct cu elementele matricei sistemului i
vectorului termenilor liberi.
Procesul de calcul se poate opri dup un anumit numr de iteraii, cnd diferena
n modul a dou aproximaii succesive se ncadreaz n limitele toleranei impuse la calcul,
adic:
96

METODE MUMERICE LUCRRI DE LABORATOR

x ( k 1) x ( k ) tol

#07
(7.6)

Folosind cele expuse, se va scrie o funcie care s rezolve un sistem prin aceast
metod.
Date de intrare:
A matricea sistemului
b vectorul termenilor liberi
n numrul de ecuaii
tol toleranta de calcul
x aproximaia iniiala a soluiei
Date de ieire:
x irul aproximaiilor succesive ale soluiei sistemului
nx - numarul de iteratii dupa care s-a obinut soluia sistemului
it=50 %se stabileste de la inceput un anumit nr. de iteratii
pentru k=1 pna la it %numarul de iteratii
pentru i=1 pn la n %parcurge matricea pe linii
n

s=0 %initializare

aij x kj

j 1, j i

pentru j=1 pn la n % parcurge matricea pe coloane


dac i j
s=s+ aij x j
n

bi
x(i)=

aij x kj

j 1, j i

aii

%in matlab x(i)=(b(i)-s)/A(i,i)

%testare conditie de oprire


daca max x x 0 tol
nx=k %numarul de iteratii
break
x0=x %reinitializare x0 pentru urmatoarea iteratie

Pentru implementarea n Matlab, se utilizeaz un numr de iteraii impus de la


nceput. Dac se constat c acest numr este mic, atunci acesta se modific.
Funcia ntoarce soluia aproximativ i numrul de iteraii dup care s-a gsit
aceast soluie i la fiecare iteraie se afieaz irul aproximativ de soluii.
function [x,nx]=metoda_jacobi(A,b,x0,tol,it)
%functie pentru rezolvarea unui sistem de ecuatii liniar prin metoda iterativa
Jacobi
% Intrari
%
A
matricea sistemului
%
b
vectorul termenilor liberi sub forma de vector linie
%
n
numarul de ecuatii ale sistemului
%
x0
aproximatia initiala sub forma unui vestor linie
%
tol
toteranta de caclul
%
it
nr. de iteratii impus
% Iesiri
%
x
vector ce contine solutia sistemului
%
nx
numarul de iteratii dupa care s-a obtinut solutia sistemului
% Calcule algoritm JACOBI
n=length(b)
for k=1:it %numarul de iteratii

97

#07

Rezolvarea sistemelor de ecuaii II

for i=1:n
s=0;
for j=1:n
if (j~=i)
s=s+(A(i,j)*x0(j));
end
end
x(i)=(b(i)-s)/A(i,i); %calculare x(i)
end
if max(abs(x-x0))<tol %conditia de oprire a procesului iterativ
nx=k;break;
end
x0=x %afisare sir solutii intermediar la iteratia k
pause
end

O condiie necesar ca metoda s gseasc irul de aproximaii a soluiei i ca


acesta s convearg spre soluia exact, este ca matricea sistemului s fie diagonal
dominant, adic pe diagonala principal s se gseasc elementele cele mai mari, adic:
n

ai ,i

ai , j , i 1..n

(7.7)

j 1, j i

Este bine de la nceput a se testa dac aceast convergen are loc sau nu.
O funcie care poate face acest lucru calculeaz suma elementelor de pe fiecare
linie, exceptnd elementul de pe poziia [i,i]. Dac pentru fiecare linie aceast sum (luat
n modul) este mai mic dect elementul de pe poziia [i,i] (de asemenea n modul)
nseamn ca are loc convergena. Acest lucru este foarte uor de realizat practic, prin
folosirea unui vector care are elementul de pe poziia i egal cu 0 dac condiia de mai sus
nu este ndeplinit i egal cu 1 dac condiia este ndeplinit. Cu alte cuvinte, convergena
are loc dac toate elementele vectorului creat sunt egal cu 1 (i implicit diferite de 0). n
MatLab exist funcia any care testeaz dac elementele unui vector sunt diferite de 0 sau
nu. Se poate scrie astfel funcia:
function test_convergenta(A)
% functie care testeaza daca are loc sau convergenta metodelor iterative
% de rezolvare a sistemelor liniare: Jacobi sau Gauss-Seidel
% Date de intrare
% A
Matricea sistemului
% Date de iesire
%
Se afiseaza mesajul de convergenta
[n,m]=size(A);
if n~=m
disp('Sistemul nu este liniar')
break
end
for i=1:n
suma1=0;
for j=1:n
if i~=j
suma1=suma1+abs(A(i,j));
end
end
if abs(A(i,i))>=suma1
conv(i)=1;
else

98

METODE MUMERICE LUCRRI DE LABORATOR

#07

conv(i)=0;
end
end
if all(conv)
disp('Convergenta are loc')
else
disp('Convergenta nu are loc')
end

n urma folosirii acestei funcii se poate decide dac metodele iterative pot fi sau
nu folosite.
O soluie pentru a putea folosi metodele iterative ar fi pivotarea liniilor matricei,
asemntor metodei Gauss. ns nici dup aceast operaie nu este obligatoriu ca matricea
s devin dominant diagonal
Pentru aceasta, se apeleaz funcia pivotare_partiala definit la metoda lui Gauss,
prin care ecuaiile sunt schimbate ntre ele, rezultnd o matrice a sistemului care are pe
diagonala principal unele din cele mai mari elemente ale sale, crendu-se condiiile
convergenei metodei.
Dup acest lucru se apeleaz din nou funcia de test convergen.
n final, dac n urma testului se obine un rspuns pozitiv, se apeleaz funcia
metoda_jacobi, care ntoarce soluia sistemului i numrul de iteraii dup care aceasta s-a
gsit.
Exemplul 7.1. S se rezolve urmtorul sistem folosind metoda iterativ Jacobi:
x1 x2 2 x3 3

3 x1 x3 10
x 2 x x 12
1
2
3
Se definesc elementele sistemului:
A=[1 1 -2;3 0 1;1 2 1]
b=[-3 10 12]
n=3

Determinantul matricei A este -16, deci diferit de 0; sistemul are soluie unic.
Testul de convergen:
test_convergenta(A)
Convergenta nu are loc

Se observ c nu are loc convergena.


Pivotarea matricei pentru a obine convergena metodei:
[A,b]=pivotare_partiala(A,b,n)
A =
3
0
1
1
1
-2
1
2
1
b =
10
-3
12
A =
3
0
1
1
2
1

99

#07

Rezolvarea sistemelor de ecuaii II


1

-2

10

12

-3

3
1
1

0
2
1

1
1
-2

10

12

-3

b =
A =

b =

Testul de convergen:
test_convergenta(A)
Convergenta are loc

Se observ c n urma pivotrii pariale s-au creat condiiile necesare pentru a


putea fi folosit metoda Jacobi.
Soluia iniial a sistemului (aleatoare):
x0=[1 1 1]

Apelarea funciei metoda_jacobi care va ntoarce soluia sistemului:


[x,nx]=metoda_jacobi(A,b,x0,0.00001,100)
x0 =
3.0000
5.0000
2.5000
x0 =
2.5000
3.2500
5.5000
...
x0 =
2.0000
x =
2.0000
nx =
34

3.0000

4.0000

3.0000

4.0000

Metoda Jacobi se poate adapta i pentru sistemele particulare tridiagonale.

2. Metoda iterativ Gauss-Seidel


Metoda Gauss-Seidel reprezint o modificare a metodei Jacobi, n sensul c la
calculul componentei xi( k 1) se folosesc toate componentele x (jk 1) , j<i, deja calculate la
iteraia curent, ct i componentele xl( k ) , l>I, obinute la iteraia precedent.
Se consider un sistem liniar de n ecuaii i n necunoscute, care se scrie sub forma
A x b .
Metoda folosete descompunerea matricei sistemului A sub forma: A L U , n
care L este matricea inferior triunghiular a matricei A i matricea U este matricea superior
triunghiular corespunztoare A.

100

METODE MUMERICE LUCRRI DE LABORATOR


a11

a21
L

an1

0
a22

an 2

0
0

0
0
U

ann
0

a12
0

a1n

a2 n

#07

(7.8)

i n acest caz este necesar ca matricea s fie diagonal dominant pentru a asigura
convergena metodei la soluia exact a sistemului.
Relaia de iteraie se obine astfel:

L U x b

L x U x b L x U x b

(7.9)

Se obine astfel:

L x ( k 1) U x ( k ) b

(7.10)

Sau explicit:
xi( k 1)

i 1
n
1
( k 1)
(k )
bi aij x j aij x j , i 1, 2,.., n; k 0,1, 2,...
aii
j 1
j i 1

(7.11)

De asemenea, se pornete de la o soluie iniial i se formeaz irul aproximaiilor


soluiei sistemului, folosindu-se relaia de mai sus.
Procesul de calcul se poate opri dup un anumit numr de iteraii, cnd diferena
n modul a dou aproximaii succesive se ncadreaz n limitele toleranei impuse la calcul,
adic:
x ( k 1) x ( k ) tol
(7.12)
Implementarea n MatLab este identic cu metoda lui Jacobi, diferena const n
relaia de iteraie.
Se va defini funcia metoda_gauss_seidel i se vor urma paii de la metoda Jacobi.
function [x,nx]=metoda_gauss_seidel(A,b,x0,tol,it)
%functie pentru rezolvarea unui sistem de ecuatii liniar prin metoda iterativa
Gauss-Seidel
% Intrari
%
A
matricea sistemului
%
b
vectorul termenilor liberi sub forma de vector linie
%
n
numarul de ecuatii ale sistemului
%
x0
aproximatia initiala sub forma unui vestor linie
%
tol
toteranta de calcul
%
it
nr. de iteratii impus
% Iesiri
%
x
vector ce contine solutia sistemului
%
nx
numarul de iteratii dupa care s-a obtinut solutia sistemului
% Calcule algoritm Gauss-Seidel
n=length(b)
for k=1:it %numarul de iteratii
for i=1:n

101

#07

Rezolvarea sistemelor de ecuaii II

s1=0;
for j=1:i-1
s1=s1+(A(i,j)*x0(j));
end
s2=0;
for j=i+1:n
s2=s2+A(i,j)*x0(j);
end
x(i)=(b(i)-s1-s2)/A(i,i); %calculare x(i)
end
if max(abs(x-x0))<tol %conditia de oprire a procesului iterativ
nx=k;break;
end
x0=x %afisare sir solutii intermediar la iteratia k
pause
end

Exemplul 7.2. S se rezolve sistemul urmtor folosind metoda iterativ GaussSeidel:


3 x1 x3 10

x1 2 x2 x3 12
x x 2 x 3
1 2
3

Se definesc elementele sistemului:


A=[3 0 1;1 2 1;1 1 2]
b=[10 12 -3]
n=3

Determinantul matricei A este 8, deci diferit de 0; sistemul are soluie unic.


Testul de convergen:
test_convergenta(A)
Convergenta nu are loc

Se observ c nu are loc convergena.


Pivotarea matricii pentru a obine convergena metodei:
[A,b]=pivotare_partiala(A,b,n)
A =
3
0
1
1
2
1
1
1
2
b =
10
12
-3
A =
3
0
1
1
2
1
1
1
2
b =
10

12

-3

3
1
1

0
2
1

1
1
2

A =

102

METODE MUMERICE LUCRRI DE LABORATOR

#07

b =
10

12

-3

Testul de convergen:
test_convergenta(A)
Convergenta are loc

Se observ c n urma pivotrii pariale s-au creat condiiile necesare pentru a


putea fi folosit metoda Gauss-Seidel.
Soluia iniial a sistemului (aleatoare):
x0=[1 1 1]

Apelarea funciei metoda_gauss_seidel care va ntoarce soluia sistemului:


[x,nx]=metoda_gauss_seidel(A,b,x0,0.00001,100)
x0 =
3.0000
5.0000
-2.5000
x0 =
4.1667
5.7500
-5.5000
x0 =
5.1667
6.6667
-6.4583
...
x0 =
6.0000
x =
6.0000
nx =
37

7.0000

-8.0000

7.0000

-8.0000

3. Rezolvarea sistemelor neliniare


Sistemele de ecuaii neliniare sunt mai dificil de rezolvat deoarece au mai multe
necunoscute dect ecuaii.
Un sistem de ecuaii algebrice neliniare de ordinul n se poate aduce ntotdeauna
la forma implicit:

f1 x1 , x2 ,..., xn 0

f 2 x1 , x2 ,..., xn 0

......
f x , x ,..., x 0
n
n 1 2

(7.13)

unde funciile reale f1, f2, , fn, de variabile reale x1, x2, , xn, sunt continue pe
domeniul de interes, iar cel puin una dintre ele este neliniar.

103

#07

Rezolvarea sistemelor de ecuaii II

Metodele numerice implicate n acest proces de soluionare se mpart n dou


categorii:
metode de separare a unei / unor soluii de interes;
metode de determinare, cu o precizie fixat a priori, a unei soluii separate n
prealabil.
n cea de-a doua categorie se ncadreaz urmtoarele:
metode bazate pe exprimarea explicit echivalent a ecuaiilor sistemului,
numite metode de aproximaii succesive (de exemplu: metoda aproximaiilor
succesive n versiunea Jacobi, metoda aproximaiilor succesive n versiunea
Gauss-Seidel);
metode care utilizeaz derivatele pariale ale funciilor fi, numite metode de tip
Newton;
metode de gradient (numite i metode de descretere sau de coborre).
n MatLab (versiunile mai noi) este predefinit o funcie prin intermediul creia se
pot rezolva astfel de sisteme.
Sintaxe de apelare:
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
[x,fval] = fsolve(...)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)
x = fsolve(fun,x0) pornete de la x0 i ncearc s rezolve ecuaia descris de fun. Fun
reprezint numele unei funcii definite de utilizator, corespunztoare membrului stng al
sistemului de ecuaii neliniare (forma canonic MatLab).
x = fsolve(fun,x0,optiuni) minimizeaz cu parametrii de optimizare specificai n
optuni. Optiuni este o structur returnat de funcia optimset, funcie apelat n scopul
setrii anumitor parametri, cum sunt, de exemplu, precizia de calcul a soluiei, numrul
maxim de iteraii, numrul maxim de evaluri de funcii etc.
[x,fval] = fsolve(fun,x0) returneaz valoarea funciei fun n soluia x.
[x,fval,exitflag] = fsolve(...) returneaz o valoare exitflag care descrie condiia de
ieire. Exitflag este o valoare de control, avnd diverse semnificaii, cum ar fi, de exemplu:
1 dac algoritmul a convers la o soluie, 2 schimbrile n x (de la o iteraie la alta) sunt
mai mici dect tolerana specificat, 0 numrul de iteraii a depit numrul maxim
prestabilit de iteraii sau numrul de evaluri ale funciei a depit numrul maxim
prestabilit de evaluri, -2 algoritmul pare s convearg spre un punct care nu este soluie
[x,fval,exitflag,output] = fsolve(...) returneaz o structur output care conine
informaii despre optimizare. Output este o structur care conine diverse informaii,
precum: iterations numrul de iteraii efectuate, funcCount numrul de evaluri ale
funciei, algorithm algortimul utilizat (de exemplu: Gauss-Newton, Levenberg-Marquardt
care se bazeaz pe metoda celor mai mici ptrate).
[x,fval,exitflag,output,jacobian] = fsolve(...) returneaz Jacobianul funciei fun n
soluia x.

104

METODE MUMERICE LUCRRI DE LABORATOR

#07

Exemplul 7.3. S se gseasc soluia sistemului de 2 ecuaii:


x
2 x1 x2 e 1

x
x1 2 x2 e 2
Se dorete gsirea soluiei plecnd de la aproximaia iniial x0=[-5 -5].
Primul pas, definirea unei funcii MatLab cu definiia sistemului n forma canonic:
function F = f_ex7_4(x)
F = [2*x(1) - x(2) - exp(-x(1));
-x(1) + 2*x(2) - exp(-x(2))];

Definirea aproximaiei de plecare:


x0=[-5 -5]

Definirea opiunilor de rezolvare (opional):


options=optimset('Display','iter');

Apelarea funciei fsolve:


[x,fval] = fsolve(' f_ex7_4',x0,options)

Dup 28 de evaluri se gsete soluia:


Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun
x =
0.5671
0.5671
fval =
1.0e-08 *
-0.5320
-0.5320

4. Aplicaii de laborator
Aplicaia 7.1. S se studieze sistemul:
8 x1 2 x 2 x3 15

10 x1 4 x2 x3 21
50 x 25 x 8 x 124
1
2
3
Folosindu-se programele iterative, se va observa c nu este asigurat convergena spre
soluia exact a sistemului. Nici dup pivotarea parial nu putem folosi metodele
iterative. Ar fi nevoie de o pivotare total. Rezolvarea a fost ncercata pentru un numr de
iteraii egal cu 500.
A=[8 2 1;10 4 1;50 25 8]
b=[15 21 124]

105

#07

Rezolvarea sistemelor de ecuaii II

test_convergenta(A)
Convergenta nu are loc
[A,b]=pivotare_partiala(A,b,n)
A =
50
10
8

25
4
2

8
1
1

21

15

25
4
2

8
1
1

21

15

25
4
2

8
1
1

21

15

50
10
8

25
4
2

8
1
1

b =
124

21

15

b =
124
A =
50
10
8
b =
124
A =
50
10
8
b =
124

A =

test_convergenta(A)
Convergenta nu are loc
x0=[3 4 6]
[x,nx]=metoda_jacobi(A,b,x0,0.00001,500)
x0 =
-0.4800
-3.7500 -17.0000
x0 =
7.0750
10.7000
26.3400
x0 =
-7.0844 -19.0225 -63.0000
...
x0 =
1.0e+149 *
-0.3881
-0.7859
-2.3568
x0 =
1.0e+149 *
0.7700
1.5594
4.6765
Warning: One or more output arguments
'metoda_jacobi'.

not

[x,nx]=metoda_gauss_seidel(A,b,x0,0.00001,500)
x0 =
-0.4800
-3.7500 -17.0000
x0 =
7.0750
10.7000
26.3400
x0 =
-7.0844 -19.0225 -63.0000
.....

106

assigned

during

call

to

METODE MUMERICE LUCRRI DE LABORATOR


x0 =
22.712 38.7110 109.7202
x0 =
1.0e+149 *
-0.3881
-0.7859
-2.3568
x0 =
1.0e+149 *
0.7700
1.5594
4.6765
Warning: One or more output
'metoda_gauss_seidel'.

arguments

not

#07

assigned

during

call

to

Acelai sistem a fost rezolvat cu metoda eliminrii Gauss n laboratorul precedent i s-a
observat c soluia sistemului este: x = 1.0000 2.0000 3.0000
Aplicaia 7.2. S se studieze sistemul: [W.7]
xy z 3 0

x
y2 0
y
yz x 6 0
n vecintatea punctului x0 = 1, y0 = 0, z0 = 1.
Pentru rezolvare se scrie sistemul de ecuaii neliniare sub forma canonic din MatLab:
function f=f_aplic7_2(x)
% x,y,z sunt reprezentate de x(1), x(2), x(3)
f(1)=x(1)*x(2)+x(3)+3;
f(2)=x(1)/x(2)-x(2)+2;
f(3)=x(2)*x(3)+x(1)-6;

Se definete vectorul valorilor de aproximare iniial a soluiei:


x0=[1;0;-1]

Se rezolv sistemul:
sol=fsolve('f_aplic7_2',x0,optimset('fsolve'))

Se obine soluia:
Optimization terminated successfully:
First-order optimality is less than options.TolFun.
sol =
6.0000 -0.0000 -3.0000

Dac se dorete setarea anumitor parametri la alte valori dect cele implicite, se apeleaz
funcia optimset, nainte de a rezolva sistemul:
options=optimset('TolX',10^(-12),'TolFun',10^(-9));

Apoi se rezolv sistemul:


[so1m,feval,exitflag,output]=fsolve('f_aplic7_1',x0,options)

107

#07

Rezolvarea sistemelor de ecuaii II

Se obine:
Optimization terminated successfully:
First-order optimality is less than options.TolFun.
so1m =
6.0000 -0.0000 -3.0000
feval =
1.0e-011 *
0.1147 -0.1851 -0.1671
exitflag = 1
output =
iterations: 9
funcCount: 36
algorithm: 'trust-region dogleg'
firstorderopt: 1.3746e-011

Interpretare: Metoda a convers ctre o soluie; soluia s-a obinut cu o eroare a funciei (f)
de ordinul 10-11, dup 9 iteraii, n care s-au efectuat 36 de evaluri ale funciei; algoritmul
utilizat este algoritmul trust-region dogleg (metoda este o mbuntire a metodei lui
Newton, pentru cazul n care aproximarea iniial este mai departe de soluie, respectiv
cazul n care Jacobianul sistemului este singular).

108

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