Sunteți pe pagina 1din 17

METODE MUMERICE LUCRRI DE LABORATOR

#06

LUCRAREA #06

REZOLVAREA SISTEMELOR DE ECUAII I

REZUMATUL I SCOPUL LUCRRII


Rezolvarea sistemelor de ecuaii liniare se poate face prin dou tipuri de metode:
metode directe: constau n transformarea sistemului ntrun sistem
particular (diagonal, triunghiular) echivalent, care se rezolv uor prin
metode elementare. Cele mai cunoscute metode directe sunt: metoda Gauss,
metoda Cholesky (utilizat pentru sistemele n care matricea A este
simetric i pozitiv definit) i metoda Householder. Pentru sisteme cu un
numr de ecuaii mai mare de 100, metodele directe devin inutilizabile
datorit acumulrii erorilor de rotunjire care altereaz soluia.
metode indirecte sau iterative: pornind de la o aproximaie iniial x0 i de
la o relaie de iteraie, se construiete un 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.
Lucrarea are drept scop prezentarea metodelor directe de rezolvare a sistemelor
de ecuaii algebrice liniare: metoda eliminrii Gauss i metoda pentru rezolvarea
sistemelor tridiagonale. Se vor elabora funciile specifice n MatLab, iar nsuirea
metodelor se va face pe exemple concrete de sisteme de ecuaii.

CUPRINSUL LUCRRII
1. Rezolvarea sistemelor de ecuaii liniare
2. Condiionarea sistemelor. Norma unei matrice
3. Metoda eliminrii lui Gauss
4. Rezolvarea sistemelor tridiagonale
5. Aplicaii de laborator

77

#06

Rezolvarea sistemelor de ecuaii I

1. Rezolvarea sistemelor de ecuaii liniare


Un sistem de ecuaii liniare are urmtoarea form:
a11 x1 a12 x2 a1n xn b1
a x a x a x b
2n n
2
21 1 22 2

ak1 x1 ak 2 x2 akn xn bk

an1 x1 an 2 x2 ann xn bn

(6.1)

Acest sistem se mai poate scrie mai simplu astfel: A x b , unde A este matricea
coeficienilor, x vectorul necunoscutelor i b vectorul termenilor liberi sau:
a11

a21

