2. Lineāru vienādojumu sistēmas

Download Report

Transcript 2. Lineāru vienādojumu sistēmas

Lineāru vienādojumu
sistēmas
To atrisināšana ar Krāmera formulām, pēc
matricu metodes un pēc Gausa metodes.
Lineāru vienādojumu sistēmas
Par lineāru vienādojumu sistēmu sauc sekojošu
sistēmu ar n vienādojumiem un n nezināmajiem:
a11x1 + a12x2 + … + a1nxn = b1
a21x1 + a22x2 + … + a2nxn = b2
…
an1x1 + an2x2 + … + annxn = bn
kur aij un bi ir reāli skaitļi. Skaitļus aij sauc par
sistēmas koeficientiem, skaitļus bi – par
brīvajiem koeficientiem, xj – par nezināmajiem
Lineāru vienādojumu sistēmas
Doto sistēmu var pārrakstīt matricu formā
AX = B , kur
A – ir sistēmas koeficientu matrica,
B – ir brīvo koeficientu matrica,
X – ir nezināmo matrica.
a11
a12
.. a1n
b1
x1
a21
A
..
a22
..
.. a2 n
.. ..
b2
B
..
x2
X
..
an 2 .. ann
bn
xn
an 1
Lineāru vienādojumu sistēmu
atrisināšana ar Krāmera formulām
Par Krāmera sistēmām sauc lineāru vienādojumu
sistēmas, kurām vienādojumu skaits sakrīt ar nezināmo
skaitu.
a a .. a
11
a21

