Đăng ký Đăng nhập

Tài liệu Chương 3 các vấn đề về ma trận_2

.DOC
7
66
53

Mô tả:

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 11  A   a 21 a  31 a 12 a 22 a 32  a 11  A   a 21 a  31 a 12 a 13   a 23  a 33    1  L   l 21 l  31 0 1 l 321 0  0 1   r11  R  0 0  Chúng ta nhắc lại quy tắc nhân hai ma trận A.B : với a 22 a 32 a 13   a 23  a 33    b 11  B   b 21 b  31 c11= a11b11 + a12b21 + a13b31 c12= a11b12 + a12b22 + a13b32 c13= a11b13 + a12b23 + a13b33 c21= a21b11 + a22b21 + a23b31 Tổng quát : b 12 b 22 b 32 b 13   b 23  c 33    c 11  C   c 21 c  31 c 12 c 22 c 32 r12 r22 0 r13   r23  r33   c 13   c 23  c 33   n c ij   a ik b kj k 1 Dùng quy tắc này cho hai ma trận L và R của chúng với ma trận A ta có : 0 0   r11 r12 r13   a 11 a 12  1      1 0    0 r22 r23    a 21 a 22  l 21 l   0 r33   a 31 a 32    31 l 321 1   0 và cho đồng nhất các hệ số a 13   a 23  a 33   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ó : với j > i : lij = rji = 0 78 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 i 1 rij  a ij   l ik rkj ( j = i tới n) k 1 i 1 l ji  a ji   l jk rki k 1 rii (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 #include #include #include #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; } 79 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++) { for (j=1;j<=n;j++) 80 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  A  3 7  1 1 5  2  1   3   1  L   1.5  3.5  0 1 6 0  0 1  2  R  0 0  1  2.5 0  2  4  6.4   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 11  A   a 21 a  31 a 12 a 22 a 32 a 13   a 23  a 33   Tích hai ma trận RT và R là :  r11  R  0  0  r12 r22 0 r13   r23  r33   T  r11 r12 r13   r11 r12 r13   a       0 r22 r23    0 r22 r23    a   0 0 r   0 0 r  a 33  33    11 21 31 a 12 a 22 a 32 a 13   a 23  a 33   Ta tính được : r112 = a11 r11r12 = a12 r11r13 = a13 r11r12 = a21 r122 + r22r12 = a22 r222 + r12r13 = a23 r11r13 = a31 r13r12+ r23r21 = a32 r332 + r22r23 + r132 = a23 Tổng quát ta có : r11  a 11 ; s ij  i 1 rii  a ii   s 2 ki k 1 a ij a 11 1 i  n 81 i 1 rij  a ij   rki rkj k 1 rii ij rij = 0 Dưới đây là chương trình: (i > j ) Chương trình 3-8 #include #include #include #include #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) { printf("Ma tran khong duong"); getch(); exit(1); 82 } 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 83 ta có :  10 7 8 7   7 5 6 5  8 6 10 9   7 5 9 10  6 4 6 7   3.162278  0   0 R  0   0  2.213594 2.529822 2.213594 0.316228 0 1.264911 1.414214 0.316228 2.121320 0 0 0 0 0.707107 0 6   4  6   7  9   1.897367    0.631456  1.414214   0  1.732052   84
- Xem thêm -

Tài liệu liên quan