Giáo trình C++ - Chương 10: Giải hệ phương trình đại số tuyến tính
Ch−¬ng 10 : Gi¶i hÖ ph−¬ng tr×nh ®¹i sè tuyÕn tÝnh
§1.Ph−¬ng ph¸p Gauss
Cã nhiÒu ph−¬ng ph¸p ®Ó gi¶i mét hÖ ph−¬ng tr×nh tuyÕn tÝnh d¹ng AX = B. Ph−¬ng
ph¸p gi¶i sÏ ®¬n gi¶n h¬n nÕu ma trËn A cã d¹ng tam gi¸c nghÜa lµ cã d¹ng :
a
0
0
0
a
0
0
a12 a13
a22 a23
⎛
⎞
⎛
⎞
11
11
⎜
⎟
⎜
⎟
a21 a22
a31 a32 a33
hay
⎜
⎜
⎟
⎟
⎜
⎜
⎟
⎟
0
a33
⎝
⎠
⎝
⎠
Trong tr−êng hîp ®Çu tiªn,ma trËn ®−îc gäi lµ ma trËn tam gi¸c d−íi vµ tr−êng hîp
thø hai ma trËn ®−îc gäi lµ ma trËn tam gi¸c trªn.Ph−¬ng tr×nh t−¬ng øng víi ma trËn tam
gi¸c d−íi cã d¹ng t−êng minh lµ :
⎧
+
x
x
⎪a11 x1+0x2
= b1
0x3
+0x3 = b2
⎪
+
⎨
⎪a21 x1
a22
2
2
⎪⎩a31 x1+
= b3
+
x
a33
a32
3
Víi ph−¬ng tr×nh d¹ng nµy chóng ta sÏ gi¶i ph−¬ng tr×nh tõ trªn xuèng.
Ch−¬ng tr×nh gi¶i ph−¬ng tr×nh ma trËn tam gi¸c d−íi lµ :
Ch−¬ng tr×nh 10-1
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define max 10
void main()
{
float a[max][max];
float b[max],x[max];
int i,j,k,n,t;
float s,c;
char tl;
clrscr();
printf("Cho so phuong trinh n = ");
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a\n");
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
printf("Ma tran a ma ban da nhap\n");
printf("\n");
145
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
t=1;
flushall();
while (t)
{
printf("Co sua ma tran a khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("Cho chi so cot can sua : ");
scanf("%d",&j);
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
if (toupper(tl)=='K')
t=0;
}
printf("Ma tran a ban dau\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
printf("Cho cac phan tu cua ma tran b\n");
for (i=1;i<=n;i++)
{
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
printf("\n");
printf("Ma tran b ma ban da nhap");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %10.5f\n",i,b[i]);
printf("\n");
flushall();
t=1;
while (t)
{
146
printf("Co sua ma tran b khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
if (toupper(tl)=='K')
t=0;
}
printf("\n");
printf("Ma tran b ban dau");
printf("\n");
for (i=1;i<=n;i++)
printf("%15.5f\n",b[i]);
{
if (a[1][1]==0)
if (b[1]!=0)
printf("He da cho vo nghiem\n");
else
{
printf("He da cho co vo so nghiem");
x[n]=c;
}
else
x[1]=b[1]/a[1][1];
for (i=2;i<=n;i++)
{
s=0;
for (k=1;k<=i-1;k++)
s=s+a[i][k]*x[k];
x[i]=(b[i]-s)/a[i][i];
}
printf("\n");
printf("Nghiem cua he da cho la");
printf("\n");
for (i=1;i<=n;i++)
printf("x[%d] = %10.5f\n",i,x[i]);
getch();
}
}
Ph−¬ng tr×nh t−¬ng øng víi ma trËn tam gi¸c trªn cã d¹ng t−êng minh lµ :
⎧⎪a11 x1+
= b1
= b2
= b3
+
x
x
x
3
a12
a13
2
⎪
+
⎨
+
+
x
⎪0 x1
a22
a23
a33
2
3
⎪
+0
x
x
⎩0 x1
3
2
Víi ph−¬ng tr×nh nµy chóng ta gi¶i tõ d−íi lªn.
147
Ch−¬ng tr×nh gi¶i ph−¬ng tr×nh ma trËn tam gi¸c trªn lµ :
Ch−¬ng tr×nh 10-2
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define max 10
void main()
{
float a[max][max];
float b[max],x[max];
int i,j,k,n,t;
float s,c;
char tl;
clrscr();
printf("Cho so phuong trinh n = ");
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a :\n");
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
printf("Ma tran a ma ban da nhap\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
t=1;
flushall();
while (t)
{
printf("Co sua ma tran a khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
148
printf("Cho chi so cot can sua : ");
scanf("%d",&j);
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
if (toupper(tl)=='K')
t=0;
}
printf("Ma tran a ban dau");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
printf("Cho cac phan tu cua ma tran b : \n");
for (i=1;i<=n;i++)
{
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
printf("\n");
printf("Ma tran b ma ban da nhap");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %10.5f\n",i,b[i]);
printf("\n");
flushall();
t=1;
while (t)
{
printf("Co sua ma tran b khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
if (toupper(tl)=='K')
t=0;
}
printf("\n");
printf("Ma tran b ban dau\n");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %10.5f\n",i,b[i]);
149
printf("\n");
{
if (a[n][n]==0)
if (b[n]!=0)
printf("He da cho vo nghiem");
else
{
printf("He da cho co vo so nghiem");
x[n]=c;
}
else
x[n]=b[n]/a[n][n];
for (i=n-1;i>=1;i--)
{
s=0;
for (k=i+1;k<=n;k++)
s=s+a[i][k]*x[k];
x[i]=(b[i]-s)/a[i][i];
}
printf("\n");
printf("Nghiem cua he da cho la\n");
printf("\n");
for (i=1;i<=n;i++)
printf("x[%d] = %10.5f\n",i,x[i]);
getch();
}
}
Tuy nhiªn, c¸c hÖ ph−¬ng tr×nh ®¬n gi¶n hiÕm khi gÆp trong thùc tÕ. C¸c hÖ ph−¬ng
tr×nh tuyÕn tÝnh cã thÓ biÓu diÔn d−íi d¹ng tam gi¸c nÕu ®Þnh thøc cña nã kh¸c kh«ng, nghÜa
lµ ph−¬ng tr×nh cã nghiÖm.Chóng ta biÕt r»ng c¸c nghiÖm cña hÖ kh«ng ®æi nÕu ta thay mét
hµng b»ng tæ hîp tuyÕn tÝnh cña c¸c hµng kh¸c.Nh− vËy b»ng mét lo¹t c¸c biÕn ®æi ta cã thÓ
®−ahÖ ban ®Çu vÒ d¹ng tam gi¸c. §ã chÝnh lµ néi dung cña ph−¬ng ph¸p lo¹i trõ Gauss.
Chóng ta h·y xÐt hÖ ph−¬ng tr×nh :
⎧
+
+
+
+
= b1
= b2
= b3
x
x
⎪a11 x1
a12
a22
a32
a13
2
3
⎪
+
x
a23
⎨
x
x
⎪a21 x1
2
2
3
⎪
+
x
⎩a31 x1
a33
3
Nh©n hµng thø nhÊt víi a21/a11 ta cã :
a21
a21 x1+ a12 x2
a11
+ a21
= a
a13 x3 21b1
a11
a11
Sè h¹ng ®Çu cña ph−¬ng tr×nh b»ng sè h¹ng ®Çu cña hµng thø hai trong hÖ ph−¬ng tr×nh ban
®Çu.Khi trõ hµng mét ®· ®−îc biÕn ®æi cho hµng 2 ta nhËn ®−îc hµng 2 míi
− a21
a11
− a21
a11
− a
= b2 21b1
a11
+
0 x1+
a
12
(a22
)x (a
)x
a
13
3
2
23
Ta tiÕp tôc c¸ch nµy ®Ó lo¹i trõ x1 ra khái hµng thø 3.Ph−¬ng tr×nh trë thµnh :
⎜⎛⎜a1, 1 a1, 2
a13
⎞
⎛⎜ b, ⎞⎟
,
⎛⎜ x
⎞
⎟
⎟
⎟
⎟
1
1
⎟
⎜⎜ x
⎜ b'2⎟
⎟
⎟
⎟
⎜⎜ 0
a,22
a,32
a,23⎟
×
=
2
⎜
⎟
⎜
⎜
⎟
⎜
, ⎟
⎟
,
⎝ x3
⎜
⎟
⎜⎝ 0
⎟
⎝ b3⎠
⎠
a33
⎠
150
víi
a,11 = a11 ; a,12 = a12 ; a,13 = a13 ; a,13 = a13 ; b,1 = b1
,
− a21
,
,
,
,
− a21
− a31
− a31
a11
− a
a22 a22
a12 a23 a23
a13 a32 a32
a12
a33 a33
a13
b2 b2 21 b1
=
=
=
=
=
a11
a11
a11
a11
,
− a
b3 b3 31 b1
=
a11
Ta lo¹i trõ sè h¹ng chøa x3 trong dßng thø 3 b»ng c¸ch t−¬ng tù.Ta nh©n hµng thø 2 trong hÖ
A'X = B' víi a,32/a,22 vµ ®em trõ ®i hµng thø 3 trong hÖ míi.Nh− vËy sè h¹ng chøa x3 biÕn
mÊt vµ ta nhËn ®−îc ma trËn tam gi¸c trªn.
⎜⎛⎜a1,,1
⎜⎜ 0
a
a
a
⎞
⎛⎜ b,,⎞⎟
,,
12
,,
13
⎞
⎟
⎛⎜ x
⎟
⎟
⎟
1
1
⎟
⎜⎜ x
⎜ b,2,⎟
⎟
⎟
⎟
,,
22
,,
23⎟
a
×
=
2
⎜
⎟
⎜
⎜
⎟
⎜
,,⎟
⎟
,,
⎝ x3
⎜
⎟
⎜⎝ 0
⎟
⎝ b3⎠
⎠
0
a
33
⎠
,,
22
,,
,
a11 a11
a
=a12 a13 a13 b1 b1
a
=a,22
a23 a23 b2 b2
,,
,
,,
12
,
,,
,
,,
,
,,
,
víi
=
=
=
=
=
− a,32
a,
,,
,
,
,,
,
,
b3 b3 33 b2
=
=
−
a33 a33
a23
a,22
a,22
C¸c phÐp tÝnh nµy chØ thùc hiÖn ®−îc khi a11 ≠ 0 vµ a,11 ≠ 0.
Víi mét hÖ cã n ph−¬ng tr×nh,thuËt tÝnh hoµn toµn t−¬ng tù.Sau ®©y lµ ch−¬ng tr×nh
gi¶i hÖ ph−¬ng tr×nh n Èn sè b»ng ph−¬ng ph¸p lo¹i trõ Gauss.
Ch−¬ng tr×nh 10-3
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define max 10
void main()
{
float b[max],x[max];
float a[max][max];
int i,j,k,n,t;
float c,s,d;
char tl;
clrscr();
printf("Cho so phuong trinh n = ");
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a :\n");
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
printf("Ma tran a ma ban da nhap\n");
printf("\n");
151
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
t=1;
flushall();
while (t)
{
printf("Co sua ma tran a khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("Cho chi so cot can sua : ");
scanf("%d",&j);
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
if (toupper(tl)=='K')
t=0;
}
printf("Ma tran a ban dau\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
printf("Cho cac phan tu cua ma tran b : \n");
for (i=1;i<=n;i++)
{
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
printf("\n");
printf("Ma tran b ma ban da nhap\n");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %15.5f\n",i,b[i]);
printf("\n");
flushall();
t=1;
while (t)
{
152
printf("Co sua ma tran b khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%f",&i);
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
if (toupper(tl)=='K')
t=0;
}
printf("\n");
printf("Ma tran b\n");
for (i=1;i<=n;i++)
printf("b[%d] = %15.5f\n",i,b[i]);
printf("\n");
for (k=1;k<=n-1;k++)
{
for (i=k+1;i<=n;i++)
{
b[i]=b[i]-b[k]*a[i][k]/a[k][k];
for (j=k+1;j<=n;j++)
a[i][j]=a[i][j]-a[k][j]*a[i][k]/a[k][k];
}
}
{
if (a[n][n]==0)
if (b[n]==0)
printf("He da cho vo nghiem");
else
{
printf("He da cho co vo so nghiem");
x[n]=c;
}
else
x[n]=b[n]/a[n][n];
for (i=n-1;i>=1;i--)
{
s=0;
for (k=i+1;k<=n;k++)
s=s+a[i][k]*x[k];
x[i]=(b[i]-s)/a[i][i];
}
printf("\n");
printf("Nghiem cua he da cho la\n");
printf("\n");
for (i=1;i<=n;i++)
printf("x[%d] = %15.5f\n",i,x[i]);
153
getch();
}
}
§2.Ph−¬ng ph¸p Gauss-Jordan
XÐt hÖ ph−¬ng tr×nh AX=B. Khi gi¶i hÖ b»ng ph−¬ng ph¸p Gauss ta ®−a nã vÒ d¹ng
ma trËn tam gi¸c sau mét lo¹t biÕn ®æi. Ph−¬ng ph¸p khö Gauss-Jordan c¶i tiÕn khö Gauss
b»ng c¸ch ®−a hÖ vÒ d¹ng :
EX = B*
vµ khi ®ã nghiÖm cña hÖ chÝnh lµ B*.Trong ph−¬ng ph¸p Gauss-Jordan mçi b−íc tÝnh ph¶i
tÝnh nhiÒu h¬n ph−¬ng ph¸p Gauss nh−ng l¹i kh«ng ph¶i tÝnh nghiÖm.§Ó ®−a ma trËn A vÒ
d¹ng ma trËn E t¹i b−íc thø i ta ph¶i cã aii = 1 vµ aij=0.Nh− vËy t¹i lÇn khö thø i ta biÕn ®æi :
1.aij = aij/aii (j=i+1,i+2,...,n)
2.k=1,2,...,n
akj = akj - aijaki (j=i+1,i+2,...,n)
bk = bk - biaki
x
x2
⎛
⎜
⎞
⎟
1
8
4
2
5
0
4
24
32
26
21
⎛
⎜
⎞
⎟
⎛
⎜
⎞
⎟
4 10
⎜
⎟
VÝ dô : Cho hÖ
×
=
⎜
⎟
⎜
⎟
2
0
5 6.5 4
4
x3 ⎟
⎜
⎜
⎝
⎜
⎝
⎟
⎠
⎜
⎝
⎟
⎠
⎟
4
9
x4 ⎠
BiÕn ®æi lÇn 1 : ta chia hµng 1 cho a11 = 8;nh©n hµng 1 võa nhËn ®−îc víi 4 vµ lÊy hµng 2
trõ ®i; nh©n hµng 1 võa nhËn ®−îc víi 2 vµ lÊy hµng 3 trõ ®i;gi÷ nguyªn hµng 4 v× phÇn tö
®Çu tiªn ®· b»ng 0 ta cã
x
x2
⎛
⎜
⎞
⎟
1
1 0.5 0.25 0
3
⎛
⎜
⎞
⎟
⎛
⎜
⎞
⎟
0
0
0
8
4
4
4
6
4
4
4
9
20
20
21
⎜
⎟
×
=
⎜
⎟
⎜
⎟
x3 ⎟
⎜
⎜
⎝
⎜
⎝
⎟
⎠
⎜
⎝
⎟
⎠
⎟
x4 ⎠
BiÕn ®æi lÇn 2 : ta chia hµng 2 cho a22 = 8;nh©n hµng 2 võa nhËn ®−îc víi 0.5 vµ lÊy hµng 1
trõ ®i; nh©n hµng 2 võa nhËn ®−îc víi 4 vµ lÊy hµng 3 trõ ®i; nh©n hµng 2 võa nhËn ®−îc víi
4 vµ lÊy hµng 4 trõ ®i ta cã :
x
x2
⎛
⎜
⎞
⎟
1
1 0
0
− 0.25
1.75
2.5
10
⎛
⎜
⎞
⎟
⎛
⎜
⎞
⎟
0 1 0.5
0.5
2
⎜
⎟
×
=
⎜
⎟
⎜
⎟
0 0
0 0
4
2
x3 ⎟
⎜
⎜
⎝
⎜
⎝
⎟
⎠
⎜
⎝
⎟
⎠
⎟
7
11
x4 ⎠
BiÕn ®æi lÇn 3 : ta chia hµng 3 cho a33 = 4;gi÷ nguyªn hµng 1;nh©n hµng 3 võa nhËn ®−îc
víi 0.5 vµ lÊy hµng 2 trõ ®i; nh©n hµng 3 võa nhËn ®−îc víi 2 vµ lÊy hµng 4 trõ ®i ta cã :
x
x2
⎛
⎜
⎞
⎟
1
1 0 0 − 0.25
1.75
1.25
2.5
6
⎛
⎜
⎞
⎟
⎛
⎜
⎞
⎟
0 1 0 0.25
⎜
⎟
×
=
⎜
⎟
⎜
⎟
0 0 1
0 0 0
0.5
6
x3 ⎟
⎜
⎜
⎝
⎜
⎝
⎟
⎠
⎜
⎝
⎟
⎠
⎟
x4 ⎠
154
BiÕn ®æi lÇn 4 : ta chia hµng 4 cho a44 = 6;nh©n hµng 4 võa nhËn ®−îc víi -0.25 vµ lÊy hµng
1 trõ ®i; nh©n hµng 4 võa nhËn ®−îc víi 0.25 vµ lÊy hµng 2 trõ ®i; nh©n hµng 4 võa nhËn
®−îc víi 0.5 vµ lÊy hµng 3 trõ ®i ta cã :
x
x2
⎛
⎜
⎞
⎟
1
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
2
⎛
⎜
⎞
⎟
⎛ ⎞
⎜ ⎟
1
⎜
⎟
×
=
⎜
⎟
⎜ ⎟
2
x3 ⎟
⎜
⎜
⎝
⎜
⎝
⎟
⎠
⎜ ⎟
⎟
1
⎝ ⎠
x4 ⎠
vµ ta cã ngay vec t¬ nghiÖm.
Ch−¬ng tr×nh10-4
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define spt 10
void main()
{
float a[spt][2*spt];
float b[spt];
int i,j,k,n,m,t;
float max,c;
char tl;
clrscr();
printf("Cho so phuong trinh n = ");
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a :\n");
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
printf("Ma tran a ma ban da nhap");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
t=1;
flushall();
155
while (t)
{
printf("Co sua ma tran a khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("Cho chi so cot can sua : ");
scanf("%d",&j);
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
if (toupper(tl)=='K')
t=0;
}
printf("Ma tran a\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
printf("Cho cac phan tu cua ma tran b : \n");
for (i=1;i<=n;i++)
{
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
printf("\n");
printf("Ma tran b ma ban da nhap\n");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %15.5f\n",i,b[i]);
printf("\n");
t=1;
flushall();
while (t)
{
printf("Co sua ma tran b khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
156
if (toupper(tl)=='K')
t=0;
}
printf("\n");
printf("Ma tran b\n");
printf("\n");
for (i=1;i<=n;i++)
printf("%15.5f\n",b[i]);
printf("\n");
t=1;
flushall();
i=1;
while (t)
{
if (a[i][i]==0)
{
max=0;
m=i;
for (k=i+1;k<=n;k++)
if (max<fabs(a[k][i]))
{
m=k;
max=fabs(a[i][i]);
}
if (m!=i)
{
for (j=i;j<=n;j++)
{
c=a[i][j];
a[i][j]=a[m][j];
a[m][j]=c;
}
c=b[i];
b[i]=b[m];
b[m]=c;
}
if (m==i)
{
t=0;
printf("MA TRAN SUY BIEN");
}
}
if (a[i][i]!=0)
{
c=1/a[i][i];
for (j=i;j<=n;j++)
a[i][j]=a[i][j]*c;
b[i]=b[i]*c;
for (k=1;k<=n;k++)
if (k!=i)
157
{
}
c=a[k][i];
for (j=i;j<=n;j++)
a[k][j]=a[k][j]-a[i][j]*c;
b[k]=b[k]-b[i]*c;
}
i=i+1;
if (i==(n+1))
t=0;
}
if (i==(n+1))
{
printf("NGHIEM CUA HE");
printf("\n");
for (i=1;i<=n;i++)
printf("x[%d] = %15.5f\n",i,b[i]);
}
getch();
}
§3.Ph−¬ng ph¸p Cholesky
Trong ph−¬ng ph¸p Cholesky mét ma trËn ®èi xøng A ®−îc ph©n tÝch thµnh d¹ng A =
RTR trong ®ã R lµ mét ma trËn tam gi¸c trªn.HÖ ph−¬ng tr×nh lóc ®ã chuyÓn thµnh AX =
RTRX = B.Nh− vËy tr−íc hÕt ta ph©n tÝch ma trËn A thµnh tÝch hai ma trËn.Sau ®ã gi¶i hÖ
ph−¬ng tr×nh RTY = B vµ cuèi cïng lµ hÖ RX = Y.Ch−¬ng tr×nh m« t¶ thuËt to¸n nµy ®−îc
cho d−íi ®©y :
Ch−¬ng tr×nh 10-5
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define max 6
void main()
{
float a[max][max],r[max][max];
float b[max],x[max],y[max];
int i,j,k,l,n,t;
float s;
char tl;
clrscr();
printf("Cho so phuong trinh n = ");
158
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a : \n");
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
printf("Ma tran a ma ban da nhap\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
flushall();
t=1;
while (t)
{
printf("Co sua ma tran a khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("Cho chi so cot can sua : ");
scanf("%d",&j);
printf("a[",i,",",j,"] = ");
scanf("%f",&a[i][j]);
}
if (toupper(tl)=='K')
t=0;
}
printf("Ma tran a\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%15.5f",a[i][j]);
printf("\n");
}
printf("\n");
printf("Cho cac phan tu cua ma tran b : \n");
for (i=1;i<=n;i++)
{
printf("b[%d] = ",i);
scanf("%f",&b[i]);
159
}
printf("\n");
printf("Ma tran b ma ban da nhap\n");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %15.5f\n",i,b[i]);
printf("\n");
flushall();
t=1;
while (t)
{
printf("Co sua ma tran b khong(c/k)?");
scanf("%c",&tl);
if (toupper(tl)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("b[%d] = ",i);
scanf("%f",&b[i]);
}
if (toupper(tl)=='K')
t=0;
}
printf("\n");
printf("Ma tran b\n");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %15.5f\n",i,b[i]);
printf("\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
r[i][j]=0.0;
for (i=1;i<=n;i++)
{
if (a[i][i]>=0)
{
r[i][i]=sqrt(a[i][i]);
for (j=1+i;j<=n;j++)
r[i][j]=a[i][j]/r[i][i];
for (k=i+1;k<=n;k++)
for (l=k;l<=n;l++)
a[k][l]=a[k][l]-r[i][k]*r[i][l];
}
}
for (k=1;k<=n;k++)
{
s=b[k];
if (k!=1)
for (i=1;i<=k-1;i++)
s=s+r[i][k]*y[i];
160
y[k]=-s/r[k][k];
}
for (i=n;i>=1;i--)
{
s=-y[i];
if (i!=n)
for (k=i+1;k<=n;k++)
s=s-r[i][k]*x[k];
x[i]=s/r[i][i];
}
printf("Nghiem cua he phuong trinh la\n ");
for (i=1;i<=n;i++)
printf("x[%d] = %10.5f\n",i,x[i]);
getch();
}
§4.Ph−¬ng ph¸p Crout
Ph−¬ng ph¸p Crout lµ mét d¹ng cña ph−¬ng ph¸p Gauss.Víi ph−¬ng ph¸p
Gauss,chóng ta biÕn ®æi ma trËn A thµnh mét ma trËn tam gi¸c th× ë ph−¬ng ph¸p Crout
chóng ta ph©n tÝch ma trËn nµy thµnh tÝch cña ma trËn tam gi¸c trªn R vµ ma trËn tam gi¸c
d−íi L.Trong ma trËn L,c¸c hÖ sè trªn ®−êng chÐo chÝnh b»ng 1.Nh− vËy ph−¬ng tr×nh AX =
B ®−îc viÕt thµnh :
A.X = L.R.X = B
Chóng ta ®Æt
nªn :
RX = Y
LY = B
Nh− vËy tr−íc hÕt chóng ta ph©n tÝch ma trËn thµnh tÝch cña L.R.TiÕp theo ta gi¶i ph−¬ng
tr×nh LY = B vµ sau ®ã gi¶i ph−¬ng tr×nh RX = A ®Ó t×m nghiÖm X.
Ch−¬ng tr×nh 10-6
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define max 6
void main()
{
float b[max],x[max],y[max];
float a[max][max],r[max][max],l[max][max];
int i,j,k,n,t;
float c,tr,tl,s;
char tloi;
clrscr();
printf("Cho so phuong trinh n = ");
161
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a : \n");
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
printf("Ma tran a ma ban da nhap");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%10.5f",a[i][j]);
printf("\n");
}
printf("\n");
t=1;
flushall();
while (t)
{
printf("Co sua ma tran a khong(c/k)?");
scanf("%c",&tloi);
if (toupper(tloi)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("Cho chi so cot can sua : ");
scanf("%d",&j);
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
flushall();
}
if (toupper(tloi)=='K')
t=0;
}
printf("Ma tran a\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%10.5f",a[i][j]);
printf("\n");
}
printf("\n");
printf("Cho cac phan tu cua ma tran b : \n");
for (i=1;i<=n;i++)
{
printf("b[%d] = ",i);
162
scanf("%f",&b[i]);
}
printf("\n");
printf("Ma tran b ma ban da nhap");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %10.5f\n",i,b[i]);
printf("\n");
t=1;
flushall();
while (t)
{
printf("Co sua ma tran b khong(c/k)?");
scanf("%c",&tloi);
if (toupper(tloi)=='C')
{
printf("Cho chi so hang can sua : ");
scanf("%d",&i);
printf("b[%d] = ",i);
scanf("%f",&b[i]);
flushall();
}
if (toupper(tloi)=='K')
t=0;
}
printf("\n");
printf("Ma tran b\n");
printf("\n");
for (i=1;i<=n;i++)
printf("b[%d] = %10.5f\n",i,b[i]);
printf("\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
r[i][j]=0.0;
l[i][j]=0.0;
}
for (i=1;i<=n;i++)
{
r[1][i]=a[1][i];
l[i][i]=1.0;
l[i][1]=a[i][1]/a[1][1];
}
for (k=2;k<=n;k++)
{
for (j=k;j<=n;j++)
{
tr=0.0;
for (i=1;i<=k;i++)
tr=tr+l[k][i]*r[i][j];
163
r[k][j]=a[k][j]-tr;
}
if (k!=n)
{
for (i=1;i<=n;i++)
{
tl=0.0;
for (j=1;j<=k-1;j++)
tl=tl+l[i][j]*r[j][k];
l[i][k]=(a[i][k]-tl)/r[k][k];
}
}
else
printf("\n");
}
if (l[1][1]==0.0)
if (b[1]==0.0)
printf("He da cho vo nghiem\n");
else
{
printf("He da cho co vo so nghiem\n");
y[n]=c;
}
else
y[1]=b[1]/l[1][1];
for (i=2;i<=n;i++)
{
s=0.0;
for (k=1;k<=i-1;k++)
s=s+l[i][k]*y[k];
y[i]=(b[i]-s)/l[i][i];
}
if (r[n][n]==0.0)
if (y[n]==0.0)
printf("He da cho vo nghiem\n");
else
{
}
printf("He da cho co vo so nghiem\n");
x[n]=c;
else
x[n]=y[n]/r[n][n];
for (i=n-1;i>=1;i--)
{
s=0.0;
for (k=i+1;k<=n;k++)
s+=r[i][k]*x[k];
x[i]=(y[i]-s)/r[i][i];
}
printf("\n");
164
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình C++ - Chương 10: Giải hệ phương trình đại số tuyến tính", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
giao_trinh_c_chuong_10_giai_he_phuong_trinh_dai_so_tuyen_tin.pdf

