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

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

Đang tải... (xem toàn văn)

Thông tin tài liệu

Khái niệm về phương pháp tính: Phương pháp tính là môn học về những lí luận cơ bản và các phương pháp giải gần đúng, cho ra kết quả bằng số của các bài toán thường gặp trong toán học cũng như trong kĩ thuật. Chúng ta thấy rằng hầu hết các bài toán trong toán học như giải các phương trình đại số hay siêu việt, các hệ phương trình tuyến tính hay phi tuyến, các phương trình vi phân thường hay đạo hàm riêng,tính các tích phân,... thường khó giải đúng được, nghĩa là khó tìm kết quả dưới dạng các biểu thức. Một số bài toán có thể giải đúng được nhưng biểu thức kết quả lại cồng kềnh, phức tạp khối lượng tính toán rất lớn. Vì những lí do trên, việc giải gần đúng các bài toán là vô cùng cần thiết. Các bài toán trong kĩ thuật thường dựa trên số liệu thực nghiệm và các giả thiết gần đúng. Do vậy việc tìm ra kết quả gần đúng với sai số cho phép là hoàn toàn có ý nghĩa thực tế. Từ lâu người ta đã nghiên cứu phương pháp tính và đạt nhiều kết quả đáng kể. Tuy nhiên để lời giải đạt được độ chính xác cao, khối lượng tính toán thường rất lớn. Với các phương tiện tính toán thô sơ, nhiều phương pháp tính đã được đề xuất không thể thực hiện được vì khối lượng tính toán quá lớn. Khó khăn trên đã làm phương pháp tính không phát triển được. Ngày nay nhờ máy tính điện tử người ta đã giải rất nhanh các bài toán khổng lồ, phức tạp, đã kiểm nghiệm được các phương pháp tính cũ và đề ra các ph ương pháp tính mới. Phương pháp tính nhờ đó phát triển rất mạnh mẽ. Nó là cầu nối giữa toán học và thực tiễn. Nó là môn học không thể thiếu đối với các kĩ sư. Ngoài nhiệm vụ chính của phương pháp tính là tìm các phương pháp giải gần đúng các bài toán,nó còn có nhiệm vụ khác như nghiên cứu tính chất nghiệm, nghiên cứu bài toán cực trị, xấp xỉ hàm v.v. Trong phần này chúng ta sẽ nghiên cứu một loạt bài toán thường gặp trong thực tế và đưa ra chương trình giải chúng.

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 . đượ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. #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

Ngày đăng: 16/03/2014, 20:42

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan