Giáo trình C - Chương 8: Giải gần đúng phương trình đại số và siêu việt

Nếu ph-ơng trình đại số hay siêu việt khá phức tạp thì ít khi tìm đ-ợc nghiệm

đúng.Bởi vậy việc tìm nghiệm gần đúng và -ớc l-ợng sai số là rất cần thiết.

 Ta xét ph-ơng trình :

f(x) = 0 (1)

với f(x) là hàm cho tr-ớc của biến x.Chúng ta cần tìmgiá trị gần đúng của nghiệm của

ph-ơng trình này.

 Quá trình giải th-ờng chia làm hai b-ớc: b-ớc sơ bộ và b-ớc kiện toàn nghiệm.

B-ớc giải sơ bộ có 3 nhiệm vụ:vây nghiệm, tách nghiệm và thu hẹp khoảng chứa

nghiệm.

 Vây nghiệm là tìm xem các nghiệm của ph-ơng trình có thể nằm trên những đoạn

nào của trục x.Tách nghiệm là tìm các khoảng chứa nghiệm soa cho trong mỗi khoảng chỉ

có đúng một nghiệm.Thu hẹp khoảng chứa nghiệmlà làm cho khoảng chứa nghiệm càng

nhỏ càng tốt.Sau b-ớc sơ bộ ta có khoảng chứa nghiệm đủ nhỏ.

B-ớc kiện toàn nghiệm tìm các nghiệm gần đúng theo yêu cầu đặt ra.

 Có rất nhiều ph-ơng pháp xác định nghiệm của (1).Sau đây chúng ta xét từng ph-ơng

pháp.

pdf30 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1925 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình C - Chương 8: Giải gần đúng phương trình đại số và siêu việt, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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: 
 J(Xi)(Xi+1 - Xi) = -F(Xi) 
với Xi = { si,pi}
T và Xi+1 = { si+1,pi+1}
T
108
)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
thì : co = bo (2) 
 c1 = b1 + sbo = b1 + sco 
109
 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) = x
4 - 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 =
−
−
−=∆ 
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ó : 
110
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--) 
 { 
 printf("a[%d] = ",n-i); 
 scanf("%f",&a[i]); 
 } 
 printf("\n"); 
111
 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"); 
 printf("%.8f+%.8fj\n",s,(sqrt(-t)/2)); 
 printf("%.8f-%.8fj\n",s,(sqrt(-t)/2)); 
 printf("\n"); 
 } 
112
 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 : 
⎪⎪
⎪
⎩
⎪⎪
⎪
⎨
⎧
=
=
=
=
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 
113
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. 
Ch−ơng trình 8-11 
//giai he pt phi tuyen 
#include 
#include 
114
#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) 
 { 
 printf("Cac phan tu duong cheo cua ma tran bang khong"); 
 getch(); 
 exit(1); 
 } 
 else 
 { 
115
 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"); 
 } 
 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])); 
116
 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_Chuong8_PT.pdf