Bài giảng Phương pháp tính - Chương 3: Các vấn đề về ma trận

CHƯƠNG 3: 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  
a
11  
14   
a21 a22 a23 a24  
a31 a32 a33  
a41 a42 a43 a44  
A  
a
34   
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 slà D/p1 (theo tính chất 1) và ma trận còn lại là:  
1 a12 a13  
a
a
a
14   
24   
a
a22 a23  
a31 a32 a33  
a41 a42 a43 a44  
21  
34   
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 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à:  
1 a  
0 a  
a13  
a
a
a
12  
14   
a23  
24   
22  
0 a32 a33  
34   
0 a42 a43 a44  
Lấy giá trị trụ p2 a22 .Ta chia các phần tử của hàng thứ hai cho p2 thì  
định thức slà D/(p1p2) và ma trận còn lại là:  
1 a  
0
a13  
  
a
a
a
12  
14   
  
1 a23  
24   
0 a32 a33  
34   
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 lấy hàng 4 trừ đi hàng 2 đã nhân với a42 thì thì định thức vẫn là  
47  
D/(p1p2) và ma trận là:  
  
  
1 0 a  
0 1 a  
a
a
a
13  
14   
  
  
24   
23  
  
0 0 a33  
  
34   
  
  
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 3-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++)  
{
48  
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++)  
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++)  
49  
{
}
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;  
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)  
{
50  
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 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   
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 thk. Khi k = n tA(k) sẽ trở thành ma trận đơn vị E trở  
thành A-1  
dụ: Tính ma trận nghịch đảo của ma trận  
51  
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  
A 1 2 1  
1 0 0  
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  
E 0 1 0  
A 1 2  
1
1 1  
2
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  
A 0 3 2 1 2  
1 2 0 0  
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  
A 0 1 1 3  
2 3 1 3 0  
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  
A 0 1 1 3  
2 3 1 3  
E   1 3 2 3  
0
0
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  
52  
1 0 0  
A 0 1 0  
0 0 1  
Như vậy A-1 là:  
3 4 1 4 1 4  
E   1 4 3 4 1 4  
1 4 1 4 3 4  
3/ 4 1/ 4 1/ 4  
A1 1/ 4 3/ 4 1/ 4  
1/ 4 1/ 4 3/ 4  
Áp dụng phương pháp này chúng ta có chương trình sau:  
Chương trình 3-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;  
clrscr();  
printf("  
**MA TRAN NGHICH DAO** \n");  
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");  
}
53  
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");  
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++)  
{
54  
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++)  
55  
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
1  
2
1  
9 8 7 cho ta kết quả  
8 7 6  
10 9  
9
9  
§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 Bnp là ma  
n
trận Cmp trong đó mỗi phần tử của Cmp :c a b  
ij  
ik kj  
k1  
Chương trình dưới đây thực hiện nhân hai ma trận với nhau.  
56  
Chương trình 3-3  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
#include <ctype.h>  
#define max 50  
void main()  
{
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();  
57  
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++)  
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++)  
58  
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++)  
{
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++)  
59  
{
}
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  
1 3  
1 0  
5 3  
5
0
1  
1 2 2  
8 14 11  
1
14 2 1  
  
   
3 4  
3
2
2  
§4. GIÁ TRỊ RIÊNG VÀ VEC RIÊNG CỦA MA TRẬN  
1.Khái niệm chung: Trong nghiên cứu thuyết ứ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 dạng:  
a    
a12  
  
a1n  
a2n  
11  
a21  
  
a22     
(3)  
an1  
an2  
 ann    
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 đđlà giá trị riêng của ma trận trên là định thức của 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 đị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 đa thức đặc trưng của ma trận vuông A.  
dụ tìm vec tơ riêng và trị riêng của ma trận:  
60  
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:  
3    
1
3  
P ()   
3
2
1  1 (4  )(2 4)  
A
2    
Nghiệm của PA() = 0 là 1 = 4, 2 = 2j và 3 = -2j. Vì trường cơ sở 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
    
