Tải bản đầy đủ (.pdf) (7 trang)

Phương Pháp Tính chương 3b - CÁC VẤN ĐỀ VỀ MA TRẬN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (245.13 KB, 7 trang )


76
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 :











333231
232221
131211
aaa
aaa
aaa


A












1ll
01l
001
L
32131
21













33
2322
131211
r00
rr0
rrr
R

Chúng ta nhắc lại quy tắc nhân hai ma trận A.B :











333231
232221
131211
aaa
aaa
aaa
A













333231
232221
131211
cbb
bbb
bbb
B












333231

232221
131211
ccc
ccc
ccc
C

với c11= a11b11 + a12b21 + a13b31
c12= a11b12 + a12b22 + a13b32
c13= a11b13 + a12b23 + a13b33
c21= a21b11 + a22b21 + a23b31
Tổng quát :




n
1k
kjik
ij
bac

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ó :












1ll
01l
001
32131
21











33
2322
131211
r00
rr0
rrr











333231
232221
131211
aaa
aaa
aaa

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ó :

77
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





1i
1k
kjik
ijij
rlar
( j = i tới n)

ii
1i
1k
kijk
ji
ji
r
rla
l





(j = i tới n)
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;
r[i][j]=0.0;

78
}
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");
for (i=1;i<=n;i++)

79
{
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 :








































4.600
45.20
212
R
165.3

015.1
001
L
357
113
212
A


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 = R
T
R 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 :












333231
232221
131211

aaa
aaa
aaa
A












33
2322
131211
r00
rr0
rrr
R

Tích hai ma trận R
T
và R là :























33
2322
131211
T
33
2322
131211
r00
rr0
rrr
r00

rr0
rrr











333231
232221
131211
aaa
aaa
aaa

Ta tính được :
r11
2
= a11
r11r12 = a12
r11r13 = a13
r11r12 = a21
r12
2
+ r22r12 = a22

r22
2
+ r12r13 = a23
r11r13 = a31
r13r12+ r23r21 = a32
r33
2
+ r22r23 + r13
2
= a23
Tổng quát ta có :

11
ij
ij1111
a
a
s;ar 


80

ni1sar
1i
1k
2
ki
iiii







ji
r
rra
r
ii
1i
1k
kjki
ij
ij








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)
{

81
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

82
















97646
710957
691068
45657
678710

ta có :




















732052.10000
0707107.0000
414214.1121320.2414214.100
631456.0316228.0264911.1316228.00
897367.1213594.2529822.2213594.2162278.3
R

×