Phương pháp tính - Chương 3: Các vấn đề về ma trận (Tiếp)

giá trị riêng  
-1.000000 vec tơ riêng  
0.500000  
1.000000  
-0.500000  
§5. PHÂN TÍCH MA TRẬN  
1. Phương pháp Crout: Khi giải hệ phương trình tuyến tính nếu ta gặp một  
ma trận tam giác thì việc giải hệ sẽ rất dễ dàng. Vì vậy chúng ta tìm cách  
phân tích ma trận A thành tích của hai ma trận L và R sao cho : A = L.R . Để  
phân tích được, ma trận A phải có các giá trị trụ khác 0. Các ma trận L và R  
là các ma trận tam giác dưới (L) và tam giác trên (R).Các hệ số lkk = 1 . Ma  
trận L và R bậc 3 có dạng :  
a
a12  
a22  
a
a
1
0
1
0
0
1
r
r12  
r
11  
11  
13   
13   
A a  
L l  
R 0 r  
r
23   
23   
21  
21  
22  
a31 a32 a33  
l31 l321  
0
0 r33  
Chúng ta nhắc lại quy tắc nhân hai ma trận A.B :  
a
a12  
a22  
a
a
b
b12  
b22  
b
b
c
c12  
c22  
c
c
11  
11  
11  
21  
13   
13   
13   
23   
A a  
B b  
C c  
23   
23   
21  
21  
a31 a32 a33  
b31 b32 c33  
c31 c32 c33  
với c11= a11b11 + a12b21 + a13b31  
c12= a11b12 + a12b22 + a13b32  
c13= a11b13 + a12b23 + a13b33  
c21= a21b11 + a22b21 + a23b31  
Tổng quát :  
n
c a b  
ij  
ik kj  
k1  
Dùng quy tắc này cho hai ma trận L và R và cho đồng nhất các hệ số  
của chúng với ma trận A ta có :  
1
0
1
0
r
r12  
r
a
a
a12  
a22  
a
a
11  
11  
13   
13   
l
0 0 r  
1
r
23   
23   
21  
22  
21  
l31 l321  
0
0 r33  
a31 a32 a33  
a11 = 1. r11 + 0.0 + 0.0 = r11 ;  
a12 = r12 ; a13 = r13  
a21 = l21r11 ;  
a22 = l21r12 + r22 ; a23 = l31r11  
a31 = l31r11 ; a32 = l31r12 ;  
a33 = l31r13 + l32r23 + r33  
Một cách tổng quát ta có :  
76  
với j > i : lij = rji = 0  
với i = 1 : r1j = a1j (j = 1 tới n)  
lj1 = aj1/r11 (j = 1 tới n)  
với i = 2 tới n  
r a i1 l r ( j = i tới n)  
ij  
ij  
ik kj  
k1  
a i1 l r  
ji  
jk ki  
k1  
lji   
(j = i tới n)  
r
ii  
Chương trình phân tích ma trận thành 2 ma trận như sau :  
Chương trình 3-7  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
#define max 6  
void main()  
{
float a[max][max],r[max][max],l[max][max];  
int i,j,k,n;  
float tr,tl;  
clrscr();  
printf("Cho bac cua ma tran n = ");  
scanf("%d",&n);  
printf("Cho cac phan tu cua ma tran can phan tich 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]);  
}
for (i=1;i<=n;i++)  
for (j=1;j<=n;j++)  
{
l[i][j]=0.0;  
77  
r[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];  
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");  
}
printf("Ma tran l :\n");  
for (i=1;i<=n;i++)  
{
for (j=1;j<=n;j++)  
printf("%15.5f",l[i][j]);  
printf("\n");  
}
printf("Ma tran r :\n");  
78  
for (i=1;i<=n;i++)  
{
for (j=1;j<=n;j++)  
printf("%15.5f",r[i][j]);  
printf("\n");  
}
getch();  
}
Dùng chương trình này phân tích ma trận ta được :  
2 1 2  
A 3 1 1  
1
0
0
2
1
2  
4
6.4  
L 1.5 1 0  
R 0 2.5  
7
5
3  
3.5 6 1  
0
0
2. Phương pháp phân tích Cholesky : Phương pháp Cholesky dùng để phân  
tích một ma trận đối xứng sao cho A = RTR với R là một ma trận tam giác  
trên. Cách phân tích cũng tương tự như phương pháp Crout . Ta xét các ma  
trận A và R bậc 3 như sau :  
a
a12  
a22  
a
a
r
r12  
r
11  
11  
13   
13   
A a  
R 0 r  
r
23   
23   
21  
22  
a31 a32 a33  
Tích hai ma trận RT và R là :  
0
0 r33  
r
r12  
r
r
r12  
r
r
a
a  
a12  
a22  
a
a
T  
13   
13   
13   
11  
11  
11  
21  
0 r  
r
23   
0 r  
23   
23   
22  
22  
0
0 r33  
0
0 r33  
a31 a32 a33  
Ta tính được :  
2
r11 = a11  
r11r12 = a12  
r11r13 = a13  
r11r12 = a21  
2
r12 + r22r12 = a22  
2
r22 + r12r13 = a23  
r11r13 = a31  
r13r12+ r23r21 = a32  
2
2
r33 + r22r23 + r13 = a23  
Tổng quát ta có :  
aij  
a11  
r11 a11 ;sij   
79  
r a i1 s2  
1 i n  
i j  
ii  
ii  
ki  
k1  
a i1 r r  
ij  
ki kj  
k1  
rij   
rii  
rij = 0  
(i > j )  
Dưới đây là chương trình:  
Chương trình 3-8  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
#define max 6  
void main()  
{
float a[max][max],r[max][max],b[max][max];  
int i,j,k,n,l;  
clrscr();  
printf("Cho bac cua ma tran n : ");  
scanf("%d",&n);  
printf("Cho cac phan tu cua ma tran can phan tich 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]);  
}
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.0)  
{
80  
printf("Ma tran khong duong");  
getch();  
exit(1);  
}
else  
{
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];  
}
}
printf("\n");  
printf("Ma tran chuyen vi cua r\n");  
for (i=1;i<=n;i++)  
for (j=1;j<=n;j++)  
b[j][i]=r[i][j];  
for (i=1;i<=n;i++)  
{
for (j=1;j<=n;j++)  
printf("%15.5f",b[i][j]);  
printf("\n");  
}
printf("\n");  
printf("Ma tran r\n");  
for (i=1;i<=n;i++)  
{
for (j=1;j<=n;j++)  
printf("%15.5f",r[i][j]);  
printf("\n");  
}
getch();  
}
Dùng chương trình này để phân tích ma trận  
81  
10 7 8 7 6  
7 5 6 5 4  
8 6 10 9 6  
7 5 9 10 7  
6 4 6 7 9  
ta có :  
3.162278 2.213594 2.529822 2.213594 1.897367  
0
0
0
0
0.316228 1.264911 0.316228 0.631456  
0
0
0
1.414214 2.121320 1.414214  
R   
0
0
0.707107  
0
0
1.732052  
82  
doc 7 trang baolam 17360 Free
Bạn đang xem tài liệu "Phương pháp tính - Chương 3: Các vấn đề về ma trận (Tiếp)", để 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:

  • docphuong_phap_tinh_chuong_3_cac_van_de_ve_ma_tran_tiep.doc