ak `

an1

a12
a22

ak 2

an 2

a1n x1 b1

a2 n x2 b2



akn xk bk



ann xn bn

(6.2)

Dac matricea A este nesingular, adic determinantul su este diferit de 0, atunci


exist o matrice A-1, astfel nct x A1 b .
Dac ns det(A) = 0 atunci sistemul de ecuaii este degenerat i poate avea o
infinitate de soluii sau nici una.
Deci, cea mai simpl metod de rezolvare a sistemelor de ecuaii liniare este
rezolvarea prin mprire la stnga sau folosirea matricei inverse, condiia fiind impus
determinantului matricei.
Exemplul 6.1. de rezolvare n MatLab pentru sistemul:
x 2 y 2z 1

(6.3)
2 x 2 y 2 y 2
10 x 5 y z 5

A=[1 2 3;2 2 2;10 5 1]


b=[1 2 5]
d=det(A)
if d~=0
x1=A\b' %impartire la stanga
x2=inv(A)*b' %inversa matricei
else
disp('Matrice singulara... Sistemul nu are solutie')
end
d =
-2
x1 =

78

METODE MUMERICE LUCRRI DE LABORATOR

#06

-4.0000
10.0000
-5.0000
x2 =
-4.0000
10.0000
-5.0000

Relaia de exprimare a soluiei prezentat mai sus nu este o metod practic de


rezolvare a sistemelor de ecuaii liniare, deoarece inversarea unei matrice de dimensiuni
mari este dificil.
De aceea, se utilizeaz diferite metode numerice de rezolvare a acestor sisteme,
metode ce se clasific n dou categorii:
metode directe: constau n transformarea sistemului ntrun sistem
particular (diagonal, triunghiular) echivalent, care se rezolv uor prin
metode elementare. Cele mai cunoscute metode directe sunt: metoda Gauss,
metoda Cholesky (utilizat pentru sistemele n care matricea A este
simetric i pozitiv definit) i metoda Householder. Pentru sisteme cu un
numr de ecuaii mai mare de 100, metodele directe devin inutilizabile
datorit acumulrii erorilor de rotunjire care altereaz soluia.
metode indirecte sau iterative: pornind de la o aproximaie iniial x0 i de
la o relaie de iteraie, se construiete un 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 cele ce urmeaz se vor aprofunda i se vor scrie algoritmi n MatLab pentru
metoda eliminrii Gauss i pentru metoda eliminrii pentru sistemele tridiagonale.

2. Condiionarea sistemelor. Norma unei matrice


nainte de a trece efectiv la metodele de rezolvare a sistemelor de ecuaii liniare,
este necesar a se trece n revist cteva noiuni despre norme i condiionarea matricelor.
Importana cunoaterii condiionrii unei matrice decurge din faptul c rezultatele
obinute prin calcul numeric corespund ntotdeauna unei probleme perturbate, ca
urmare a efectelor erorilor de rotunjire.
Numrul de condiionare al unei matrice indic sensibilitatea soluiei unui sistem
de ecuaii liniare i d indicaii despre precizia rezultatelor la inversarea matricelor i la
rezolvarea sistemelor de ecuaii liniare. O matrice bine condiionat este o matrice relativ
insensibil la mici perturbaii.
Numrul de condiionare al unei matrice se definete astfel:

cond ( A) A A1
unde prin

(6.4)

s-a notat norma matricei.


79

#06

Rezolvarea sistemelor de ecuaii I


Pentru matrice sunt definite urmtoarele tipuri de norme:
norma 2, returneaz cea mai mare valoare singular a lui A i este definit de
relaia:

A 2 A * A max , A

(6.5)

norma 1, returneaz cea mai mare sum a elementelor de pe coloan i este


definit de relaia:
n

(6.6)
A 1 max xij
1i n
j

norma infinit, returneaz cea mai mare sum a elementelor de pe linie, cu


relaia:
n

(6.7)
A max x ji
1 i n
j

norma Frobenius, calculat cu relaia:


n

(6.8)

ij

i , j 1

n MatLab, aceste norme se pot calcula direct prin apelarea urmtoarelor funcii, n
ordinea enumerat mai sus:
norm(x,2) norma 2
norm(x,1) norma 1
norm(x,inf) norma infinit
norm(x,fro) norma frobenius
Numrul de condiionare al matricelor are urmtoarele proprieti:
cond(In ) 1
cond(A)=cond A -1
cond( A)=cond A , pentru orice 0
cond 2 A

1
n

, 1 2 ... n 0 sunt valorile proprii la matricei

B AT A
Dac A este simetric, atunci cond 2 A

max i
, unde 1 ,..., n sunt valorile
min i

proprii ale matricei A.


MatLab are definite funcii pentru calcularea numrului de condiionare al unei
matrice cu urmtoarele sintaxe:
c = cond(A)
numrul de condiionare calculat ca raportul dintre cea mai mare i cea mai mic
valoare singulara

80

METODE MUMERICE LUCRRI DE LABORATOR

#06

c = rcond(A)
- dac o matrice este bine condiionat, valoarea funciei este aproximativ 1.0, dac
nu valoarea este aproximativ 0.0.
Exemplul 6.2. Se studiaz condiionarea sistemelor: [B.1]
6 x1 6.917 x2 6.543
6 x 6.911x2 6.543
i sistemul perturbat 1

x1 1.152 x2 1.095
x1 1.152 x2 1.095
Soluiile sistemelor sunt (rulare program ex6_2):
x1 =
7.3158
-5.4000
x2 =
-30.0090
27.0000

Se observ slaba condiionare a sistemului, prin diferena mare a soluiilor.

3. Metoda eliminrii lui Gauss


n cazul metodei eliminrii lui Gauss, necunoscutele se elimin pe rnd, sistemul
transformndu-se ntr-un sistem particular echivalent superior triunghiular i soluiile se
calculeaz prin retrosubstituie sau substituie regresiv; din ultima ecuaie se determin
xn, care ulterior se folosete la gsirea necunoscutei xn-1 i aa mai departe pn la x1.
La pasul k, k=1..n-1, se mparte ecuaia numrul k cu factorul akk (pivot) i se
nmulete cu aki, pentru i=2..n i prin adunare la linia i se elimin necunoscuta xi din toate
ecuaiile de sub cea cu numrul k. Se obine un sistem de forma:
a11' x1 a12' x2 ... a1' k xk ... a1' n xn b1'

2
a22
x2 ... a22k xk ... a22n xn b22

..........................................................

akkk xk ... aknk xn b kk

(6.9)

.....................................

aikk xk ... aink xn bki

......................................

ankk xk ... ann


xn bnk

Coeficienii necunoscutelor se modific astfel:


Pentru linia pivot k avem:

akkk 1
k
k 1
k 1
akj akj / akk , j k 1..n
b k b k 1 / a k 1
k
kk
k

(6.10)

81

#06

Rezolvarea sistemelor de ecuaii I


Pentru liniile de sub linia pivot avem:

aikk 0
k
k 1
k 1
k
aij aij aik akj , j k 1..n, i k 1..n
b k b k 1 a k 1 bk
i
ik
k
i

(6.11)

Acestea sunt de fapt formulele de iteraie pentru eliminarea gaussian.


Repetnd paii pentru toate ecuaiile, se obine n final sistemul superior
triunghiular, a crui rezolvare este foarte facil i care are urmtoarea form:
a11' x1 a12' x2 ... a1' k xk ... a1' n xn b1'

2
a22
x2 ... a22k xk ... a22n xn b22

..........................................................

akkk xk ... aknk xn bkk

......................................

n
ann
xn bnn

(6.12)

Din ultima ecuaie rezult:


xx

bnn
n
ann

(6.13)

Cu aceast valoare se poate stabili o relaie de iteraie pentru celelalte


necunoscute:
n

1
xk bkk akjk x j k , pentru k=n-1..1
j k 1

akk

(6.14)

Aceast metod, fr a se efectua alte operaii asupra matricei sistemului, se


numete metoda de eliminare a lui Gauss fr pivotare.
Exist cazuri pentru care pe diagonala principal a matricei exist un element egal
cu zero. n acest caz, mprirea ecuaiei la pivotul akk nu este posibil i ca atare metoda
nu se poate aplica, chiar dac sistemul admite soluii. n acest caz se recurge la aa zisa
pivotare, care poate fi parial sau total.
Pivotarea parial const n permutarea liniilor matricei ntre ele astfel nct pe
diagonala principal s avem elementele cele mai mari, n valoare absolut, acest lucru i
pentru a minimiza erorile ce pot aprea n calcule.
Acest lucru presupune ca la pasul k, s se gseasc elementul cel mai mare n
modul, care se afl pe coloana k, sub elementul akk. Fie acest element aik, pentru k<i<n. n
acest caz se permut element cu element linia k i i a matricei. Sistemul nu se schimb, se
schimb doar ordinea ecuaiilor n sistem, iar soluia nu este afectat.
Se face observaia, c i n acest caz, este posibil ca pe o linie a matricei pivotat s
existe un element akk egal cu zero. n acest caz metoda lui Gauss nu se poate aplica.
82

METODE MUMERICE LUCRRI DE LABORATOR

#06

Pentru a elimina i acest inconvenient, se aplic pivotarea total, care const n


cutarea pivotului de modul maxim printre toi coeficienii aflai sub linia k i la dreapta
coloanei k i aducerea acestui element pe poziia (k;k) prin permutri de linii i de coloane
(se schimb att ordinea liniilor ct i cea a coloanelor). La metoda cu pivotare total,
datorit permutrii coloanelor, se modific i ordinea necunoscutelor n sistem. De aceea,
se impune memorarea permutrilor de coloane fcute pe parcursul algoritmului, pentru a
se putea reconstitui la sfrit ordinea iniial a necunoscutelor.
Pentru implementarea n MatLab a metodei lui Gauss, o soluie ar fi urmtoarea:
Dup introducerea matricei sistemului i a vectorului termenilor liberi, se poate
face un test simplu pentru a se verifica dac vreun element al matricei de pe poziia (k,k)
este egal cu zero. Dac acest lucru nu se ntmpl se poate aplica eliminarea lui Gauss fr
pivotare, dar n cazul unui sistem ru condiionat este posibil ca erorile s fie destul de
mari.
n caz c se gsete un element egal cu zero, se poate aplica pivotarea parial si
rezolvarea sistemului echivalent.
Dac i dup pivotare un element de pe poziia (k,k) rmne 0, atunci ultima
soluie este aplicarea pivotrii totale.
Urmtoarea soluie de implementare n MatLab, consta n scrierea a 3 funcii, care
vor face pivotarea parial, eliminarea lui Gauss i calcularea soluiei prin retrosubstituie.
S-a ales acest mod, pentru ca funciile s poat fi sau nu apelate funcie de cazurile
prezentate mai sus. Mai mult, dac de la nceput sistemul este superior triunghiular,
atunci nu mai are rost a se face pivotare sau eliminare, ci se poate apela direct funcia de
calcul a soluiei sistemului.
S le prezentm pe rnd: Funcia de pivotare parial:
Date de intrare:
A matricea sistemului
b vectorul termenilor liberi
n numrul de ecuaii
Date de ieire:
A matricea sistemului schimbat prin permutri de linii
b vectorul termenilor liberi schimbat prin permutri de linii
pentru k=1 pn la n % numrul de iteraii
max= akk

%abs(akk)

i=k %linia pe care se presupune c se gsete elem. maxim n modul


sw=0 %variabila switch cu doua valori: sw=0 nu s-a gasit alt element mai
mare decat elementul de
%pe diagonala principala; sw=1 s-a gasit alt element mai mare si se va
face schimbarea de linii
pentru j=k+1:n %parcurge coloana de sub elementul A(k,k} - elem. de pe
diagonala principala
dac max< akk
atunci max= akk
i=j; sw=1 %s-a gasit un element mai mare
dac sw=1 %schimbare linii intre ele in matricea A si respectiv vectorul b
aux=b(k);
b(k)=b(i);
b(i)=aux;
pentru j=k:n
aux=A(k,j);

83

#06

Rezolvarea sistemelor de ecuaii I


A(k,j)=A(i,j);
A(i,j)=aux;

Afieaz A i b

Pentru permutarea a dou linii ntre ele se folosete un ciclu repetitiv, iar pentru
schimbarea efectiv a elementelor corespondente pe de liniile n cauz se folosete metoda
celor 3 pahare. Aceast metod const n utilizarea unei variabile auxiliare aux pentru a nu
se pierde valorile iniiale ale elementelor: la primul pas se golete coninutul primei
variabile n variabila aux, se atribuie primei variabile valoarea celei de-a doua i la al
treilea pas, a doua variabil ia valoarea aux, care de fapt este prima variabil.
Ex: fie x i y cele dou variabile:
1: aux = x
2: x = y
3: y = aux.
Se observ simetria pailor metodei.
Codul sursa pentru funcia MatLab este urmtorul:
function [A,b]=pivotare_partiala(A,b)
%functie care realizeaza pivotarea partiala la un sistem liniar de ecuatii
%in urma pivotarii partiale, pe diagonala principala se vor gasi elementele cele
mai mare in modul
%astfel la impartirea pe linia pivot, erorile sunt minime, deci solutia
sistemului este mai exacta
% Date de intrare:
%
A - matricea sistemului
%
b - vectorul termenilor liberi
%Date de iesire:
%
A - matricea sistemului schimbata prin permutari de linii
%
b - vectorul termenilor liberi schimbat prin permutari de linii
n=length(b);
for k=1:n
max=abs(A(k,k));
i=k; %linia pe care se gaseste elementul maxim in modul
sw=0; %variabila switch cu doua valori: sw=0 nu s-a gasit alt element mai
mare decat elementul de
%pe diagonala principala; sw=1 s-a gasit alt element mai mare si se va
face schimbarea de linii
for j=k+1:n %parcurge coloana de sub elementul A(k,k} - elem. de pe diagonala
principala
if max<abs(A(j,k))
max=abs(A(j,k));
i=j;
sw=1; %s-a gasit un element mai mare
end
end
if sw==1 %schimbare linii intre ele in matricea A si respectiv vectorul b
aux=b(k);
b(k)=b(i);
b(i)=aux;
for j=k:n
aux=A(k,j);
A(k,j)=A(i,j);
A(i,j)=aux;
end
end

84

METODE MUMERICE LUCRRI DE LABORATOR

#06

%afisare matrice si sisteme intermediare


A
b
pause
end

Funcia de eliminare gaussian s-a scris folosind urmtorul algoritm:


elementele de pe linia pivotului se mpart la pivot:
akik 1

akik
, i k 1..n ; bkk bkk 1 / akkk 1
akk

(6.15)

elementele de pe poziie (k,k) se vor nlocui cu 1 (prin mprire cu


elementul de pe poziia (k,k) devin 1)
elementele de pe coloana pivotului, cu excepia pivotului, se nlocuiesc cu 0.
ai k=0, i= k+1n
elementele din submatricea delimitat de ultimele n-k linii se transform cu
regula dreptunghiului:
aijk aijk 1 aikk 1 akjk , j k 1..n, i k 1..n
k
k 1
k 1
k
bi bi aik bk , i k 1..n

(6.16)

n urma acestor operaii, sistemul se reduce la sistemul superior triunghiular.


Algoritmul funciei este urmtorul: funcia se bazeaz pe relaiile iterative
prezentate i operarea doar a elementelor matricei aflate deasupra diagonalei principale
(pentru a micora numrul de operaii) i nlocuirea elementelor de sub diagonala
principal, exclusiv, cu 0.
Date de intrare:
A matricea sistemului
b vectorul termenilor liberi
n numrul de ecuaii
Date de ieire:
A matricea sistemului schimbat prin eliminare gaussiana
b - vectorul termenilor liberi schimbat prin eliminare gaussiana
pentru k=1 pn la n-1 % etapele eliminarii
b(k)=b(k)/A(k,k)
pentru j=k+1 pan la n+1 % elementele liniei pivot
A(k,j)=A(k,j)/A(k,k);
A(k,k)=1;
pentru i=k+1 pana la n %elementele liniilor de sub linia pivot
pentru j=k+1 pana la n+1
A(i,j)=A(i,j)-A(k,j)*A(i,k);
b(i)=b(i)-b(k)*A(i,k)
pentru i=k+1 pana la n
A(i,k)=0;
Afieaz A

Codul surs al funciei MatLab este urmtorul:

85

#06

Rezolvarea sistemelor de ecuaii I

function [A,b]=eliminare_gauss(A,b)
%functie pentru eliminarea gaussiana pentru un sistem de ecuatii liniar
%Date de intrare:
%
A - matricea sistemului
%
b - vectorul termenilor liberi
%Date de iesire:
%
A - matricea sistemului schimbat? prin eliminare gaussiana
%
b - vectorul termenilor liberi schimbat prin eliminare gaussiana
n=length(b);
for k=1:n-1 %etapele eliminarii
if A(k,k)==0
disp('Nu se poate aplica metoda Gauss...')
return;
end
%elementele liniei pivot
b(k)=b(k)/A(k,k);
for i=k+1:n
A(k,i)=A(k,i)/A(k,k);
end
A(k,k)=1;
%elementele liniilor de sub linia pivot
for i=k+1:n
for j=k+1:n
A(i,j)=A(i,j)-A(k,j)*A(i,k);
end
b(i)=b(i)-b(k)*A(i,k);
end
%coeficientii necunoscutelor eliminate
for i=k+1:n
A(i,k)=0;
end
A
b
pause
end

Funcia pentru calculul soluiilor prin retrosubstituie utilizeaz de asemenea


cicluri repetitive, folosind relaiile prezentate la nceputul subcapitolului.
Se prezint direct codul surs al funciei MatLab:
function x=solutie(A,b)
%calculare solutii prin retrosubstitutie pentru un sistem de ecuatii liniar
superior triunghiular
% Date de intrare
%
A - matricea sistemului superior triunghiular
%
b - vectorul termelilor liberi
%
n - numarul de ecuatii
% Date de iesire
%
x - solutia sistemului superior triunghiular
n=length(b);
if A(n,n)~=0
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
if A(i,i)~=0
s=b(i);
for j=n:-1:i+1
s=s-A(i,j)*x(j);
end

86

METODE MUMERICE LUCRRI DE LABORATOR

#06

x(i)=s/A(i,i);
else
disp('impartire la zero')
return
end
end
else
disp('impartire la zero')
return
end

Se observ c la fiecare iteraie se testeaz dac elementul akk este egal cu zero,
pentru a evita o mprire imposibil.
Practic, pentru a calcula soluiile unui sistem de ecuaii folosind aceast metod,
respectiv aceste funcii definite mai sus, se parcurg urmtoarele etape:
1. se definesc elementele sistemului, respectiv matricea A, vectorul termenilor
liberi i numrul de ecuaii;
2. se calculeaz determinantul matricei A; dac acesta este egal cu 0, sistemul nu
are soluie;
3. se stabilete dac este sau nu nevoie de pivotare (adic, dac avem pe diagonala
principal elemente egale cu 0);
4. se apeleaz pe rnd funciile pivotare_partiala (dac este cazul) i eliminare_gauss,
transformndu-se sistemul ntr-un sistem superior triunghiular;
5. se apeleaz funcia soluie pentru a calcula soluia sistemului.
Exemplul 6.3. S se rezolve sistemul urmtor folosind metoda eliminrii lui Gauss,
cu i fr pivotare parial:
2

x2 x3 2
1

8 x1 2 x2 3x3 1
x 2 x 5x 1
2
3
1

Se definesc elementele sistemului:


A=[1 0.222 1;8 2 -3;1 2 -5]
b=[2 -1 1]
n=3

Determinantul matricei A este diferit de 0:


det(A)
ans =
18.2140

Nu este nevoie de pivotare. Pentru exemplificare se va efectua aceast operaie:


[A,b]=pivotare_partiala(A,b)
A =
8.0000
2.0000
-3.0000
1.0000
0.2220
1.0000
1.0000
2.0000
-5.0000
b =

87

#06

Rezolvarea sistemelor de ecuaii I


-1

A =
8.0000
1.0000
1.0000

2.0000
2.0000
0.2220

-3.0000
-5.0000
1.0000

b =
-1

A =
8.0000
1.0000
1.0000

2.0000
2.0000
0.2220

-3.0000
-5.0000
1.0000

b =
-1

Eliminare Gauss:
[A,b]=eliminare_gauss(A,b)
A =
1.0000
0.2500
-0.3750
0
1.7500
-4.6250
0
-0.0280
1.3750
b =
-0.1250
1.1250
2.1250
A =
1.0000
0.2500
-0.3750
0
1.0000
-2.6429
0
0
1.3010
b =
-0.1250
0.6429
2.1430
A =
1.0000
0.2500
-0.3750
0
1.0000
-2.6429
0
0
1.3010
b =
-0.1250
0.6429
2.1430

Soluia sistemului:
x=solutie(A,b)
x =
-0.7563
4.9962

1.6472

4. Rezolvarea sistemelor tridiagonale


Un astfel de sistem poate fi scris astfel:
ak xk 1 bk xk ck xk 1 d i
unde a1=0 i cn=0.
n form matriceal, sistemul poate fi scris astfel:

88

(6.17)

METODE MUMERICE LUCRRI DE LABORATOR


b1

a2

c1
b2

c2

a3

b3

c3

an 1 bn 1
an

x1 d1

x2 d 2
. .

. . .
cn 1 xn 1 d n 1

bn
xn d n

#06

(6.18)

Se observ acum c matricea sistemului are toate elementele egale cu zero, mai
puin diagonala principal i cele dou diagonale de deasupra i dedesubtul celei
principale, de unde i numele de sistem tridiagonal.
Un astfel de sistem este un caz particular al unui sistem de ecuaii liniar. De aceea
rezolvarea acestuia se face printr-o eliminare gaussian simplificat, metod ce se mai
numete i metoda Thomas.
n prim faz se elimin necunoscutele care au coeficienii pe ai, elementele bi i di
modificndu-se corespunztor, iar ci rmn neschimbai. Formulele sunt urmtoarele:

ak' 0, k 1: n 1

b ' b ak c , k 1: n 1
k 1 k 1 bk k

d ' d ak d , k 1: n 1
k 1
k
k 1
bk
'
ck ck , k 1: n 1

(6.19)

Sistemul va avea o form bidiagonal, din care din ultima ecuaie se poate deduce
xn. Apoi prin substituie invers se pot calcula i celelalte necunoscute, folosindu-se
necunoascuta determinat la pasul anterior:

d n'
x

n
bn'

'
x d k ck xk 1 , k n 1:1
k
bk'

(6.20)

Se poate scrie astfel algoritmul


Date de intrare:
a - subdiagonala cu n-1 componente
b diagonala principala cu n componente
c supra diagonala cu n-1 componente
d termenii liberi cu n componante
Date de ieire:
x soluia sistemului tridiagonal
1: pentru k=1 pn la n-1
'

Calculeaz bk 1 bk 1

ak
ck
bk
89

#06

Rezolvarea sistemelor de ecuaii I


'

Calculeaza d k 1 d k 1

ak
dk
bk

ak' 0
ck' ck
2: Calculeaz xn

d n'
bn'

Pentru k=n-1 pana la 1 cu pasul -1

d k' ck xk 1
Calculeaza xk
bk'
3: afieaz valorile obinute

Cu cele expune mai sus se poate scrie o funcie care s calculeze soluia unui
sistem tridiagonal.
Algoritmul de mai sus este un algoritm fr pivotare, care se poate aplica dac
toate elementele bk sunt diferite de zero, astfel vom avea mprire la zero.
n interiorul funciei vom pune toate condiiile necesare pentru a evita astfel de
neplceri.
Vom lucra cu vectori care conin elementele de pe subdiagonala, diagonala,
supradiagonala i termenii liberi pentru lejeritate i vom forma pe parcurs matricea
sistemului.
function x=trisys(a,b,c,d)
% eliminare gaussiana fara pivot, sistem tridiagonal
% Date de intare
% a - subdiagonala
% b - diagonala
% c - supradiagonala
% d - termenii liberi
% Date de iesire
% x - solutia sistemului tridiagonal
% test sistem tridiagonal
if (length(d)~=length(b))|(length(a)~=length(c))
disp('Sistemul nu este tridiagonal')
return
end
n=length(d); x=zeros(n,1);
% formare matricea sistemului
A=diag(b)+diag(a,-1)+diag(c,1)
% test conditie pentru eleminare
if ~all(b)
disp('Impartire la zero. Cel putin un element pe pe diagonala principala este
egal cu zero...')
return
end
if det(A)=0 error('Sistemul nu are solutie'); return; end
%eliminare
for k=1:n-1
m=a(k)/b(k); %multiplicatorul
b(k+1)=b(k+1)-m*c(k);
d(k+1)=d(k+1)-m*d(k);
end
% formare matrice a sistemului dupa eliminare
A1=diag(b)+diag(c,1)

90

METODE MUMERICE LUCRRI DE LABORATOR

#06

% test pentru calculare solutii


if ~all(b)
disp('Impartire la zero. Cel putin un element pe pe diagonala principala este
egal cu zero...')
return
end
%substitutie inversa
x(n)=d(n)/b(n);
for k=n-1:-1:1
x(k)=(d(k)-c(k)*x(k+1))/b(k);
end

Evident c, dac i dup eliminare avem elemente egale cu zero pe diagonala


principal, atunci se poate aplica pivotarea.
Exemplul 6.4 S se rezolve sistemul:
x1 2 x2 7

3 x1 3x2 3 x3 2
2 x2 x3 x4 1
4 x 6 x 4 x 9
4
5
3
5 x4 5 x5 4
Matriceal sistemul se scrie astfel:
1 2
x1 7

x
3 3 3
2 2

x3 1
2 1 1


4 6 4 x4 9

5 5 x5 4

Nu avem elemente pe diagonala principal egale cu zero, deci putem aplica


eliminarea.
Primul pas definim vectorii care conin elementele sistemului, respectiv:

a=[3
b=[1
c=[2
d=[7

2
3
3
2

4
1
1
1

5]
6 5]
4]
9 4]

Apelm funcia trisys:


x=trisys(a,b,c,d)
A =
1
3
0
0
0
A1 =
1.0000
0

2
3
2
0
0

0
3
1
4
0
2.0000
-3.0000

0
0
1
6
5

0
0
0
4
5

0
3.0000

0
0

0
0

91

#06

Rezolvarea sistemelor de ecuaii I


0
0
0

0
0
0

3.0000
0
0

1.0000
4.6667
0

x =
23.4667
-8.2333
-14.5667
32.0333
-31.2333

5. Aplicaii de laborator
Aplicaia 6.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
Cu metoda eliminrii lui Gauss se obine soluia:
[A,b]=pivotare_partiala(A,b)
A =
50
25
8
10
4
1
8
2
1
b =
124
21
15
A =
50
25
8
10
4
1
8
2
1
b =
124
21
15
A =
50
25
8
10
4
1
8
2
1
b =
124
21
15
[A,b]=eliminare_gauss(A,b)
A =
1.0000
0.5000
0.1600
0
-1.0000
-0.6000
0
-2.0000
-0.2800
b =
2.4800
-3.8000
-4.8400
A =
1.0000
0.5000
0.1600
0
1.0000
0.6000
0
0
0.9200
b =
2.4800
3.8000
2.7600
A =
1.0000
0.5000
0.1600
0
1.0000
0.6000
0
0
0.9200

92

0
4.0000
0.7143

METODE MUMERICE LUCRRI DE LABORATOR

#06

b =
2.4800

3.8000

2.7600

[x]=solutie(A,b,n)
x =
1.0000
2.0000

3.0000

93

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