3
2
1  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 - p1n-1 - p2n-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  a  
11  
1n   
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 B1 = A  
p2 = (1/2)vet(B2) với B2 = A(B1-p1E)  
p3 = (1/3)vet(B3) với B3 = A(B2-p2E)  
......  
Chương trình tính các hệ số pi như sau:  
Chương trình 3-4  
// Faddeev_Leverrier;  
#include <stdio.h>  
#include <conio.h>  
#include <ctype.h>  
#define max 50  
61  
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");  
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')  
{
62  
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;  
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++)  
{
63  
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  
(5)  
1
1
2
2
n
n
i
i
i1  
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: Av1X1 = v1AX1 = v11X1 ; Av2X2 = v2AX2 = v22X2 v.v.  
Nên: AV = v11X1 + v22X2 +...+ vnnXn  
n
n
AV v A X v X  
i
i
i
i
i
i
i1  
i1  
Lại nhân biểu thức trên với A ta có:  
A2V = v11 AX1 + v22 AX2 + ··· + vnnAXn  
2
2
= v12 X1 + v22 X2 +...+ vnn Xn  
1
tiếp đến lần thứ p ta có:  
64  
n
AV v pX  
i
i
i
i1  
Lấy p làm thừa số chung ta có:  
1
p  
p  
p  
1  
ApV  p v X v  
X2 v  
X
2 2   
3 3   
n n   
X3   v  
1   
n   
1
1
1  
1  
Tương tự ta có:  
p1  
p1  
p1  
1  
Ap1V  p11 v X v  
X2 v  
X3   v  
X
2 2   
3 3   
n n   
n   
1
1
1  
1  
Khi p rất lớn,vì 1 > 2 > 3 >,..., n nên:  
1  
i   
0 khi p    
Do đó:lim ApV  p1v1X1  
(6)  
p  
lim Ap1V  p11v1X1  
p  
nghĩa là khi p đủ lớn thì:  
ApV  p1v1X1  
Ap1V  p11v1X1  
do đó:  
Ap1V  1ApV  
p
p
hay: A A V  1A V  
Như vậyApV là véc tơ riêng của A ứng với 1 còn giá trị riêng 1 sẽ là:  
Ap1V  
lim  
 1  
ApV  
p  
Trong thực tế đtránh vượt quá dung lượng bộ nhkhi 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 nhận được vectơ Vk  
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 V1  
= V1/m1j  
Một cách tổng quát, tại lần lặp thứ p ta nhận được vectơ Vp phần tử  
lớn nhất mpj thì Vp = Vp/ mpj.  
- tính Vp1 AVp với vp+1,j phần tử thứ j của Vp+1. Ta có:  
lim V X  
p  
p
1
lim vp1,j  1  
p  
dụ: Tìm giá trị riêng lớn nhất và vec tơ riêng tương ứng của ma trận:  
65  
17  
8
2
24  
13  
10  
30  
20  
8
17  
7
6
A   
23 43 54 26  
Chọn V= {1, 1, 1, 1}T ta tính được  
V
V1 =  
AV  
88  
48  
26  
V’1  
V2 =  
AV’1  
V’2  
1
1
1
1
-0.6027  
-0.3288  
-0.1781  
1
-6.4801 -0.5578  
-5.6580 -0.4870  
0.0818  
11.6179  
11.6179  
V’4  
0.0070  
1
-146  
V3 =  
V’3  
V4 = AV’3  
V5 =  
AV’2  
AV’4  
-0.5218 -3.5718  
-0.4987 -3.4791  
-3.9594 -0.5358 -3.6823  
-3.6526 -0.4942 -3.5196  
0.0707  
7.3902  
7.3902  
0.0096  
1
0.0630  
7.0573  
7.0573  
0.0089  
1
0.0408  
6.9638  
6.9638  
V’5  
V6=  
V’6  
V7=  
V’7  
AV’5  
AV’6  
-0.5129 -3.5341 -0.5075  
-0.4996 -3.4809 -0.4999  
-3.5173 -0.5043  
-3.4868 -0.5000  
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 3-5  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
66  
Tải về để xem bản đầy đủ
doc 36 trang yennguyen 13/04/2022 3740
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp tính - Chương 3: 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:

  • docbai_giang_phuong_phap_tinh_chuong_3_cac_van_de_ve_ma_tran.doc