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.

pdf35 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1720 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình C - Chương 9: Các vấn đề về ma trận, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdfGiao_Trinh_C_Chuong9_ma_tran.pdf