Tài liệu Turbo C nâng cao P9 docx

35 362 1
Tài liệu Turbo C nâng cao P9 docx

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

116 Chơng 9 : Các vấn đề về ma trận Đ1.Định thức của ma trận Cho một ma trận vuông cấp n.Ta cần tìm định thức của nó.Trớc hết chúng ta nhắc lại một số tính chất quan trọng của định thức: - nếu nhân tất cả các phần tử của một hàng (hay cột) với k thì định thức đợc nhân với k - định thức không đổi nếu ta cộng thêm vào một hàng tổ hợp tuyến tính của các hàng còn lại. Ta sẽ áp dụng các tính chất này để tính định thức của một ma trận cấp 4 nh sau(phơng pháp này có thể mở rộng cho một ma trận cấp n) bằng phơng pháp trụ: = 44434241 34333231 24232221 14131211 aaaa aaaa aaaa aaaa A Lấy giá trị trụ là p 1 = a 11 .Ta chia các phần tử của hàng thứ nhất cho p 1 = a 11 thì định thức sẽ là D/p 1 (theo tính chất 1) và ma trận còn lại là: 44434241 34333231 24232221 141312 aaaa aaaa aaaa aaa1 Lấy hàng 2 trừ đi hàng 1 đã nhân với a 21 ,lấy hàng 3 trừ đi hàng 1 đã nhân với a 31 và lấy hàng 4 trừ đi hàng 1 đã nhân với a 41 (thay hàng bằng tổ hợp tuyến tính của các hàng còn lại) thì định thức vẫn là D/p 1 và ma trận là: 444342 343332 242322 141312 aaa0 aaa0 aaa0 aaa1 Lấy giá trị trụ là 222 ap = .Ta chia các phần tử của hàng thứ hai cho p 2 thì định thức sẽ là D/(p 1 p 2 ) và ma trận còn lại là: 444342 343332 2423 141312 aaa0 aaa0 aa10 aaa1 Lấy hàng 1 trừ đi hàng 2 đã nhân với 12 a ,lấy hàng 3 trừ đi hàng 2 đã nhân với 32 a và lấy hàng 4 trừ đi hàng 2 đã nhân với 42 a thì định thức vẫn là D/p 1 và ma trận là: thì định thức vẫn là D/(p 1 p 2 ) và ma trận là: 117 4443 3433 2423 1413 aa00 aa00 aa10 aa01 Tiếp tục lấy hàng 3 rồi hàng 4 làm trụ thì ma trận sẽ là: 1000 0100 0010 0001 Định thức của ma trận này là D/(p 1 p 2 p 3 p 4 )= D/( 44332211 aaaa ) =1 nên định thức của ma trận A là D = p 1 p 2 p 3 p 4 . Sau đây là chơng trình tìm định thức của một ma trận: Chơng trình 9-1 //tinh dinh thuc #include <conio.h>#include <stdio.h>#include <ctype.h> #include <stdlib.h> void main() { int i,j,k,n,ok1,ok2,t; float d,c,e,f,g,h; float a[50][50]; char tl; clrscr(); printf("** TINH DINH THUC CAP n **"); printf("\n"); printf("\n"); printf("Cho cap cua dinh thuc n = "); scanf("%d",&n); printf("Nhap ma tran a\n"); for (i=1;i<=n;i++) { printf("Dong %d:\n",i); for (j=1;j<=n;j++) { printf("a[%d][%d] = ",i,j); scanf("%f",&a[i][j]); } printf("\n"); } printf("\n"); printf("Ma tran a ma ban da nhap\n"); printf("\n"); for (i=1;i<=n;i++) { for (j=1;j<=n;j++) 118 printf("%.5f\t",a[i][j]); printf("\n"); } printf("\n"); t=1; flushall(); while (t) { printf("Co sua ma tran a khong(c/k)?"); scanf("%c",&tl); if (toupper(tl)=='C') { printf("Cho chi so hang can sua : "); scanf("%d",&i); printf("Cho chi so cot can sua : "); scanf("%d",&j); printf("a[%d][%d] = ",i,j); scanf("%f",&a[i,j]); } if (toupper(tl)=='K') t=0; } printf("Ma tran a ban dau\n"); printf("\n"); for (i=1;i<=n;i++) { for (j=1;j<=n;j++) printf("%.5f\t",a[i][j]); printf("\n"); } printf("\n"); d=1; i=1; ok2=1; while ((ok2)&&(i<=n)) { if (a[i][i]==0) { ok1=1; k=k+1; while ((ok1)&&(k<=n)) if (a[k,i]!=0) { for (j=i;j<=n;j++) { c=a[i][j]; a[i][j]=a[k][j]; a[k][j]=c; } d=-d; 119 ok1=0; } else k=k+1; if (k>n) { printf("\n"); printf("** MA TRAN SUY BIEN **"); ok2=0; d=0; } } if (a[i][i]!=0) { c=a[i][i]; for (j=i+1;j<=n;j++) a[i][j]=a[i][j]/c; for (k=i+1;k<=n;k++) { c=a[k][i]; for (j=i+1;j<=n;j++) a[k][j]=a[k][j]-a[i][j]*c; } } i=i+1; } if (ok2) { for (i=1;i<=n;i++) d=d*a[i][i]; printf("\n"); printf("** GIA TRI DINH THUC D **"); printf("\n"); printf("%.3f",d); } getch(); } Đ2.Nghịch đảo ma trận Gọi A -1 là ma trận nghịch đảo của một ma trận A bậc n ta có AA -1 = E.(trong biểu thức này E là một ma trận vuông có các phần tử trên đờng chéo chính bằng 1). Dạng của ma trận E,ví dụ cấp 4,là: = 1000 0100 0010 0001 E 120 Phơng pháp loại trừ để nhận đợc ma trận nghịch đảo A -1 đợc thực hiện qua nhiều giai đoạn (n),mỗi một giai đoạn gồm hai bớc.Đối với giai đoạn thứ k: - chuẩn hoá phần tử a kk bằng cách nhân hàng với nghịch đảo của nó - làm cho bằng không các phần tử phía trên và phía dới đờng chéo cho đến cột thứ k.Khi k = n thì A (k) sẽ trở thành ma trận đơn vị và E trở thành A -1 Ví dụ: Tính ma trận nghịch đảo của ma trận = 211 121 112 A Ta viết lại ma trận A và ma trận đơn vị tơng ứng với nó = = 100 010 001 E 211 121 112 A Giai đoạn 1 : Bớc a: Nhân hàng 1 với 1/a 11 ,nghĩa là a , 1j = a 1j /a 11 đối với dòng thứ nhất,a , ij = a ij đối với các dòng khác = = 100 010 0021 E 211 121 21211 A Bớc b: Trừ hàng 3 và hàng 2 cho hàng 1,nghĩa là a (1) 1j = a ij - a i1 a ij đối với i 1. = = 1021 0121 0021 E 23210 21230 21211 A Giai đoạn 2 : Bớc a: Lấy hàng 2 làm chuẩn,nhân hàng 2 với 2/3,để nguyên các hàng khác = = 1021 03231 0021 E 23210 3110 21211 A Bớc b: Lấy hàng 1 trừ đi hàng 2 nhân 1/2 và lấy hàng 3 trừ đi hàng 2 nhân 1/2 = = 13131 03231 03132 E 3400 3110 3101 A Giai đoạn 3 : Bớc a: Lấy hàng 3 làm chuẩn,nhân hàng 3 với 3/4,để nguyên các hàng khác = = 434141 03231 03132 E 100 3110 3101 A Bớc b: Lấy hàng 1 trừ đi hàng 3 nhân 1/3 và lấy hàng 2 trừ đi hàng 3 nhân 1/3 = = 434141 414341 414143 E 100 010 001 A Nh vậy A -1 là: 121 ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎝ ⎛ −− −− − − = − 434141 414341 414143 A 1 ¸p dông ph−¬ng ph¸p nµy chóng ta cã ch−¬ng tr×nh sau: Ch−¬ng tr×nh 9-2 #include <conio.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include <ctype.h>void main() { int i,j,k,n,t,t1; float c,a[50][50],b[50][50]; char tl; clrscr(); printf(" **MA TRAN NGHICH DAO** \n"); printf("Cho bac cua ma tran n = "); scanf("%d",&n); printf("Vao ma tran ban dau a\n"); for (i=1;i<=n;i++) { printf("Vao hang thu %d :\n",i); for (j=1;j<=n;j++) { printf("a[%d][%d] = ",i,j); scanf("%f",&a[i][j]); } printf("\n"); } printf("\n"); printf("Ma tran ban da nhap\n"); printf("\n"); for (i=1;i<=n;i++) { for (j=1;j<=n;j++) printf("%.5f\t",a[i][j]); printf("\n"); } t=1; flushall(); while (t) { printf("\nCo sua ma tran khong(c/k)?"); scanf("%c",&tl); if(toupper(tl)=='C') { printf("Cho chi so hang can sua : "); scanf("%d",&i); printf("Cho chi so cot can sua : "); scanf("%d",&j); printf("a[%d][%d] = ",i,j); scanf("%f",&a[i][j]); } if (toupper(tl)=='K') t=0; } printf("\nMa tran ban dau\n"); 122 printf("\n"); for (i=1;i<=n;i++) { for (j=1;j<=n;j++) printf("%.5f\t",a[i][j]); printf("\n"); } printf("\n"); for (i=1;i<=n;i++) for (j=n+1;j<=2*n;j++) { if (j==i+n) a[i][j]=1; else a[i][j]=0; } i=1; t1=1; while (t1&&(i<=n)) { if (a[i][i]==0) { t=1; k=i+1; while (t&&(k<=n)) if (a[k][i]!=0) { for (j=1;j<=2*n;j++) { c=a[i][j]; a[i][j]=a[k][j]; a[k][j]=c; } t=0; } else k=k+1; if (k==n+1) { if (a[i][k-1]==0) { printf("MA TRAN SUY BIEN\n "); t1=0; } } } if (a[i][i]!=0) { c=a[i][i]; for (j=i;j<=2*n;j++) 123 a[i][j]=a[i][j]/c; } for (k=1;k<=n;k++) { if (k!=i) { c=a[k][i]; for (j=i;j<=2*n;j++) a[k][j]=a[k][j]-a[i][j]*c; } } i=i+1; } if (t1) { printf("\n"); printf("\nMA TRAN KET QUA\n"); printf("\n"); for (i=1;i<=n;i++) { for (j=n+1;j<=2*n;j++) printf("%.4f\t\t",a[i][j]); printf("\n"); } printf("\n"); } getch(); } Dùng chơng trình tính nghịch đảo của ma trận: 678 789 899 cho ta kết quả 991 9102 121 Đ3.Tích hai ma trận Giả sử ta có ma trận A mn và ma trận B np .Tích của A mn và B np là ma trận C mp trong đó mỗi phần tử của C mp là: = = n 1k kjikij bac Chơng trình dới đây thực hiện nhân hai ma trận với nhau. Chơng trình 9-3 #include <conio.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include <ctype.h> #define max 50 void main() 124 { int n,l,m,i,j,k,t; float a[max][max],b[max][max],c[max][max]; char tl; clrscr(); printf("Cho so hang cua ma tran a : "); scanf("%d",&n); printf("Cho so cot cua ma tran a : "); scanf("%d",&l); printf("Cho so cot cua ma tran b : "); scanf("%d",&m); printf("\nNHAP MA TRAN A\n"); for (i=1;i<=n;i++) for (j=1;j<=l;j++) { printf("a[%d][%d] = ",i,j); scanf("%f",&a[i][j]); } printf("\n"); printf("Ma tran a ma ban da nhap\n"); for (i=1;i<=n;i++) { for (j=1;j<=l;j++) printf("%10.5f",a[i][j]); printf("\n"); } flushall(); t=1; while (t) { printf("Co sua ma tran khong(c/k)?"); scanf("%c",&tl); if (toupper(tl)=='C') { printf("Cho chi so hang can sua : "); scanf("%d",&i); printf("Cho chi so cot can sua : "); scanf("%d",&j); printf("a[%d][%d] = ",i,j); scanf("%f",&a[i][j]); } if (toupper(tl)=='K') t=0; } printf("Ma tran a ban dau"); printf("\n"); for (i=1;i<=n;i++) { for (j=1;j<=l;j++) 125 printf("%10.5f",a[i][j]); printf("\n"); } printf("\n"); printf("NHAP MA TRAN B\n"); for (i=1;i<=l;i++) for (j=1;j<=m;j++) { printf("b[%d][%d] = ",i,j); scanf("%f",&b[i][j]); } printf("\n"); printf("Ma tran b ban da nhap\n"); for (i=1;i<=l;i++) { for (j=1;j<=m;j++) printf("%10.5f",b[i][j]); printf("\n"); } flushall(); t=1; while (t) { printf("Co sua ma tran khong(c/k)?"); scanf("%c",&tl); if (toupper(tl)=='C') { printf("Cho chi so hang can sua : "); scanf("%d",&i); printf("Cho chi so cot can sua : "); scanf("%d",&j); printf("b[%d][%d] = ",i,j); scanf("%f",&b[i][j]); } if (toupper(tl)=='K') t=0; } printf("Ma tran b ban dau"); printf("\n"); for (i=1;i<=l;i++) { for (j=1;j<=m;j++) printf("%10.5f",b[i][j]); printf("\n"); } printf("\n"); for (i=1;i<=n;i++) for (j=1;j<=m;j++) { [...]... chúng ta đặt : (pbo ) =0 s b 2 = + b1 sbo s b3 = + b2 p b1 b2 s s s s b k = s ck 1 142 thì : co = bo c1 = b1 + sbo = b1 + sco c2 = b2 + sc1 - pco ck = bk + sck-1 - pck-2 cn-1 = bn-1 + scn-2 - pcn-3 (2) Nh- vậy c c hệ số c ng đ- c tính theo c ch nh- c c hệ số bk.Cuối c ng với f = bn-1 và g = bn ta đ- c: f f f = c n 2 = c n 3 = c n 1 s s s b c b n c n 3 s = n 1 n 2 c n 1 c n 3 c 2 2 n b c b n c. .. Nh vậy A p V là v c tơ riêng c a A ứng với 1 c n giá trị riêng 1 sẽ là: lim p A p +1V A pV = 1 Trong th c tế để tránh vợt quá dung lợng bộ nhớ khi 1 khá lớn ,c c vectơ Vk đ c chuẩn hoá sau mỗi b c bằng c ch chia c c phần tử c a nó cho phần tử lớn nhất mk và nhận đ c vectơ Vk Nh vậy c c b c tính sẽ là: - cho một vec tơ V bất kì (c thể là V = { 1,1,1, ,1}T) - tính V1 = AV và nhận đ c phần tử lớn nhất... (x2+0.9x+1.1)(x2 + 2x+3) Ch-ơng trình sau áp dụng lí thuyết vừa nêu để tìm nghiệm c a đa th c Chơng trình 8-10 //phuong phap Bairstow #include #include #include #include #define m 10 void main() { float a[m],b[m] ,c[ m]; int i,n,v; float s,e1,t,p,q,r,p1,q1; clrscr(); printf("Cho bac cua da thuc n = "); scanf("%d",&n); printf("Cho cac he so cua da thuc can tim nghiem\n");... ma trận c p n.Cho một ma trận A c p n,giá trị đ c gọi là giá trị riêng và vectơ X đ c gọi là vectơ riêng c a ma trận A nếu: AX = X (1) Vectơ riêng phải là vectơ kh c không.Tơng ứng với một giá trị riêng c vô số vectơ riêng.Nếu X là một v c tơ riêng tơng ứng với giá trị riêng thì cX c ng là vec t riênh ứng với .C nhiều thuật toán tìm giá trị riêng và vectơ riêng c a một ma trận.Giả sử ta c ma trận... b c b n c n 2 p = n 1 n 1 c n 1 c n 3 c 2 2 n f = c n 2 s (3) (4) Sau khi phân tích xong Pn(x) ta tiếp t c phân tích Pn-2(x) theo ph-ơng pháp trên C c b- c tính toán gồm : - Chọn c c giá trị ban đầu bất kì s0 và p0 - Tính c c giá trị bo, ,bn theo (1) - Tính c c giá trị co, ,cn theo (2) - Tính so và po theo (3) và (4) - Tính s1 = s0 + so và p1 = po+ po - Lặp lại b- c 1 cho đến khi pi+1 = pi = p và... ta c chơng trình sau: Chơng trình 9-5 #include #include #include #include #include #define max 50void main() { int i,j,k,n,t; char tl; float t0,t1,epsi,s; float a[max][max]; float x0[max],x1[max]; clrscr(); printf("Phuong phap lap luy thua tim tri rieng lon nhat\n"); printf("Cho so hang va cot cua ma tran n = "); scanf("%d",&n); printf("Cho cac phan tu cua... đ- c ch-ơng trình đ c vào nhờ thủ t c doc.Trong thủ t c này ,c c hệ số a[i,5] là c c hàm fi(x).Vectơ nghiệm ban đầu đ- c chọn là { 0,-1,-1,1}T.Kết quả tính cho ta : x = {0.01328676,-1.94647929,-1.12499779,8.05819031 }T với độ chính x c 0.000001.Vectơ số d- r = { 0.00000536,-0.00000011,-0.00000001,-0.00000006}T 147 Chơng trình 8-11 //giai he pt phi tuyen #include #include #include... biết Vi c chia đa th c Pn(x) cho tam th c Q2(x) đ-a tới kết quả : Pn(x) = Q2(x).Pn-2(x) + R1(x) với Pn(x) = aoxn + a1xn-1 + a2xn-2 + + an 2 140 Q2(x) = x2 - sx + p Pn-2(x) = boxn-2 + b1xn-3 + b2xn-4 + + bn-2 R1(x) = x + Để c đ- c một th-ơng đúng ,c n tìm c c giá trị c a s và p sao cho R1(x) = 0 (nghĩa là và triệt tiêu).Với s và p đã cho ,c c hệ số b c a đa th c Pn-2(x) và c c hệ số và đ- c tính... riêng tơng ứng Chơng trình lặp tìm c c giá trị riêng và vec tơ riêng c a ma trận nh sau: Chơng trình 9-6 #include #include #include #include #include #define max 50 void main() { float a[max][max],vv[max][max],at[max][max]; float x[max],y[max],vd[max]; int i,j,k,n,l,t; float vp,v1,z,epsi,va,ps; char tl; clrscr(); epsi=0.000001; printf("Cho bac cua ma tran... nhất c a một ma trận A Nếu ma trận A là th c và và mỗi trị riêng bội k c đủ k vec tơ riêng đ c lập tuyến tính thì vi c tính toán sẽ cho ta giá trị riêng lớn nhất Một vectơ V bất kì c thể đ c viết dới dạng: n V = v 1X1 + v 2 X 2 + + v n X n = v i X i (5) i =1 Trong đó X1,X2, ,Xn là c c vec tơ riêng tơng ứng với c c giá trị riêng 1,2,3, ,n và v1,v2,v3, ,vn là c c hằng số Khi nhân A với V ta c : . lớn ,c c vectơ V k đ c chuẩn hoá sau mỗi b c bằng c ch chia c c phần tử c a nó cho phần tử lớn nhất m k và nhận đ c vectơ V k Nh vậy c c b c tính. 116 Chơng 9 : C c vấn đề về ma trận Đ1.Định th c của ma trận Cho một ma trận vuông c p n.Ta c n tìm định th c của nó.Tr c hết chúng ta nh c lại

Ngày đăng: 19/01/2014, 22:20

Từ khóa liên quan

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

Tài liệu liên quan