Giáo trình C++ - Chương 9: Các vấn đề về ma trận
Ch−¬ng 9 : C¸c vÊn ®Ò vÒ ma trËn
§1.§Þnh thøc cña ma trËn
Cho mét ma trËn vu«ng cÊp n.Ta cÇn t×m ®Þnh thøc cña nã.Tr−íc hÕt chóng ta nh¾c
l¹i mét sè tÝnh chÊt quan träng cña ®Þnh thøc:
- nÕu nh©n tÊt c¶ c¸c phÇn tö cña mét hµng (hay cét) víi k th× ®Þnh thøc ®−îc nh©n
víi k
- ®Þnh thøc kh«ng ®æi nÕu ta céng thªm vµo mét hµng tæ hîp tuyÕn tÝnh cña c¸c
hµng cßn l¹i.
Ta sÏ ¸p dông c¸c tÝnh chÊt nµy ®Ó tÝnh ®Þnh thøc cña mét ma trËn cÊp 4 nh− sau(ph−¬ng
ph¸p nµy cã thÓ më réng cho mét ma trËn cÊp n) b»ng ph−¬ng ph¸p trô:
a
a12 a13 a14
⎛
⎞
11
⎜
⎟
a21 a22 a23 a24
⎜
⎟
A =
a31 a32 a33 a34 ⎟
⎜
⎜
⎝
⎟
a41 a42 a43 a44 ⎠
LÊy gi¸ trÞ trô lµ p1= a11.Ta chia c¸c phÇn tö cña hµng thø nhÊt cho p1= a11 th× ®Þnh thøc sÏ lµ
D/p1 (theo tÝnh chÊt 1) vµ ma trËn cßn l¹i lµ:
′ ′ ′
a21 a22 a23 a24
1
a12 a13 a14
⎛
⎞
⎜
⎟
⎜
⎟
a31 a32 a33 a34 ⎟
⎜
⎜
⎝
⎟
a41 a42 a43 a44 ⎠
LÊy hµng 2 trõ ®i hµng 1 ®· nh©n víi a21,lÊy hµng 3 trõ ®i hµng 1 ®· nh©n víi a31 vµ lÊy hµng
4 trõ ®i hµng 1 ®· nh©n víi a41 (thay hµng b»ng tæ hîp tuyÕn tÝnh cña c¸c hµng cßn l¹i) th×
®Þnh thøc vÉn lµ D/p1 vµ ma trËn lµ:
′
′ ′
a13 a14
1 a
⎛
⎜
⎞
⎟
12
′
′
′
′
′
0 a22 a23 a24
⎜
⎟
′
0 a32 a33 a34 ⎟
⎜
⎜
⎝
⎟
′
′
′
0 a42 a43 a44 ⎠
′
LÊy gi¸ trÞ trô lµ p2 = a22 .Ta chia c¸c phÇn tö cña hµng thø hai cho p2 th× ®Þnh thøc sÏ lµ
D/(p1p2) vµ ma trËn cßn l¹i lµ:
′
1
′ ′
a13 a14
1 a
0
⎛
⎜
⎞
⎟
12
′′
′
′′
′
a23 a24
⎜
⎟
′
0 a32 a33 a34 ⎟
⎜
⎜
⎝
⎟
′
′
′
0 a42 a43 a44 ⎠
′
′
LÊy hµng 1 trõ ®i hµng 2 ®· nh©n víia12 ,lÊy hµng 3 trõ ®i hµng 2 ®· nh©n víi a32 vµ lÊy hµng
′
4 trõ ®i hµng 2 ®· nh©n víi a42 th× ®Þnh thøc vÉn lµ D/p1 vµ ma trËn lµ:
th× ®Þnh thøc vÉn lµ D/(p1p2) vµ ma trËn lµ:
116
′′
′′
a14
′′
′′
′′
1 0 a
⎛
⎜
⎞
⎟
13
′′
0 1 a23 a24
⎜
⎟
′′
0 0 a33 a34 ⎟
⎜
⎜
⎝
⎟
′′
0 0 a43 a44 ⎠
TiÕp tôc lÊy hµng 3 råi hµng 4 lµm trô th× ma trËn sÏ lµ:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
⎛
⎞
⎜
⎟
⎜
⎟
⎜
⎟
⎝
⎠
′ ′′ ′′′
§Þnh thøc cña ma trËn nµy lµ D/(p1p2p3p4)= D/(a11a22a33a44 ) =1 nªn ®Þnh thøc cña ma trËn A
lµ D = p1p2p3p4.
Sau ®©y lµ ch−¬ng tr×nh t×m ®Þnh thøc cña mét ma trËn:
Ch−¬ng tr×nh 9-1
//tinh dinh thuc
#include <conio.h>#include <stdio.h>#include <ctype.h>
#include <stdlib.h>
void main()
{
int i,j,k,n,ok1,ok2,t;
float d,c,e,f,g,h;
float a[50][50];
char tl;
clrscr();
printf("** TINH DINH THUC CAP n **");
printf("\n");
printf("\n");
printf("Cho cap cua dinh thuc n = ");
scanf("%d",&n);
printf("Nhap ma tran a\n");
for (i=1;i<=n;i++)
{
printf("Dong %d:\n",i);
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
}
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++)
117
printf("%.5f\t",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("%.5f\t",a[i][j]);
printf("\n");
}
printf("\n");
d=1;
i=1;
ok2=1;
while ((ok2)&&(i<=n))
{
if (a[i][i]==0)
{
ok1=1;
k=k+1;
while ((ok1)&&(k<=n))
if (a[k,i]!=0)
{
for (j=i;j<=n;j++)
{
c=a[i][j];
a[i][j]=a[k][j];
a[k][j]=c;
}
d=-d;
118
ok1=0;
}
else
k=k+1;
if (k>n)
{
printf("\n");
printf("** MA TRAN SUY BIEN **");
ok2=0;
d=0;
}
}
if (a[i][i]!=0)
{
c=a[i][i];
for (j=i+1;j<=n;j++)
a[i][j]=a[i][j]/c;
for (k=i+1;k<=n;k++)
{
c=a[k][i];
for (j=i+1;j<=n;j++)
a[k][j]=a[k][j]-a[i][j]*c;
}
}
i=i+1;
}
if (ok2)
{
for (i=1;i<=n;i++)
d=d*a[i][i];
printf("\n");
printf("** GIA TRI DINH THUC D **");
printf("\n");
printf("%.3f",d);
}
getch();
}
§2.NghÞch ®¶o ma trËn
Gäi A-1 lµ ma trËn nghÞch ®¶o cña mét ma trËn A bËc n ta cã AA-1 = E.(trong biÓu
thøc nµy E lµ mét ma trËn vu«ng cã c¸c phÇn tö trªn ®−êng chÐo chÝnh b»ng 1). D¹ng cña
ma trËn E,vÝ dô cÊp 4,lµ:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
⎛
⎜
⎞
⎟
E =
⎜
⎟
⎜
⎝
⎟
⎠
119
Ph−¬ng ph¸p lo¹i trõ ®Ó nhËn ®−îc ma trËn nghÞch ®¶o A-1 ®−îc thùc hiÖn qua nhiÒu
giai ®o¹n (n),mçi mét giai ®o¹n gåm hai b−íc.§èi víi giai ®o¹n thø k:
- chuÈn ho¸ phÇn tö akk b»ng c¸ch nh©n hµng víi nghÞch ®¶o cña nã
- lµm cho b»ng kh«ng c¸c phÇn tö phÝa trªn vµ phÝa d−íi ®−êng chÐo cho ®Õn cét thø
k.Khi k = n th× A(k) sÏ trë thµnh ma trËn ®¬n vÞ vµ E trë thµnh A-1
VÝ dô: TÝnh ma trËn nghÞch ®¶o cña ma trËn
2 1 1
⎛
⎞
⎟
⎜
A = 1 2 1
⎜
⎟
1 1 2
⎝
⎠
Ta viÕt l¹i ma trËn A vµ ma trËn ®¬n vÞ t−¬ng øng víi nã
2 1 1
1 0 0
⎛
⎞
⎟
⎛
⎞
⎟
⎜
⎜
A = 1 2 1
E = 0 1 0
⎜
⎟
⎜
⎟
1 1 2
0 0 1
⎝
⎠
⎝
⎠
Giai ®o¹n 1: B−íc a: Nh©n hµng 1 víi 1/a11,nghÜa lµ a,1j = a1j/a11 ®èi víi dßng thø nhÊt,a,ij =
aij ®èi víi c¸c dßng kh¸c
1 1 2 1 2
1 2 0 0
⎛
⎞
⎟
⎛
⎞
⎟
⎜
⎜
A = 1
2
1
1
2
E = 0 1 0
⎜
⎟
⎠
⎜
⎟
⎠
1
⎝
0
0 1
⎝
B−íc b: Trõ hµng 3 vµ hµng 2 cho hµng 1,nghÜa lµ a(1)1j = aij - ai1aij ®èi víi i ≠
1.
1 1 2 1 2
1 2 0 0
⎛
⎞
⎟
⎛
⎞
⎟
⎜
⎜
A = 0 3 2 1 2
E = −1 2 1 0
⎜
⎟
⎜
⎟
0 1 2 3 2
−1 2 0 1
⎝
⎠
⎝
⎠
Giai ®o¹n 2: B−íc a: LÊy hµng 2 lµm chuÈn,nh©n hµng 2 víi 2/3,®Ó nguyªn c¸c hµng kh¸c
1 1 2 1 2
1 2
0
0
⎛
⎞
⎛
⎞
⎜
⎟
⎜
⎟
A = 0
1
1 3
E = −1 3 2 3 0
⎜
⎟
⎠
⎜
⎟
⎠
0 1 2 3 2
−1 2
0
1
⎝
⎝
B−íc b: LÊy hµng 1 trõ ®i hµng 2 nh©n 1/2 vµ lÊy hµng 3 trõ ®i hµng 2 nh©n
1/2
1 0 1 3
2 3 −1 3 0
⎛
⎞
⎟
⎛
⎞
⎟
⎜
⎜
A = 0 1 1 3
E = −1 3 2 3
0
⎜
⎟
⎜
⎟
0 0 4 3
−1 3 −1 3 1
⎝
⎠
⎝
⎠
Giai ®o¹n 3: B−íc a: LÊy hµng 3 lµm chuÈn,nh©n hµng 3 víi 3/4,®Ó nguyªn c¸c hµng kh¸c
1 0 1 3
2 3 −1 3
0
0
⎛
⎞
⎛
⎞
⎜
⎟
⎜
⎟
A = 0 1 1 3
E = −1 3 2 3
⎜
⎟
⎠
⎜
⎟
⎠
0 0
1
−1 4 −1 4 3 4
⎝
⎝
B−íc b: LÊy hµng 1 trõ ®i hµng 3 nh©n 1/3 vµ lÊy hµng 2 trõ ®i hµng 3 nh©n
1/3
3 4 −1 4 −1 4
⎛
⎞
⎟
1 0 0
⎛
⎞
⎟
⎜
⎜
A = 0 1 0
E = −1 4 3 4 −1 4
⎜
⎟
⎠
⎜
⎟
0 0 1
−1 4 −1 4 3 4
⎝
⎠
⎝
Nh− vËy A-1 lµ:
120
3 4 −1 4 −1 4
−1 4 3 4 −1 4
−1 4 −1 4 3 4
⎛
⎜
⎞
⎟
A−1
=
⎜
⎝
⎟
⎠
¸p dông ph−¬ng ph¸p nµy chóng ta cã ch−¬ng tr×nh sau:
Ch−¬ng tr×nh 9-2
#include <conio.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include
<ctype.h>void main() { int i,j,k,n,t,t1;float c,a[50][50],b[50][50]; char tl;
printf(" **MA TRAN NGHICH DAO** \n");
clrscr();
printf("Cho bac cua ma tran n = ");
scanf("%d",&n);
printf("Vao ma tran ban dau a\n");
for (i=1;i<=n;i++)
{
printf("Vao hang thu %d :\n",i);
for (j=1;j<=n;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
}
printf("\n");
printf("Ma tran ban da nhap\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%.5f\t",a[i][j]);
printf("\n");
}
t=1;
flushall();
while (t)
{
printf("\nCo sua ma tran 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("\nMa tran ban dau\n");
121
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%.5f\t",a[i][j]);
printf("\n");
}
printf("\n");
for (i=1;i<=n;i++)
for (j=n+1;j<=2*n;j++)
{
if (j==i+n)
a[i][j]=1;
else
a[i][j]=0;
}
i=1;
t1=1;
while (t1&&(i<=n))
{
if (a[i][i]==0)
{
t=1;
k=i+1;
while (t&&(k<=n))
if (a[k][i]!=0)
{
for (j=1;j<=2*n;j++)
{
c=a[i][j];
a[i][j]=a[k][j];
a[k][j]=c;
}
t=0;
}
else
k=k+1;
if (k==n+1)
{
if (a[i][k-1]==0)
{
printf("MA TRAN SUY BIEN\n ");
t1=0;
}
}
}
if (a[i][i]!=0)
{
c=a[i][i];
for (j=i;j<=2*n;j++)
122
a[i][j]=a[i][j]/c;
}
for (k=1;k<=n;k++)
{
if (k!=i)
{
c=a[k][i];
for (j=i;j<=2*n;j++)
a[k][j]=a[k][j]-a[i][j]*c;
}
}
i=i+1;
}
if (t1)
{
printf("\n");
printf("\nMA TRAN KET QUA\n");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=n+1;j<=2*n;j++)
printf("%.4f\t\t",a[i][j]);
printf("\n");
}
printf("\n");
}
getch();
}
Dïng ch−¬ng tr×nh tÝnh nghÞch ®¶o cña ma trËn:
9 9 8
−1
2
−10
9
−1
9
− 9
⎛
⎞
⎛
⎞
⎟
⎜
⎟
⎜
9 8 7 cho ta kÕt qu¶
2
⎜
⎝
⎟
⎜
⎝
⎟
8 7 6
−1
⎠
⎠
§3.TÝch hai ma trËn
Gi¶ sö ta cã ma trËn Amn vµ ma trËn Bnp.TÝch cña Amn vµ Bnp lµ ma trËn Cmp trong ®ã
n
mçi phÇn tö cña Cmp lµ:
c = a b
ij ik kj
∑
k=1
Ch−¬ng tr×nh d−íi ®©y thùc hiÖn nh©n hai ma trËn víi nhau.
Ch−¬ng tr×nh 9-3
#include <conio.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include
<ctype.h>
#define max 50
void main()
123
{
int n,l,m,i,j,k,t;
float a[max][max],b[max][max],c[max][max];
char tl;
clrscr();
printf("Cho so hang cua ma tran a : ");
scanf("%d",&n);
printf("Cho so cot cua ma tran a : ");
scanf("%d",&l);
printf("Cho so cot cua ma tran b : ");
scanf("%d",&m);
printf("\nNHAP MA TRAN A\n");
for (i=1;i<=n;i++)
for (j=1;j<=l;j++)
{
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n");
printf("Ma tran a ma ban da nhap\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=l;j++)
printf("%10.5f",a[i][j]);
printf("\n");
}
flushall();
t=1;
while (t)
{
printf("Co sua ma tran 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");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=l;j++)
124
printf("%10.5f",a[i][j]);
printf("\n");
}
printf("\n");
printf("NHAP MA TRAN B\n");
for (i=1;i<=l;i++)
for (j=1;j<=m;j++)
{
printf("b[%d][%d] = ",i,j);
scanf("%f",&b[i][j]);
}
printf("\n");
printf("Ma tran b ban da nhap\n");
for (i=1;i<=l;i++)
{
for (j=1;j<=m;j++)
printf("%10.5f",b[i][j]);
printf("\n");
}
flushall();
t=1;
while (t)
{
printf("Co sua ma tran 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("b[%d][%d] = ",i,j);
scanf("%f",&b[i][j]);
}
if (toupper(tl)=='K')
t=0;
}
printf("Ma tran b ban dau");
printf("\n");
for (i=1;i<=l;i++)
{
for (j=1;j<=m;j++)
printf("%10.5f",b[i][j]);
printf("\n");
}
printf("\n");
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
125
c[i][j]=0;
for (k=1;k<=l;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
printf("Ma tran tich c :\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
printf("%10.5f",c[i][j]);
printf("\n");
}
getch();
}
Dïng ch−¬ng tr×nh tÝnh tÝnh hai ma trËn ta nhËn ®−îc kÕt qu¶
2
1
5
8
1
0
−1
⎛
⎞
⎛
⎞
⎜
⎟
⎜
⎟
−1 3
1
2
− 2
3
−14 11
⎛
⎜
⎝
⎞
⎟
⎠
×
=
⎜
⎟
⎜
⎟
1
5
0
3
3 − 4
2
− 2
⎜
⎝
⎟
⎠
⎜
⎝
⎟
⎠
14 − 2 −1
§4.Gi¸ trÞ riªng vµ vec t¬ riªng cña ma trËn
1.Kh¸i niÖm chung: Trong nghiªn lÝ thuyÕt vµ øng dông,ta gÆp bµi to¸n vÒ ma trËn cÊp
n.Cho mét ma trËn A cÊp n,gi¸ trÞ λ ®−îc gäi lµ gi¸ trÞ riªng vµ vect¬ X ®−îc gäi lµ vect¬
riªng cña ma trËn A nÕu:
AX = λX
(1)
Vect¬ riªng ph¶i lµ vect¬ kh¸c kh«ng.T−¬ng øng víi mét gi¸ trÞ riªng cã v« sè vect¬
riªng.NÕu X lµ mét vÐc t¬ riªng t−¬ng øng víi gi¸ trÞ riªng λ th× cX còng lµ vec t− riªnh øng
víi λ.Cã nhiÒu thuËt to¸n t×m gi¸ trÞ riªng vµ vect¬ riªng cña mét ma trËn.Gi¶ sö ta cã ma
trËn A,gäi E lµ ma trËn ®¬n vÞ th× theo (1) ta cã:
(A-λE)X = 0
(2)
vµ (A - λE) lµ ma trËn cã d¹ng:
⎞
⎟
⎛⎜a11
− λ a12
a
....
1n
(3)
⎜a21 a22 − λ
a
....
⎟
⎟
2n
⎜⎜.......
⎜
⎝an1 an2
a
− λ ⎟⎠
....
nn
Nh− vËy do (2) lµ hÖ ph−¬ng tr×nh tuyÕn tÝnh thuÇn nhÊt nªn ®iÒu kiÖn cÇn vµ ®ñ ®Ó λ
lµ gi¸ trÞ riªng cña ma trËn trªn lµ ®Þnh thøc cña nã b»ng kh«ng:
det(A - λE) = 0
(4)
Ph−¬ng tr×nh (4) ®−îc gäi lµ ph−¬ng tr×nh ®Æc tr−ng cña ma trËn A.§Þnh thøc det(A - λE)
®−îc gäi lµ ®Þnh thøc ®Æc tr−ng cña ma trËn A.§Þnh thøc PA(λ) cña ma trËn trªn ®−îc gäi lµ
®a thøc ®Æc tr−ng cña ma trËn vu«ng A.
VÝ dô t×m vec t¬ riªng vµ trÞ riªng cña ma trËn:
3
3
2
1
1
− 2
−3
−1
0
⎛
⎞
⎜
⎟
⎜
⎝
⎟
⎠
Tr−íc hÕt ta tÝnh ®a thøc ®Æc tr−ng cña ma trËn A:
126
⎞
⎟
⎛⎜3−λ
⎜⎜3
1
−3
2
⎟
+
(4−λ) (λ 4)
(λ)=
PA
1−λ
−1 =
⎜⎝ 2
−2
−λ ⎟⎠
NghiÖm cña PA(λ) = 0 lµ λ1 = 4,λ2 = 2j vµ λ3 = -2j.V× tr−êng c¬ së lµ sè thùc nªn ta chØ lÊy λ
= 4.§Ó t×m vec t¬ riªng t−¬ng øng víi λ = 4 ta gi¶i hÖ
⎞
⎛⎜3−λ
1
−3
−1
⎛ξ1 ⎞
⎟
⎟
⎜ ⎟
ξ2
⎜⎜3
1−λ
= 0
×
⎜ ⎟
⎜⎝ 2
−2
−λ ⎟⎠
ξ
⎝ 3⎠
ta nhËn ®−îc c¸c gi¸ trÞ cña ξ,chóng t¹o thµnh vec t¬ riªng øng víi λ.
Nh− vËy khi khai triÓn ®Þnh thøc ta cã mét ®a thøc bËc n cã d¹ng:
Pn(λ) = λn - p1λn-1 - p2λn-2 - …- pn = 0
Muèn x¸c ®Þnh c¸c hÖ sè cña ®a thøc ®Æc tÝnh nµy ta dïng ph−¬ng ph¸p Fadeev-Leverrier.Ta
xÐt ma trËn A:
a
a12 ⋅⋅⋅ a1n
⎛
⎞
11
⎜
⎟
a21 a22 ⋅⋅⋅ a2n
⋅⋅⋅ ⋅⋅⋅ ⋅⋅⋅ ⋅⋅⋅
an1 an2 ⋅⋅⋅ ann ⎠
⎜
⎟
A =
⎜
⎜
⎟
⎟
⎝
Ta gäi vÕt cña ma trËn A lµ sè:
vet(A)= a11 + a22 +...+ ann
Khi ®ã tham sè pi cña Pn(λ) ®−îc c¸c ®Þnh nh− sau:
p1 = vet(B1) víi
p2 = (1/2)vet(B2)
p3 = (1/3)vet(B3)
......
B1 = A
víi
víi
B2 = A(B1-p1E)
B3 = A(B2-p2E)
Ch−¬ng tr×nh tÝnh c¸c hÖ sè pi nh− sau:
Ch−¬ng tr×nh 9-4
// Faddeev_Leverrier;
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#define max 50
void main()
{
int i,j,k,m,n,k1,t;
float vet,c1,d;
char tl;
float p[max];
float a[max][max],b[max][max],c[max][max],b1[max][max];
clrscr();
printf("Cho bac cua ma tran n = ");
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a : \n");
127
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");
clrscr();
printf("Ma tran 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");
}
t=1;
flushall();
while (t)
{
printf("\n");
printf("Co sua ma tran 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]);
flushall();
}
if (toupper(tl)=='K')
t=0;
}
printf("Ma tran ban dau");
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%10.5f",a[i][j]);
printf("\n");
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
b[i][j]=a[i][j];
for (k=1;k<=n-1;k++)
{
vet=0.0;
128
for (i=1;i<=n;i++)
vet+=b[i][i];
p[k]=vet/k;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (j!=i)
c[i][j]=b[i][j];
if (j==i)
c[i][j]=b[i][j]-p[k];
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
b[i][j]=0.0;
for (k1=1;k1<=n;k1++)
b[i][j]+=a[i][k1]*c[k1][j];
}
}
vet=0.0;
for (i=1;i<=n;i++)
vet+=b[i][i];
p[n]=vet/n;
printf("\n");
printf("Cac he so cua da thuc dac trung\n");
printf("\n");
d=1.0;
printf("%6.2f",d);
for (i=1;i<=n;i++)
{
c1=-p[i];
printf("%5c%6.2f",' ',c1);
}
getch();
}
2.Ph−¬ng ph¸p Mises: ThuËt to¸n Mises t×m gi¸ trÞ riªng lín nhÊt cña mét ma trËn A. NÕu
ma trËn A lµ thùc vµ vµ mçi trÞ riªng béi k cã ®ñ k vec t¬ riªng ®éc lËp tuyÕn tÝnh th× viÖc
tÝnh to¸n sÏ cho ta gi¸ trÞ riªng lín nhÊt.
Mét vect¬ V bÊt k× cã thÓ ®−îc viÕt d−íi d¹ng:
n
V = v X + v X + ⋅⋅⋅ + v X = v X
i
(5)
∑
1
1
2
2
n
n
i
i=1
Trong ®ã X1,X2,..,Xn lµ c¸c vec t¬ riªng t−¬ng øng víi c¸c gi¸ trÞ riªng λ1,λ2,λ3,..,λn
vµ v1,v2,v3,...,vn lµ c¸c h»ng sè.
Khi nh©n A víi V ta cã:
AV = Av1X1 + Av2X2 +....+ AvnXn
do:
VËy nªn:
Av1X1 = v1AX1 = v1λ1X1 ; Av2X2 = v2AX2 = v2λ2X2 v.v.
AV = v1λ1X1 + v2λ2X2 +...+ vnλnXn
129
n
n
=
=
∑
∑
AV
vi Ai Xi vi λi Xi
i=1
i=1
L¹i nh©n biÓu thøc trªn víi A ta cã:
A2V = v1λ1 AX1 + v2λ2 AX2 +...+ vnλn AXn
= v1λ2 X1 + v2λ2 X2 +...+ vnλn Xn
2
2
1
vµ tiÕp ®Õn lÇn thø p ta cã:
n
p
p
p
p
pV
vi λi Xi v1λ1 X1 v1λ2 X2 + ⋅⋅+ vn λn Xn
=
=
+
∑
A
i=1
LÊy λp1 lµm thõa sè chung ta cã:
p
p
p
⎡
⎤
⎥
⎛
⎞
⎛
⎞
⎛
⎞
λ2
λ3
λn
p
p
⎢
⎜
⎜
⎟
⎟
⎜
⎜
⎟
⎟
⎜
⎜
⎟
⎟
A V = λ1 v1X1 + v2
X2 + v3
X3 + ⋅⋅⋅ + vn
Xn
λ1 ⎠
λ1 ⎠
λ1 ⎠
⎢
⎣
⎥
⎦
⎝
⎝
⎝
T−¬ng tù ta cã:
p+1
p+1
p+1
⎡
⎤
⎛
⎞
⎛
⎞
⎛
⎞
λ2
λ3
λn
Ap+1V = λp1+1 v1X1 + v2
X2 + v3
X3 + ⋅⋅⋅ + vn
Xn
⎢
⎥
⎜
⎜
⎟
⎜
⎜
⎟
⎟
⎜
⎜
⎟
⎟
⎟
λ1 ⎠
λ1 ⎠
λ1 ⎠
⎢
⎥
⎦
⎝
⎝
⎝
⎣
Khi p rÊt lín,v× λ1 > λ2 > λ3 >,...,λn nªn:
⎛
⎞
λi
⎜
⎜
⎟
⎟
→ 0 khi p → ∞
λ1 ⎠
⎝
lim ApV = λp1v1X1
Do ®ã:
(6)
p→∞
lim Ap+1V = λp1+1v1X1
p→∞
nghÜa lµ khi p ®ñ lín th×:
ApV = λp1v1X1
Ap+1V = λp1+1v1X1
Ap+1V = λ1ApV
do ®ã:
A
ApV
= λ1ApV
hay:
p
Nh− vËy
lµ vÐc t¬ riªng cña A øng víi λ1 cßn gi¸ trÞ riªng λ1 sÏ lµ:
A V
Ap+1
V
lim
= λ1
ApV
p→∞
Trong thùc tÕ ®Ó tr¸nh v−ît qu¸ dung l−îng bé nhí khi λ1 kh¸ lín,c¸c vect¬ Vk ®−îc
chuÈn ho¸ sau mçi b−íc b»ng c¸ch chia c¸c phÇn tö cña nã cho phÇn tö lín nhÊt mk vµ nhËn
®−îc vect¬ V’k
Nh− vËy c¸c b−íc tÝnh sÏ lµ:
- cho mét vec t¬ V bÊt k× (cã thÓ lµ V = { 1,1,1,...,1}T)
- tÝnh V1 = AV vµ nhËn ®−îc phÇn tö lín nhÊt lµ m1j tõ ®ã tÝnh tiÕp V′1 = V1/m1j
Mét c¸ch tæng qu¸t,t¹i lÇn lÆp thø p ta nhËn ®−îc vect¬ Vp vµ phÇn tö lín nhÊt mpj th×
V’p = Vp/ mpj.
′
- tÝnh Vp+1 = AVp víi vp+1,j lµ phÇn tö thø j cña Vp+1.Ta cã:
′
lim V = X
⎧
⎪
p
1
p→∞
⎨
lim vp+1,j = λ1
⎪
⎩
p→∞
VÝ dô: T×m gi¸ trÞ riªng lín nhÊt vµ vec t¬ riªng t−¬ng øng cña ma trËn:
130
17
8
24
13
10
30
20
8
17
7
⎛
⎜
⎞
⎟
A =
⎜
⎟
2
6
⎜
⎝
⎟
⎠
− 23 − 43 − 54 − 26
Chän V= {1,1,1,1}T ta tÝnh ®−îc
V
V1 = AV
V’1
V2 =
V’2
AV’1
1
1
1
1
88
48
26
-0.6027
-0.3288
-0.1781
1
-6.4801
-5.6580
0.0818
11.6179
11.6179
-0.5578
-0.4870
0.0070
1
-146
λ
λ
V3 =
AV’2
V’3
V4 = AV’3
V’4
V5 =
AV’4
-3.9594
-3.6526
0.0707
7.3902
7.3902
-0.5358
-0.4942
0.0096
1
-3.6823
-3.5196
0.0630
7.0573
7.0573
-0.5218
-0.4987
0.0089
1
-3.5718
-3.4791
0.0408
6.9638
6.9638
V’5
V6=
AV’5
-3.5341
V’6
V7= AV’6
-3.5173
-3.4868
V’7
-
-0.5075
-0.4999
-0.5043
-0.5000
0.5129
-
-3.4809
0.4996
0.0059
1
0.0250
6.9634
6.9634
0.0036
1
0.0147
6.9742
6.9742
0.0021
1
λ
Dïng thuËt to¸n trªn ta cã ch−¬ng tr×nh sau:
Ch−¬ng tr×nh 9-5
#include <conio.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include
<ctype.h>#define max 50void main() { int i,j,k,n,t; char tl;
float a[max][max];
float
t0,t1,epsi,s;
float x0[max],x1[max];
clrscr();
printf("Phuong phap lap luy thua tim tri rieng lon nhat\n");
printf("Cho so hang va cot cua ma tran 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++)
131
{
}
printf("a[%d][%d] = ",i,j);
scanf("%f",&a[i][j]);
printf("\n");
printf("Ma tran 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");
}
flushall();
t=1;
while (t)
{
printf("\nCo sua ma tran 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;
}
epsi=1e-5;
printf("\nMa tran 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");
for (i=1;i<=n;i++)
x0[i]=1;
k=1;
t=0;
t1=0;
do
{
t0=t1;
for (i=1;i<=n;i++)
132
{
x1[i]=0;
for (j=1;j<=n;j++)
x1[i]=x1[i]+a[i][j]*x0[j];
}
s=0;
j=0;
for (i=1;i<=n;i++)
if (s<fabs(x1[i]))
{
j=i;
s=fabs(x1[i]);
}
t1=x1[j];
for (i=1;i<=n;i++)
x1[i]=x1[i]/t1;
if (fabs(t1-t0)<epsi)
{
printf("Da thuc hien %d buoc lap\n",k);
printf("Gia tri rieng lon nhat Vmax = %15.5f\n",t1);
printf("Vec to rieng tuong ung\n");
for (i=1;i<=n;i++)
printf("%.5f\n",x1[i]);
t=1;
}
if (fabs(t1-t0)>epsi)
{
for (i=1;i<=n;i++)
x0[i]=x1[i];
k=k+1;
}
if (k>max)
t=1;
}
while(t==0);
getch();
}
Dïng ch−¬ng tr×nh nµy tÝnh gÝa trÞ riªng vµ vec t¬ riªng cña ma trËn:
2
9
− 8
−1
0
6
− 3
⎛
⎞
⎜
⎟
4
⎜
⎝
⎟
⎠
0
ta nhËn ®−îc gi¸ trÞ riªng lµ 3.0000 vµ vec t¬ riªng lµ x = { -0.75 ; 0.75 ; 1 }T
Nh− chóng ta ®· nãi tr−íc ®©y,ph−¬ng ph¸p Mises (hay cßn gäi lµ ph−¬ng ph¸p lÆp
lòy thõa) chØ cho phÐp t×m gi¸ trÞ riªng lín nhÊt vµ vec t¬ riªng t−¬ng øng cña ma trËn.§Ó
x¸c ®Þnh c¸c gi¸ trÞ riªng kh¸c,ma trËn A ®−îc biÕn ®æi thµnh mét ma trËn kh¸c A1 mµ c¸c
gi¸ trÞ riªng lµ λ2 > λ3 >...> λn.Ph−¬ng ph¸p nµy gäi lµ ph−¬ng ph¸p xuèng thang.Sau ®©y lµ
ph−¬ng ph¸p biÕn ®æi ma trËn:
133
Gi¶ sö X1 lµ vec t¬ riªng cña ma trËn A t−¬ng øng víi gi¸ trÞ riªng λ1 vµ W1 lµ vec t¬
riªng cña ma trËn AT t−¬ng øng víi gi¸ trÞ riªng λ1.Tõ ®Þnh nghÜa AX1 = λ1X1 ta viÕt:
(A - λE)X1 = 0
Ta t¹o ma trËn A1 d¹ng:
(7)
X1W1T
λ1
=
−
A1 A
W1T X1
T
T
Ta chó ý lµ X1W1 lµ mét ma trËn cßn W1 X1 lµ mét con sè.Khi nh©n hai vÕ cña biÓu thøc
(7) víi X1 vµ chý ý ®Õn tÝnh kÕt hîp cña tÝch c¸c ma trËn ta cã:
X1 W1T X1
λ1
=
−
A1X1 AX1
W1T X1
(8)
W1T X1
−
=AX1 λ1X
=AX1 λ1X1
1 W1T X1
−
=0
A1 chÊp nhËn gi¸ trÞ riªng b»ng kh«ng.
NÕu X2 lµ vec t¬ riªng t−¬ng øng víi gi¸ trÞ riªng λ2,th× khi nh©n A1 víi X2 ta cã:
X1W1T X2
λ1
=
−
(9)
A1X2 AX2
W1T X1
W1T X2
−
=AX2 λ1X
1 W1T X1
Theo ®Þnh nghÜa v× W1 lµ vect¬ riªng cña AT nªn:
λ1W1 =ATW1
(10)
MÆt kh¸c do:
(AX)T =XTAT vµ (AT)T = A
Nªn khi chuyÓn vÞ (10) ta nhËn ®−îc:
(ATW1)T = λ1WT
1
Hay:
T
T
W1 A = λ1W1
(11)
Khi nh©n (11) víi X2 ta cã:
T
T
λ1W1 X2 = W1 AX2
vµ do ®Þnh nghÜa:
AX2 = λ2X2
nªn:
T
T
λ1W1 X2 = W1 λ2X2
vËy th×:
T
(λ1 - λ2) W1 X2 = 0
khi λ1 ≠ λ2 th×:
T
W1 X2 = 0
(12)
Cuèi cïng thay (12) vµo (9) ta cã:
A1X2 = AX2 = λ2X2
Nh− vËy λ2 lµ gi¸ trÞ riªng lín nhÊt cña ma trËn A1 vµ nh− vËy cã thÓ ¸p dông thuËt
to¸n nµy ®Ó t×m c¸c gi¸ trÞ riªng cßn l¹i cña ma trËn.C¸c b−íc tÝnh to¸n nh− sau
- khi ®· cã λ1 vµ X1 ta t×m W1 lµ vec t¬ riªng cña AT øng víi gi¸ trÞ riªng λ1 (vÝ dô t×m
W1 b»ng c¸ch gi¶i ph−¬ng tr×nh (AT -λ1E)W1 = 0).Tõ ®ã tÝnh ma trËn A12 theo (7).
- t×m gi¸ trÞ riªng vµ vec t¬ riªng cña A1 b»ng c¸ch lÆp c«ng suÊt vµ cø thÕ tiÕp tôc vµ
xuèng thang (n-1) lÇn ta t×m ®ñ n gi¸ trÞ riªng cña ma trËn A.
VÝ dô: T×m gi¸ trÞ riªng vµ vect¬ riªng cña ma trËn sau:
134
17
8
24
13
10
30
20
8
17
7
⎛
⎜
⎞
⎟
A =
⎜
⎟
2
6
⎜
⎟
− 23 − 43 − 54 − 26
⎝
⎠
Ta ®· t×m ®−îc gi¸ trÞ riªng lín nhÊt λ1 = 7 vµ mét vect¬ riªng t−¬ng øng:
X1 = { 1,1,0,-2}T.
Ma trËn AT cã d¹ng:
17
8
2
−23
⎛
⎞
⎟
⎜
24 13 10 −43
AT
=
⎜
⎟
30 20
17
8
6
−54
−26
⎜
⎟
7
⎝
⎠
vµ theo ph−¬ng tr×nh AT -λ1E)W1 = 0 ta t×m ®−îc vect¬ W1 = {293,695,746,434}T
Ta lËp ma trËn míi A1 theo (7):
293
293
0
695
695
0
746
746
0
434
434
0
⎛
⎞
⎟
X1W1T
W1T X1
⎜
7
λ1
=
⎜
⎟
120
⎜
⎝
⎟
⎠
− 586 −1390 −1492 − 868
vµ:
−0.0917 −16.5417 −13.5167 −8.3167
−9.0917 −27.5417 −23.5167 −18.3167
⎛
⎜
⎞
⎟
=
A1
⎜
⎟
2
10
8
6
⎜
⎟
11.1833 38.0833
33.0333 24.6333
⎝
⎠
Tõ ma trËn A1 ta t×m tiÕp ®−îc λ2 theo phÐp lÆp luü thõa vµ sau ®ã l¹i t×m ma trËn A3 vµ t×m
gi¸ trÞ riªng t−¬ng øng.
Ch−¬ng tr×nh lÆp t×m c¸c gi¸ trÞ riªng vµ vec t¬ riªng cña ma trËn nh− sau:
Ch−¬ng tr×nh 9-6
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define max 50
void main()
{
float a[max][max],vv[max][max],at[max][max];
float x[max],y[max],vd[max];
int i,j,k,n,l,t;
float vp,v1,z,epsi,va,ps;
char tl;
clrscr();
epsi=0.000001;
printf("Cho bac cua ma tran 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++)
135
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 9: Các vấn đề về ma trận", để 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_9_cac_van_de_ve_ma_tran.pdf