Giáo trình C - Chương 9: Các vấn đề về 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.
y với một ph-ơng trình phi tuyến ta có công thức lặp : xi+1 = xi - f(xi)/f'(xi) hay f'(xi)(xi+1 - xi) = -f(xi) Với một hệ có hai ph-ơng trình,công thức lặp trở thành: 142 J(Xi)(Xi+1 - Xi) = -F(Xi) với Xi = { si,pi}T và Xi+1 = { si+1,pi+1}T )p,s(g )p,s(f )X(F ii ii i = iJ X f s f p g s g p ( )= ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ Quan hệ : J(Xi)∆X = -F(Xi) với ∆X = {si+1 - si,pi+1 - pi}T t-ơng ứng với một hệ ph-ơng trình tuyến tính hai ẩn số ∆s = si+1 - si và ∆p = pi+1 - pi : ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ f s s f p p f s p g s s g p p g s p i i i i ∆ ∆ ∆ ∆ + = + = ⎧ ⎨ ⎪⎪⎪ ⎩ ⎪⎪⎪ − − ( ) ( ) , , Theo công thức Cramer ta có : ∆s f g p g f p= − +∂∂ ∂ ∂ δ ∆p g f s f g s= − +∂∂ ∂ ∂ δ δ ∂∂ ∂ ∂ ∂ ∂ ∂ ∂= − f s g p f p g s Để dùng đ-ợc công thức này ta cần tính đ-ợc các đạo hàm ∂∂ f s , ∂∂ f p , ∂∂ g s , ∂∂ g p .Các đạo hàm này đ-ợc tính theo công thức truy hồi. Do bo = ao nên ob s ∂ ∂ =0 ob p ∂ ∂ =0 b1 = a1 + sbo nên 1∂∂ b s bo = 1 0∂∂ b p = b2 = a2 + sb1- pbo nên 2 2 1∂∂ ∂ ∂ ∂ ∂ ∂ ∂ b s a s sb s pb s o= + − ( ) ( ) Mặt khác : 2 0∂∂ a s = 1 1 1 ∂ ∂ ∂ ∂ ( )sb s s b s b= + opb s ∂ ∂ ( ) =0 nên : 2 1 ∂ ∂ b s b sbo = + b3 = a3 + sb2- pb1 nên 3 2 2 1∂∂ ∂ ∂ ∂ ∂ b s b s b s p b s = + − Nếu chúng ta đặt : k k b s c ∂ ∂ = −1 143 thì : co = bo (2) c1 = b1 + sbo = b1 + sco c2 = b2 + sc1 - pco .................... ck = bk + sck-1 - pck-2 cn-1 = bn-1 + scn-2 - pcn-3 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: 2n1n3n2n cs f c s f c s f c s f −−−− =∂ ∂=∂ ∂=∂ ∂=∂ ∂ 2 2n3n1n 3nn2n1n ccc cbcb s −−− −−− − −=∆ (3) 2 2n3n1n 2nn1n1n ccc cbcb p −−− −−− − −=∆ (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à si+1 = si = s - Giải ph-ơng trình x2 - sx + p để tìm 2 nghiệm của đa thức - Bắt đầu quá trình trên cho đa thức Pn-2(x) Ví dụ : Tìm nghiệm của đa thức P4(x) = x4 - 1.1x3 + 2.3x2 + 0.5x2 + 3.3. Với lần lặp ban đầu ta chọn s = -1 và p =1,nghĩa là tam thức có dạng x2 + x + 1 a0 a1 a2 a3 a4 1 -1.1 2.3 0.5 3.3 sbi -1 2.1 -3.4 0.8 -pbi-1 -1 2.1 -3.4 bi 1 -2.1 3.4 -0.8 = bn-1 0.7=bn sbi -1.0 3.1 -5.5 -pbi-1 -1.0 3.1 ci 1 -3.1 5.5 -3.2 11.0 5.52.3 1.35.5 5.57.0 1.38.0 s = − − − − =∆ 06.0 5.52.3 1.35.5 7.02.3 8.05.5 p = − − −=∆ 144 s* = -1 + 0.11 = -0.89 p* = 1 + 0.06 = 1.06 Tiếp tục lặp lần 2 với s1 = s* và p1 = p* ta có : a0 a1 a2 a3 a4 1 -1.1 2.3 0.5 3.3 sbi -0.89 1.77 -2.68 0.06 -pbi-1 -1.06 2.11 -3.17 bi 1 -1.99 3.01 -0.07 = bn-1 0.17=bn sbi -0.89 2.56 -4.01 -pbi-1 -1.0 3.1 ci 1 -2.88 4.51 -1.03 01.0 51.403.1 88.251.4 5.57.0 88.207.0 s −= − − − − =∆ 04.0 51.403.1 88.251.4 17.003.1 07.051.4 p = − − −−=∆ s* = -0.89 - 0.01 = -0.9 p* = 1.06 + 0.04 = 1.1 Nh- vậy P4(x) = (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"); for (i=n;i>=0;i--) { 145 printf("a[%d] = ",n-i); scanf("%f",&a[i]); } printf("\n"); e1=0.0001; if (n<=2) if (n==1) { printf("Nghiem cua he\n"); printf("%.8f",(a[0]/(-a[1]))); getch(); exit(1); } do { v=0; p=1; q=-1; b[n]=a[n]; c[n]=a[n]; do { b[n-1]=b[n]*p+a[n-1]; c[n-1]=b[n-1]+b[n]*p; for (i=n-2;i>=0;i--) { b[i]=b[i+2]*q+b[i+1]*p+a[i]; c[i]=c[i+2]*q+c[i+1]*p+b[i]; } r=c[2]*c[2]-c[1]*c[3]; p1=p-(b[1]*c[2]-b[0]*c[3])/r; q1=q-(b[0]*c[2]-b[1]*c[1])/r; if ((fabs(b[0])<e1)&&(fabs(b[1])<e1)) goto tt; v=v+1; p=p1; q=q1; } while (v<=40); if(v>40) { printf("Khong hoi tu sau 40 lan lap"); getch(); exit(1); } tt:s=p1/2; t=p1*p1+4*q1; if(t<0) { printf("Nghiem phuc\n"); 146 printf("%.8f+%.8fj\n",s,(sqrt(-t)/2)); printf("%.8f-%.8fj\n",s,(sqrt(-t)/2)); printf("\n"); } else { printf("Nghiem thuc\n"); printf("%.8f\n",(s+sqrt(t)/2)); printf("%.8f\n",(s-sqrt(t)/2)); printf("\n"); } for (i=2;i<=n;i++) a[i-2]=b[i]; n=n-2; } while ((n>2)&(r!=0.0)); s=-a[1]/(2*a[2]); t=a[1]*a[1]-4*a[2]*a[0]; if (t<0) { printf("Nghiem phuc\n"); printf("%.8f+%.8fj\n",s,(sqrt(-t)/(2*a[2]))); printf("%.8f-%.8fj\n",s,(sqrt(-t)/(2*a[2]))); printf("\n"); } else { printf("Nghiem thuc\n"); printf("%.8f\n",(s-sqrt(t)/(2*a[2]))); printf("%.8f\n",(s-sqrt(t)/(2*a[2]))); printf("\n"); } getch(); } Dùng ch-ơng trình trên để xác định nghiệm của đa thức : x6 - 2x5 - 4x4 + 13x3 - 24x2 + 18x - 4 = 0 ta nhận đ-ợc các nghiệm : x1 = 2.61903399 x2 = -2.73205081 x3 = 0.732050755 x4 = 0.381966055 x5 = 0.500011056 + i*1.3228881 x6 = 0.500011056 - i*1.3228881 Đ11.Hệ ph−ơng trình phi tuyến Ph-ơng pháp Newton có thể đ-ợc tổng quát hoá để giải hệ ph-ơng trình phi tuyến dạng : 147 ⎪⎪ ⎪ ⎩ ⎪⎪ ⎪ ⎨ ⎧ = = = = 0)x,...,x,x,x(f ............................... 0)x,...,x,x,x(f 0)x,...,x,x,x(f 0)x,...,x,x,x(f 2321n 23213 23212 23211 hay viết gọn hơn d-ới dạng : F(X) = 0 Trong đó : X = (x1,x2,x3,.....,xn) Với một ph-ơng trình một biến,công thức Newton là : i i i i x x f x f x+ = −1 ( ) '( ) hay : f'(xi).∆x = -f(xi) với ∆x = xi+1 - xi Đối với hệ,công thức lặp là : J(Xi)∆x = -F(Xi) Trong đó J(Xi) là toán tử Jacobi.Nó là một ma trận bậc n ( n - t-ơng ứng với số thành phần trong vectơ X) có dạng : i n n n n n n n J x f x f x f x f x f x f x f x f x f x f x f x f x ( ) . . .............. .............. .............. = 1 1 1 2 1 3 1 2 1 2 2 2 3 2 1 2 3 ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ và ∆X = Xi+1 - Xi Ph-ơng pháp Newton tuyến tính hoá hệ và nh- vậy với mỗi b-ớc lặp cần giải một hệ ph-ơng trình tuyến tính (mà biến là ∆xi) xác định bởi công thức lặp cho tới khi vectơ X(x1,x2,x3,.....,xn) gần với nghiệm. D-ới đây là ch-ơng trình giải hệ ph-ơng trình phi tuyến 1 3 2 3 1 2 4 1 2 3 4 1 2 3 1 2 3 4 3 8 0 5 0 25 8 4 0 2 8 0 x x x x x x x x x x x x x x x − − = + + + − = − + + = − + = −⎧ ⎨ ⎪⎪⎪ ⎩ ⎪⎪⎪ Ma trận đạo hàm riêng J(xi)là : 1 2 2 4 2 2 1 4 1 2 1 2 3 2 3 2 3 3 3 3 3 0 3 1 1 1 1 25 0 8 0 2 2 2 1 1 2 x x x x x x x x x x x x x x x x − − − − − − −⎛ ⎝ ⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜ ⎞ ⎠ ⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟ Ma trận này đ-ợ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. 148 Ch−ơng trình 8-11 //giai he pt phi tuyen #include #include #include #include #define n 4 float a[n+1][n+2]; float x[n+1],y[n+1]; int i,j,k,l,z,r; float e,s,t; void main() { void doc(); clrscr(); printf("Cho cac gia tri nghiem ban dau\n"); for (i=1;i<=n;i++) { printf("x[%d] = ",i); scanf("%f",&x[i]); } e=1e-6; z=30; for (r=1;r<=z;r++) { doc(); for (k=1;k<=n-1;k++) { s=0 ; for (i=k;i<=n;i++) { t=fabs(a[i][k]); if (s<=t) { s=t; l=i; } } for (j=k;j<=n+1;j++) { s=a[k][j]; a[k][j]=a[l][j]; a[l][j]=s; } if (a[1][1]==0) { 149 printf("Cac phan tu duong cheo cua ma tran bang khong"); getch(); exit(1); } else { if (fabs(a[k][k]/a[1][1])<(1e-08)) { printf("Ma tran suy bien"); goto mot; } } for (i=k+1;i<=n;i++) { if (a[k][k]==0) { printf("Cac phan tu duong cheo cua ma tran bang khong\n"); goto mot; } s=a[i][k]/a[k][k]; a[i][k]=0; for (j=k+1;j<=n+1;j++) a[i][j]=a[i][j]-s*a[k][j]; } y[n]=a[n][n+1]/a[n][n]; for (i=n-1;i>=1;i--) { s=a[i][n+1]; for (j=i+1;j<=n;j++) s=s-a[i][j]*y[j]; if (a[i][i]==0) { printf("Cac phan tu duong cheo cua ma tran bang khong\n"); goto mot; } y[i]=s/a[i][i]; } } if (r!=1) for (i=1;i<=n;i++) { if (fabs(y[i])<e*fabs(x[i])) goto ba; } for (i=1;i<=n;i++) x[i]=x[i]-y[i]; printf("\n"); } 150 printf("Khong hoi tu sau %d lan lap\n",z); goto mot; clrscr(); ba:printf("Vec to nghiem\n"); for (i=1;i<=n;i++) printf("%.5f\n",(x[i]-y[i])); printf("\n"); printf("Do chinh xac cua nghiem la %.5f: \n", e); printf("\n"); printf("Vec to tri so du :\n"); for (i=1;i<=n;i++) printf("%.5f\n",(a[i][n+1])); mot:printf("\n"); getch(); } void doc() { a[1][1]=3*x[1]*x[1]-3*x[2]*x[4]; a[1][2]=-3*x[2]*x[2]-3*x[1]*x[4]; a[1][3]=0; a[1][4]=-3*x[1]*x[2]; a[1][5]=x[1]*x[1]*x[1]-x[2]*x[2]*x[2]-3*x[1]*x[2]*x[4]-8; a[2][1]=1; a[2][2]=1; a[2][3]=1; a[2][4]=1; a[2][5]=x[1]+x[2]+x[3]+x[4]-5; a[3][1]=-x[1]/sqrt(25-x[1]*x[1]); a[3][2]=0; a[3][3]=8; a[3][4]=0; a[3][5]=sqrt(25-x[1]*x[1])+8*x[3]+4; a[4][1]=2*x[2]*x[3]; a[4][2]=2*x[1]*x[3]; a[4][3]=2*x[1]*x[2]; a[4][4]=-1; a[4][5]=2*x[1]*x[2]*x[3]-x[4]+8; }
File đính kèm:
- Giao_Trinh_C_Chuong9_ma_tran.pdf