Documente Academic
Documente Profesional
Documente Cultură
#06
LUCRAREA #06
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
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)
(6.3)
2 x 2 y 2 y 2
10 x 5 y z 5
78
#06
-4.0000
10.0000
-5.0000
x2 =
-4.0000
10.0000
-5.0000
cond ( A) A A1
unde prin
(6.4)
#06
A 2 A * A max , A
(6.5)
(6.6)
A 1 max xij
1i n
j
(6.7)
A max x ji
1 i n
j
(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
B AT A
Dac A este simetric, atunci cond 2 A
max i
, unde 1 ,..., n sunt valorile
min i
80
#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
2
a22
x2 ... a22k xk ... a22n xn b22
..........................................................
(6.9)
.....................................
......................................
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
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)
2
a22
x2 ... a22k xk ... a22n xn b22
..........................................................
......................................
n
ann
xn bnn
(6.12)
bnn
n
ann
(6.13)
1
xk bkk akjk x j k , pentru k=n-1..1
j k 1
akk
(6.14)
#06
%abs(akk)
83
#06
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
#06
akik
, i k 1..n ; bkk bkk 1 / akkk 1
akk
(6.15)
(6.16)
85
#06
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
86
#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
87
#06
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
88
(6.17)
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)
Calculeaz bk 1 bk 1
ak
ck
bk
89
#06
Calculeaza d k 1 d k 1
ak
dk
bk
ak' 0
ck' ck
2: Calculeaz xn
d n'
bn'
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
#06
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
a=[3
b=[1
c=[2
d=[7
2
3
3
2
4
1
1
1
5]
6 5]
4]
9 4]
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
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
#06
b =
2.4800
3.8000
2.7600
[x]=solutie(A,b,n)
x =
1.0000
2.0000
3.0000
93