Post on 30-May-2015
description
Sisteme de ecuaţii liniare
Metoda Kramer
ExempluFie dat sistemul de ecuaţii liniare: 11 1 12 2 1 1
21 1 22 2 2 2
1 1 2 2
n n
n n
n n nn n n
a x a x a x b
a x a x a x b
a x a x a x b
Sistemul poate fi transcris în formă matriceală:
A x = b
nnnn
n
n
aaa
aaa
aaa
A
21
22221
11211
nb
b
b
b2
1
nx
x
x
x2
1
În cazul în care (A) 0 pentru matricea A există matricea inversă A-1. Atunci putem realiza următoarele transformări:
Ax bbAAxA 11
bAx 1
Conform regulilor de formare a matricei inverse:
1,1 2,1 ,1
1,2 2,2 ,21
1, 2, ,
...
...
...
...
n
n
n n n n
A A A
A A AA
A A A
1,1 2,1 ,11 1
1,2 2,2 ,22 2
1, 2, ,
...
...
...
...
n
n
n n n n
n n
A A Ax b
A A Ax b
A A Ax b
Sistemul x =A-1b
se descompune după componente:
A i,j este minorul cu semn al elementului ai,j
Vectorul soluţiei x este produsul matricelor din partea dreaptă a ultimei egalităţi. Prin urmare, componenta cu indicele i a vectorului soluţie x este suma produselor elementelor liniei i a matricei A-1 cu elementele vectorului b.
1, 1 2, 2 ,...i i n i ni
A b A b A bx
Numărătorul fracţiei din partea dreaptă a egalităţii este descompunerea unei matrice A+ după coloana cu indicele i. ((A+))
Matricea A+ se obţine din matricea A prin înlocuirea coloanei i a coeficienţilor sistemului prin vectorul termenilor liberi b.
Algoritmul general:
• Determinăm det(A). Dacă = 0, metoda nu poate fi aplicată - STOP. În caz contrar:
• Calculăm elementele soluţiei după formula
nix ii ,...,1
1,1 1, 1 1 1, 1 1,
2,1 2, 1 2 2, 1 2,
,1 , 1 , 1 ,
i i n
i i ni
n n i n n i n n
a a b a a
a a b a a
a a b a a
Structuri de date:
1. Un tablou bidimensional A[n,n] – pentru coeficienţii sistemului. Linia i a tabloului va conţine coeficienţii ecuaţiei cu indicele i
2. Tabloul unidimensional B[n] – pentru stocarea termenilor liberi ai sistemului. Elementul B[i] al tabloului va stoca termenul liber al ecuaţiei cu indicele i.
3. Tabloul unidimensional X[n] – pentru stocarea soluţiilor sistemului. Elementul X[i] al tabloului va stoca componenta xi a soluţiei .
Exemplu de program:
program kramer;
const nmax=10;
type mat=array[1..nmax,1..nmax] of real;
vec=array[1..nmax] of real;
var a : mat;
sol,b : vec;
p,n : integer;
de : real;
procedure citeste (var x:mat; var t:integer; var z:vec);
var i, j: integer; f: text;begin assign (f, 'sistem5.in'); reset(f); readln(f, t); for i:=1 to t do begin for j:=1 to t do read(f,x[i,j]); readln(f, z[j]); end; close(f);end;
function calcul( x:mat;t:integer):real;var i,j,k,l:integer; s: real; minor:mat;begin if t=1 then calcul:=x[1,1] else begin s:=0; for k:=1 to t do begin for i:=1 to t-1 do for j:=1 to k-1 do minor[i,j]:=x[i+1,j]; for i:=1 to t-1 do for j:=k to t-1 do minor[i,j]:=x[i+1,j+1]; if odd(k) then s:=s+x[1,k]*calcul(minor, t-1) else s:=s-x[1,k]*calcul(minor, t-1); end; calcul:=s;end; end;
function trans( x:mat;t,l:integer):real;var i : integer;begin
for i:=1 to t do x[i,l]:=b[i]; trans:=calcul(x,t);end;
begin citeste(a,n,b); de:=calcul(a,n); if de<>0 then begin for p:=1 to n do sol[p]:= trans(a,n,p)/de; for p:=1 to n do writeln('x[',p,']=',sol[p]); end else writeln('Calcul imposibil');end.