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 đủ
pdf 35 trang Thùy Anh 14620 Free
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:

  • pdfgiao_trinh_c_chuong_10_giai_he_phuong_trinh_dai_so_tuyen_tin.pdf