Sunteți pe pagina 1din 15

Sisteme de ecuaii

liniare
Metoda Gauss
Exemplu
Fie dat sistemul de ecuaii liniare:
1 2
1 2
2 3 7
4 5 13
x x
x x
+ =

+ =

Pentru a rezolva acest sistem vom elimina variabila x


1
din a doua
ecuaie a sistemului: (nmulim prima ecuaie cu 4/2 i o adunm la
cea de a doua)
1 2
1 2
2 3 7
0 1 1
x x
x x
+ =

2
1 2 1 1
7 3
2 3 7 2
2
x
x x x x

+ = = =
Acum putem determina valoarea variabilei x
2
din a doua ecuaie
a sistemului:
2 2
1 1. x x = =
Urmtorul pas este determinarea valorii x
1
din prima ecuaie
(folosind valoarea deja calculat a variabilei x
2
):
Algoritmul general:
(pasul direct)
Excludem x
1
din toate ecuaiile, ncepnd cu a doua
Excludem x
2
din toate ecuaiile, ncepnd cu a treia


............
Excludem x
i
din toate ecuaiile, ncepnd cu (i+1)

............
Excludem x
n-1
din ecuaia cu indicele n


Algoritmul general:
(pasul invers)
Determinm x
n
din ecuaia cu indicele n
Determinm x
n-1
din ecuaia cu indicele n-1
........
Determinm x
i
din ecuaia cu indicele i
........
Determinm x
1
din ecuaia cu indicele 1


Avnd sistemul:
1,1 1 1,2 2 1, 1
2,1 1 2,2 2 2, 2
,1 1 ,2 2 2,
,1 1 ,2 2 ,
...
n n
n n
i i n n i
n n n n n n
a x a x a x b
a x a x a x b
a x a x a x b
a x a x a x b
+ + + =

+ + + =

+ + + =

+ + + =

Urmeaz s-l aducem


la forma:
* * * *
1,1 1 1,2 2 1, 1
* * *
2,2 2 2, 2
* * *
, ,
* *
,
...
...
...
...
...
n n
n n
i i i i n n i
n n n n
a x a x a x b
a x a x b
a x a x b
a x b

+ + + =

+ + =

+ + =

Pentru a aduce sistemul iniial la forma cerut


(triunghiular) vom folosi algoritmul:
Pentru ecuaiile cu indicii (i) de la 1 la n-1
Pentru ecuaiile cu indicii (j) de la i+1 la n
Multiplicm coeficienii ecuaiei (i) cu -a
j,i
/a
i,i

apoi adugm ecuaia (i) la ecuaia (j).
Note:
1. Dac a
i,i
=0 atunci schimbm cu locul ecuaia (i) cu ecuaia
(k),k > i, pentru care a
k,i
= 0
2. Ecuaia (i) nu se modific dup nmulirea cu coeficientul
-a
j,i
/a
i,i


In procesul de transformare coeficienii a
i,i

pot deveni 0:








1,1 1 1,2 2 1, 1
2,
1, 2,
, ,
0 ...
...
n n
i n n i
i i i n n i
n i i n n n n
a x a x a x b
x a x b
a x a x b
a x a x b
+
+ + + =

+ + =

+ + =

+ + =

Dup transformrile
pasului direct avem:
* * * *
1,1 1 1,2 2 1, 1
* * *
2,2 2 2, 2
* * *
, ,
* *
,
...
...
...
...
...
n n
n n
i i i i n n i
n n n n
a x a x a x b
a x a x b
a x a x b
a x b

+ + + =

+ + =

+ + =

Urmeaz determinarea
soluiilor x
n
, x
n-1
, ... x
1
:

*
*
,
* *
1 1,
1
*
1, 1
* *
1
*
...
n
n
n n
n n n n
n
n n
n
i ij j
j i
i
ii
b
x
a
b a x
x
a
b a x
x
a


= +
=

=

Pentru a realiza aceasta vom utiliza
algoritmul:
Din ecuaia cu indicele (n) determinm x
n
Plasm valoarea calculat x
n
n ecuaia (n-1) i determinm x
n-1
...
n ecuaia (i) plam valorile x
n
, x
n-1
, ... , x
i+1
i determinm x
i
...
n ecuaia(1) plam valorile x
n
, x
n-1
, ... , x
2
i determinm x
1


Structuri de date:
1. Un tablou bidimensional A[n,n+1] pentru coeficienii i
termenii liberi ai sistemului. Linia i a tabloului va conine
coeficienii ecuaiei cu indicele i pe primele n coloane i
termenul liber al ecuaiei n coloana n+1
2. Tabloul unidimensional X[n] pentru stocarea soluiilor
sistemului. Elementul X[i] al tabloului va stoca componenta
x
i
a soluiei .

Exemplu de program:
program sys_equ;
const max = 50;
type mat = array[1..max, 1..max*1] of real;
Sol = array[1..max] of real;
var a: mat;
x: Sol;
n, i, j: integer;
procedure exclude(var AA:mat;i,j:integer);
var k: integer;
r: real;
begin
r:=-AA[j,i]/AA[i,i];
for k:=i to n+1 do
AA[j,k]:=AA[j,k]+AA[i,k]*r;
end;
function find(AA:mat;i:integer):integer;
var k:integer;
begin
find:=i;
for k:=i+1 to n do
if AA[k,i]<>0 then find:=k;
end;
procedure change(var AA:mat;i,j:integer);
var r:real;
k:integer;
begin
for k:=1 to n do
begin
r:=a[i,k];
a[i,k]:=a[j,k];
a[j,k]:=r;
end;
end;
procedure transform(var AA:mat);
var i,j,l:integer;
begin
for i:=1 to n-1 do
begin
if AA[i,i]= 0 then
begin
l:=find(AA,i);
if l<>i then change(AA,i,l)
else
begin
write('Not unique
solution');
readln;
halt;
end;
end;
for j:=i+1 to n do exclude(AA,i,j);
end;
end;
procedure readdata(var AA:mat; var n:integer);
var i,j : integer;
f : text;
begin
assign(f, 'gauss.in'); reset(f); readln(f,n);
for i:=1 to n do
for j:=1 to n+1 do
read(f, AA[i,j]);
close(f);
end;
procedure outputsol(X:sol);
var i: integer;
begin
for i:=1 to n do writeln('x[',i,']=',X[i]:0:3);
readln;
end;
procedure calculate(AA:mat; var X:sol);
var s : real;
i,j : integer;
begin
for i:=n downto 1 do
begin
s:=0;
for j:=i+1 to n do s:=s+AA[i,j]*x[j];
x[i]:=(AA[i,n+1]-s)/AA[i,i];
end;
end;
begin
readdata(A,n);
transform(A);
calculate(A,X);
outputsol(X);
end.

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