Giáo trình Phương pháp tính - Chương 3: Các vấn đề về ma trận (Phần 2)
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
Bạn đang xem tài liệu "Giáo trình Phương pháp tính - Chương 3: Các vấn đề về ma trận (Phần 2)", để 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_phuong_phap_tinh_chuong_3_cac_van_de_ve_ma_tran_p.doc