..
an1
b1
b2
1 
..
bn
a12
a22
..
an 2
.. a1n
.. a2 n
.. ..
.. ann
12
1n
a22 .. a2 n
.. .. ..
an 2 .. ann
…
a11
a21
n 
..
a n1
a12
a22
..
an 2
.. b1
.. b2
.. ..
.. bn
Lineāru vienādojumu sistēmu
atrisināšana ar Krāmera formulām
Ja Δ ≠ 0 , tad sistēma ir saderīga un
noteikta, t.i. tai eksistē viens vienīgs
atrisinājums
Ja Δ = 0 , bet Δi ≠ 0 , tad sistēma ir
nesaderīga, t.i. tai neeksistē atrisinājums;
Ja Δ = 0 un Δ1 = Δ2 = .. = Δn = 0 , tad
iespējami 2 gadījumi: sistēma ir saderīga
un nenoteikta, t.i. tai eksistē bezgala daudz
atrisinājumu, vai arī sistēma ir nesaderīga,
t.i. tai neeksistē atrisinājums, un jāizmanto
cita metode.
Programmas fragmenti Delphi vidē
Determinanta aprēķināšanā
Type
mass = array[1..n,1..n] of Real;
vector = array[1..n] of Real;
dtr = array[1..n] of mass;
var
Form1: TForm1;
n,i,j,k,m,l,j1:Byte;
a,e,ainv,c:mass;
b,h,x,det:vector;
d,v,s:Real;
dt:dtr;
Type mass = array[1..n, 1..n] of real;
function determinant ( var a:mass;N:integer):real;
var e,c,d,k:integer; r:real; w,q:real;
begin
for k:=1 to n-1 do
begin
if Abs(a[k,k]) < eps then
{ matricas rindu permutācija, ja a[k,k] = 0}
for e:=k to N do
begin
if a[k,e]=0 then
for c:=k to N-1 do
for d:=1 to N do
begin
r:=a[c,d]; a[c,d]:=a[c+1,d]; a[c+1,d]:=r;
end;
end;
for i:=k+1 to N do
begin
w:=a[i,k];
q:=a[k,k];
if a[k,k]=0
then Continue;
//Izlaist pārstrādes ciklu, ja abs(a[k,k]) < eps
for j:=k to N do
//matricas pārveidošana trīsstūra formā
a[i,j]:= a[i,j]-a[k,j]*w/q;
end;
end;
w:=1;
{Determinanta aprēķināšanā}
for i:=1 to n do w:=w*a[i,i];
determinant := w;
end;
Lineāru vienādojumu sistēmu atrisināšana ar Krāmera
formulām
procedure TForm1.Button7Click(Sender: TObject);
var i1,j1:Integer;
begin
// lasīt vektoru B
for i:=1 to N do
B[i]:=strToFloat(StringGrid2.Cells[i-1,0]);
// lasīt vektoru A
for i := 1 to n do
for j := 1 to n do
a[i,j] := StrToFloat(StringGrid1.Cells[j-1,i-1]);
c := a;
d := determinant (c,n);
// dt[i] veidošana
for i := 1 to n do
for k := 1 to n do
for m := 1 to n do
if m = i then dt[i][k,m] := b[k]
else dt[i][k,m] := a[k,m] ;
// x[i] aprēķināšana
for i1 := 1 to n do
begin
det[i1] := determinant (dt[i1],n);
x[i1] := det[i1]/d;
end;
for i := 0 to n-1 do StringGrid10.Cells[1,i] :=
FloatToStrF(x[i+1],ffFixed,8,2);
end;
Lineāru vienādojumu sistēmu
atrisināšana ar matricu metodes
Pēc matricu metodes var atrisināt tikai Krāmera
sistēmas, kurām sistēmas koeficientu matricas
determinants nav vienāds ar nulli.
Doto sistēmu pārrakstīsim matricu formā:
AX = B ,
kur A ir sistēmas koeficientu matrica, X –
nezināmo vektors, B – brīvo koeficientu
vektors.
No vienādojuma izsakām
X = A−1 ⋅ B ,
kur A−1 - ir matricas A inversā matrica.
A−1 ⋅ A = e,
Kur e – vienības matrica
Programmas fragmenti Delphi vidē
Atgrieztās matricas aprēķināšanā
procedure matinvert;
//Atgr.matricas aprēķināšana
var
i, j, k : integer; max:Real;
begin
for i:=1 to n do //vieninieku matrica
for j:=1 to n do e[i,j]:=0;
for i:=1 to n do e[i,i]:=1;
//matricas pārveidošana trīsstūra formā
for i:=1 to n do
begin
max:=abs(a[i,i]); k:=i;
for j:= succ(i) to n do
if abs(a[j,i])>max then
begin
max:=abs(a[j,i]);
k:=j
end;
if k<>i then
begin
for j:=i to n do
begin
max:=a[k,j]; a[k,j]:=a[i,j];
end;
for j:=1 to n do
begin
max:=e[k,j]; e[k,j]:=e[i,j];
end;
end;
a[i,j]:=max;
e[i,j]:=max;
for j:= succ(i) to n do a[i,j]:=a[i,j]/a[i,i];
for k:=1 to n do e[i,k]:=e[i,k]/a[i,i];
for j:= succ(i) to n do
begin
for k:= succ(i) to n do a[j,k]:=a[j,k]-a[i,k]*a[j,i];
for k:=1 to n do e[j,k]:=e[j,k]-e[i,k]*a[j,i];
end;
end;
//Atgr.matricas aprēķināšana
for k:=1 to n do
begin
ainv[n,k]:=e[n,k];
for i:=pred(n) downto 1 do
begin
max:=e[i,k];
for j:= succ(i) to n do max:=max-a[i,j]*ainv[j,k];
ainv[i,k]:=max;
end;
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
Var buf:Real;
begin // lasīt vektoru B
for i:=1 to N do B[i]:=strToFloat(StringGrid2.Cells[i-1,0]);
// lasīt vektoru A
for i := 1 to n do
for j := 1 to n do
a[i,j] := StrToFloat(StringGrid1.Cells[j-1,i-1]);
matinvert;
for i := 1 to n do
begin
buf := 0;
for k := 1 to n do buf := buf + ainv[i,k]*b[k];
x[i] := buf;
end;
for i := 0 to n-1 do StringGrid9.Cells[1,i] :=
FloatToStrF(x[i+1],ffFixed,8,2); end;
Lineāru vienādojumu sistēmu
atrisināšana pēc Gausa metodes
Pēc Gausa metodes var atrisināt jebkuru
lineāru vienādojumu sistēmu neatkarīgi no
vienādojumu un nezināmo skaita, ja vien šai
sistēmai atrisinājums eksistē.
Lai lineāru vienādojumu sistēmu atrisinātu
pēc Gausa metodes, rīkojas šādi:
1) sistēmas koeficientus un brīvos
koeficientus pārraksta matricā, kuru sauc par
sistēmas paplašināto matricu;
2) no paplašinātās matricas ar matricu rindu
elementārajiem pārveidojumiem iegūst
matricu trīsstūra formā;
3) vadoties no iegūtās trīsstūra matricas
uzraksta vienādojumu sistēmu;
4) atrisina to, sākot no pēdējā vienādojuma un
pakāpeniski virzoties uz augšu.
Paplašinātā matrica
a11
a21
G  ..
an1,1
a n1
a12
a22
..
an1, 2
an 2
.. a1,n1
.. a2 ,n1
..
..
.. an1,n1
.. an ,n1
a1n
a2 n
..
an1,n
ann
b1
b2
..
bn1
bn
Gausa metodes taisnā gaita
a11
a11
a21
G
..
an1,1
a n1
a12
a11
a22
..
an1, 2
an 2
..
..
..
..
..
a1,n1
a11
a2 ,n1
..
an1,n1
an ,n1
a1n
a11
a2 n
..
an1,n
ann
b1
a11
b2
..
bn1
bn
1
a21
G  ..
an1,1
a n1
a12
a22
..
an1, 2
an 2
.. a1,n1
.. a2 ,n1
..
..
.. an1,n1
.. an ,n1
2 rinda + 1 rinda * (-a21)
3 rinda + 1 rinda * (-a31)
…
n rinda + 1 rinda * (-an1)
a1n
a2 n
..
an1,n
ann
b1
b2
..
bn1
bn
1 a12
0 a22
..
G  ..
0 an1, 2
0 an 2
1 a12
0 1
G  .. ..
0 0
0 0
.. a1,n1
.. a2 ,n1
..
..
.. an1,n1
.. an ,n1
.. a1,n1
.. a2 ,n1
.. ..
.. 1
.. 0
a1n
a2 n
..
an1,n
ann
a1n
a2 n
..
an1,n
1
b1
b2
..
bn1
bn
b1
b2
..
bn1
bn
Gausa metodes apgrieztā gaita
xn = bn
xn-1 = bn – xn * an-1,n
…
x1 = …
Lineāru vienādojumu sistēmu atrisinājums
ar Gausa metodi (piemērs)
Vienādojumu sistēma:
5.0 * x1 - 3.0 * x2 + 1.0 * x3 = 12.0
-4.0 * x1 + 4.0 * x2 + 2.0 * x3 = - 16.0
1.0 * x1 + 1.0 * x2 + 0.0 * x3 = 5.0
Gausa metodes taisna gaita
1.rindas visu elementu dalīšana
uz dotās rindas1.elementu ( 5.0)
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
-4.0 * x1 + 4.0 * x2 + 2.0 * x3 = - 16.0
1.0 * x1 + 1.0 * x2 + 0.0 * x3 = 5.0
Atņemšana no 2.rindas elementiem
1.rindas elementi, kas ir sareizināti uz-4.0
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.6 * x2 + 2.8 * x3 = - 6.4
1.0 * x1 + 1.0 * x2 + 0.0 * x3 = 5.0
Atņemšana no 3.rindas elementiem
1.rindas elementi, kas ir sareizināti uz 1.0
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.6 * x2 + 2.8 * x3 = - 6.4
0.0 * x1 + 1.6 * x2 - 0.2 * x3 = 2.6
2.rindas visu elementu dalīšana uz dotās
rindas( 1.0) 2.elementu
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.0 * x2 + 1.8 * x3 = - 4.0
0.0 * x1 + 1.6 * x2 + - 0.2 * x3 = 2.6
Atņemšana no 3.rindas elementiem 2.rindas
elementi, kas ir sareizināti uz 1.6
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.0 * x2 + 1.8 * x3 = - 4.0
0.0 * x1 + 0.0 * x2 + - 3.0 * x3 = 9.0
3.rindas visu elementu dalīšana uz dotās
rindas(- 3.0) 3.elementu
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.0 * x2 + 1.8 * x3 = - 4.0
0.0 * x1 + 0.0 * x2 + 1.0 * x3 = - 3.0
Gausa metodes apgrieztā gaita
x3 saknes saņemšana no 3.vienādojuma
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.0 * x2 + 1.8 * x3 = - 4.0
0.0 * x1 + 0.0 * x2 + 1.0 * x3 = - 3.0
x3 = - 3.0
x2 saknes saņemšana no 2.vienādojuma
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.0 * x2 + 1.8 * x3 = - 4.0
0.0 * x1 + 0.0 * x2 + 1.0 * x3 = - 3.0
x2 = 1.25
x1 saknes saņemšana no 1.vienādojuma
1.0 * x1 - 0.6 * x2 + 0.2 * x3 = 2.4
0.0 * x1 + 1.0 * x2 + 1.8 * x3 = - 4.0
0.0 * x1 + 0.0 * x2 + 1.0 * x3 = - 3.0
x1 = 3.75
Vienādojumu atrisinājums:
x1 = 3.75 x2 = 1.25 x3 = - 3.00
Programmas fragmenti Delphi vidē
Gausa metode
procedure TForm1.Button4Click(Sender:
TObject);
var
log:Boolean;
begin
// lasīt matricu A
for i:=1 to N do
for j:=1 to N do
A[i,j]:=strToFloat(StringGrid1.Cells[j-1,i-1]);
// lasīt vektoru B
for i:=1 to N do
B[i]:=strToFloat(StringGrid2.Cells[i-1,0]);
// Gausa metodes taisnā gaita
for k:=1 to n-1 do
Begin
// elementu A[k,k] pārbaude uz vienādību nullei
if abs(A[k,k])<Eps then
begin
Log:=True;
for m:=k+1 to n do
if (abs(A[m,k])>Eps) and Log then
begin
// matricas A[m,k] k-rindas un m-rindas pārvietošana
for l:=1 to n do
begin
v:=A[k,l]; A[k,l]:=A[m,l]; A[m,l]:=V
end;
// vektora B elementu pārvietošana
V:=B[k];B[k]:=B[m];B[m]:=V;
Log:=False;
end;
end;
{if abs(A[k,k])<eps}
// Matricas A pārveide pie trīsstūrainas formas
H[k]:=B[k]/A[k,k];
For i:=k+1 to n do
begin
B[i]:=B[i]-A[i,k]*H[k];
For j1:=k to n do
begin
J:=N-J1+K;
C[k,j]:=A[k,j]/A[k,k];
A[i,j]:=A[i,j]-A[i,k]*C[k,j];
end;
end;
End;
// Gausa metodes apgrieztā gaita
X[n]:=B[n]/A[n,n]; m:=n-1;
Repeat
S:=0;
For i:=m to n-1 do
S:=S+C[m,i+1]*X[i+1];
X[m]:=H[m]-S; m:=m-1
Until m=0;
for i:=1 to n do
// vektora x izvade
StringGrid8.Cells[1,i-1]:=FloatTostrf(X[i],ffFixed,8,2);
for i := 0 to n-1 do
for j := 0 to n-1 do
StringGrid6.Cells[j,i] :=
FloatToStrF(a[i+1,j+1],ffFixed,8,2);
for i := 0 to n-1 do StringGrid7.Cells[0,i] :=
FloatToStrF(b[i+1],ffFixed,8,2);
end;
procedure kvadr_matr_reiz(a,b:mass; var c:mass);
// matricas reizināšana
var
buf:real;
begin
for i := 1 to n do
for j := 1 to n do
begin
buf := 0;
for k := 1 to n do
buf := buf + a[i,k]*b[k,j];
c[i,j] := buf;
end;
end;