Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 30 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
30
Dung lượng
230,11 KB
Nội dung
87
Chơng 8 : Giải gần đúng phơng trình đại số
và siêu việt
Đ1.Khái niệm chung
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ìm giá 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ệm là 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.
Đ2.Phơng pháp lặp đơn
Giả sử phơng trình (1) đợc đa về dạng tơng đơng :
x = g(x) (2)
từ giá trị x
o
nào đó gọi là giá trị lặp đầu tiên ta lập dãy xấp xỉ bằng công thức :
x
n
= g(x
n-1
) (3)
với n = 1,2,
Hàm g(x) đợc gọi là hàm lặp.Nếu dãy x
n
khi n thì ta nói phép lặp (3) hội
tụ.
x
1
x
o
x
o
x
1
Hình a Hình b
Ta có định lí:Xét phơng pháp lặp (3),giả sử :
- [a,b] là khoảng phân li nghiệm của phơng trình (1) tức là của (2)
- mọi x
n
tính theo (3) đều thuộc [a,b]
- g(x) có đạo hàm thoả mãn :
88
bxa,1q)x(g <<<
(4)
trong đó q là một hằng số thì phơng pháp lặp (3) hội tụ
Ta có thể minh hoạ phép lặp trên bằng hình vẽ a và b.
Cách đa phơng trình f(x) = 0 về dạng x = g(x) đợc thực hiện nh sau:ta thấy f(x)
= 0 có thể biến đổi thành x = x + f(x) với 0.Sau đó đặt x + f(x) = g(x) sao cho điều
kiện (4) đợc thoả mãn.
Ví dụ:xét phơng trình
x
3
+ x - 1000 = 0
Sau bớc giải sơ bộ ta có nghiệm x
1
( 9,10 )
Nếu đa phơng trình về dạng:
x = 1000 - x
3
= g(x)
thì dễ thấy | g
'
(x) | > 1 trong khoảng ( 9,10 ) nên không thoả mãn điều kiện (4)
Chúng ta đa phơng trình về dạng
3
x1000x =
thì ta thấy điều kiện (4) đợc thoả mãn.Xây dựng dãy xấp xỉ
3
n1n
x1000x
=
+
với x
o
chọn bất kì trong ( 9,10 )
Trên cơ sở phơng pháp này chúng ta có các chơng trình tính toán sau:
Chơng trình giải phơng trình exp((1/3)*ln(1000-x)) với số lần lặp cho trớc
Chơng trình 8-1
//lap don
#include <conio.h>
#include <stdio.h>
#include <math.h>
void main()
{
int i,n;
float x,x0;
float f(float);
clrscr();
printf("Cho so lan lap n = ");
scanf("%d",&n);
printf("Cho gia tri ban dau cua nghiem x0 = ");
scanf("%f",&x0);
x=x0;
for (i=1;i<=n;i++)
x=f(x);
printf("Nghiem cua phuong trinh la :%.4f",x);
getch();
}
float f(float x)
{
float a=exp((1./3.)*log(1000-x));
return(a);
89
}
và chơng trình giải bài toán bằng phơng pháp lặp với sai số cho trớc
Chơng trình 8-2
//lap don
#include <conio.h>
#include <stdio.h>
#include <math.h>
void main()
{
int i;
float epsi,x,x0,y;
float f(float);
clrscr();
printf("Cho sai so epsilon = ");
scanf("%f",&epsi);
printf("Cho gia tri ban dau cua nghiem x0 = ");
scanf("%f",&x0);
x=x0;
y=f(x);
if (abs(y-x)>epsi)
{
x=y;
y=f(x);
}
printf("Nghiem cua phuong trinh la %.6f",y);
getch();
}
float f(float x)
{
float a=exp((1./3.)*log(1000-x));
return(a);
}
Cho giá trị đầu x
o
= 1.Kết quả tính toán x = 9.966555
Đ3.Phơng pháp chia đôi cung
90
Giả sử cho phơng trình f(x) = 0 với f(x)
liên tục trên đoạn [a,b] và f(a).f(b) < 0.Chia đoạn
[a,b] thành 2 phần bởi chính điểm chia (a + b)/2.
1.Nếu f((a+b)/2) = 0 thì = (a+b)/2
2.Nếu f((a+b)/2) 0 thì chọn [ a,(a + b)/2 ]
hay [ (a + b)/2,b ] mà giá trị hàm hai đầu trái dấu
và kí hiệu là [a
1
,b
1
].Đối với [a
1
,b
1
] ta lại tiến hành
nh [a,b]
Cách làm trên đợc mô tả trong chơng
trình sau dùng để tìm nghiệm của phơng trình :
x
4
+ 2x
3
- x - 1 = 0
trên đoạn [0,1]
Chơng trình 8-3
//chia doi cung
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define epsi 0.00001
void main()
{
float x0,x1,x2;
float y0,y1,y2;
float f(float);
int maxlap,demlap;
clrscr();
printf("Tim nghiem cua phuong trinh phi tuyen");
printf("\nbang cach chia doi cung\n");
printf("Cho cac gia tri x0,x1,maxlap\n");
printf("Cho gia tri x0 = ");
scanf("%f",&x0);
printf("Cho gia tri x1 = ");
scanf("%f",&x1);
printf("Cho so lan lap maxlap = ");
scanf("%d",&maxlap);
y0=f(x0);
y1=f(x1);
if ((y0*y1)>0)
{
printf("Nghiem khong nam trong doan x0 - x1\n");
printf(" x0 = %.2f\n",x0);
printf(" x1 = %.2f\n",x1);
printf(" f(x0) = %.2f\n",y0);
printf(" f(x1) = %.2f\n",y1);
}
demlap=0;
do
{
y
x
a
b
b
1
91
x2=(x0+x1)/2;
y2=f(x2);
y0=f(x0);
if (y0*y2>0)
x0=x2;
else
x1=x2;
demlap=demlap+1;
}
while(((abs((y2-y0))>epsi)||(demlap<maxlap)));
if (demlap>maxlap)
{
printf("Phep lap khong hoi tu sau %d lan lap ",maxlap);
printf(" x0 = %.2f\n",x0);
printf(" x1 = %.2f\n",x1);
printf(" f(x2) = %.2f\n",y2);
}
else
{
printf("Phep lap hoi tu sau %d lan lap\n",demlap);
printf("Nghiem x = %.2f",x2);
}
getch();
}
float f(float x)
{
float a=x*x*x*x+2*x*x*x-x-1 ;
return(a);
}
Kết quả tính cho nghiệm:x = 0.87
Đ4.Phơng pháp dây cung
Giả sử f(x) liên tục trên trên đoạn [a,b] và f(a).f(b) < 0.Cần tìm nghiệm của f(x) =
0.Để xác định ta xem f(a) < 0 và f(b) > 0.Khi đó thay vì chia đôi đoạn [a,b] ta chia [a,b] theo
tỉ lệ -f(a)/f(b).Điều đó cho ta nghiệm gần đúng :
x
1
= a + h
1
Trong đó
1
h
fa
fa fb
ba
=
+
()
() ()
()
Tiếp theo dùng cách đó với đoạn [ a,x
1
] hay [ x
1
,b] mà hai đầu hàm nhận giá trị trái
dấu ta đợc nghiệm gần đúng x
2
v.v.
Về mặ hình học,phơng pháp này có nghĩa là kẻ dây cung của đờng cong f(x) qua hai điểm
A[a,f(a)] và B[b,f(b)].Thật vậy phơng trình dây cung AB có dạng :
92
)a(f)b(f
)a(fy
ab
ax
−
−
=
−
−
Cho x = x
1
y = 0 ta cã
)ab(
)a(f)b(f
)a(f
a
x
1
−
−
−
=
Trªn c¬ së cña ph−¬ng ph¸p ta cã ch−¬ng tr×nh
tÝnh nghiÖm cña ph−¬ng tr×nh
x
4
+ 2x
3
- x - 1 = 0
trªn ®o¹n [0,1]
Ch−¬ng tr×nh 8-4
//phuong phap day cung
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define epsi 0.00001
void main()
{
float a,b,fa,fb,dx,x;
float f(float);
clrscr();
printf("Tim nghiem cua phuong trinh phi tuyen\n");
printf("bang phuong phap day cung\n");
printf("Cho cac gia tri a,b\n");
printf("Cho gia tri cua a = ");
scanf("%f",&a);
printf("Cho gia tri cua b = ");
scanf("%f",&b);
fa=f(a);
fb=f(b);
dx=fa*(b-a)/(fa-fb);
while (fabs(dx)>epsi)
{
x=a+dx;
fa=f(x);
if((fa*fb)<=0)
a=x;
else
b=x;
fa=f(a);
fb=f(b);
dx=fa*(b-a)/(fa-fb);
}
B
b
a x
1
ξ
A
93
printf("Nghiem x = %.3f",x);
getch();
}
float f(float x)
{
float e=x*x*x*x+2*x*x*x-x-1;
return(e);
}
Kết quả tính cho nghiệm:x = 0.876
Đ5.Phơng pháp lặp Newton
Phơng pháp lặp Newton (còn gọi là
phơng pháp tiếp tuyến) đợc dùng nhiều vì nó hội
tụ nhanh.Giả sử f(x) có nghiệm là đã đợc tách
trên đoạn [a,b] đồng thời f'(x) và f"(x) liên tục và
giữ nguyên dấu trên đoạn [a,b].Khi đã tìm đợc
xấp xỉ nào đó x
n
[a,b] ta có thể kiện toàn nó theo
phơng pháp Newton.Từ mút B ta vẽ tiếp tuyến với
đờng cong.Phơng trình đờng tiếp tuyến là
)xx)(b(f)x(fy
00
=
Tiếp tuyến này cắt trục hoành tại điểm có
y=0,nghĩa là :
)xx)(b(f)x(f
010
=
hay :
)x(f
)x(f
xx
0
0
01
=
Từ x
1
ta lại tiếp tục vẽ tiếp tuyến với đờng cong thì giao điểm x
i
sẽ tiến tới nghiệm của
phơng trình.
Việc chọn điểm ban đầu x
o
rất quan trọng.Trên hình vẽ trên ta thấy nếu chọn điểm
ban đầu x
o
= a thì tiếp tuyến sẽ cắt trục tại một điểm nằm ngoài đoạn [a,b].Chọn x
o
= b sẽ
thuận lợi cho việc tính toán.Chúng ta có định lí :
Nếu f(a).f(b) < 0 ; f(x) và f"(x) khác không và giữ nguyên dấu xác định khi x
[a,b]
thì xuất phát từ x
o
[a,b] thoả mãn điều kiện f(x
o
).f
(x
o
) > 0 có thể tính theo phơng pháp
Newton nghiệm
duy nhất với độ chính xác tuỳ ý.
Khi dùng phơng pháp Newton cần lấy x
o
là đầu mút của đoạn [a,b] để tại đó
f(x
o
).f"(x
o
) > 0.áp dụng lí thuyết trên chúng ta xây dựng chơng trình tính sau:
Chơng trình 8-5
//phuong phap Newton
#include <conio.h>
#include <stdio.h>
a
b=x
o
x
1
94
#include <math.h>
#include <stdlib.h>
#define n 50
#define epsi 1e-5
void main()
{
float t,x0;
float x[n];
int i;
float f(float);
float daoham(float);
clrscr();
printf("Tim nghiem cua phuong trinh phi tuyen\n");
printf("bang phuong phap lap Newton\n");
printf("Cho gia tri cua x0 = ");
scanf("%f",&x0);
i=1;
x[i]=x0;
do
{
x[i+1] = x[i]-f(x[i])/daoham(x[i]);
t = fabs(x[i+1]-x[i]);
x[i]=x[i+1];
i=i+1;
if (i>100)
{
printf("Bai toan khong hoi tu\n");
getch();
exit(1);
}
else
;
}
while (t>=epsi);
printf("Nghiem x = %.5f",x[i]);
getch();
}
float f(float x)
{
float a=x*x-x-2;
return(a);
}
float daoham(float x)
{
float d=2*x-1;
return(d);
95
}
Chơng trình này đợc dùng xác định nghiệm của hàm đã đợc định nghĩa trong
function.Trong trờng hợp này phơng trình đó là:x
2
- x -1 = 0.Kết quả tính với giá trị đầu x
o
= 0 cho nghiệm x = 2.
Đ6.Phơng pháp Muller
Trong phơng pháp dây cung khi tìm nghiệm trong đoạn [a,b] ta xấp xỉ hàm bằng
một đờng thẳng.Tuy nhiên để giảm lợng tính toán và để nghiệm hội tụ nhanh hơn ta có
thể dùng phơng pháp Muller.Nội dung của phơng pháp này là thay hàm trong đoạn [a,b]
bằng một đờng cong bậc 2 mà ta hoàn toàn có thể tìm nghiêm chín xác của nó.Gọi các
điểm đó có hoành độ lần lợt là a = x
2
,b = x
1
và ta chọn thêm một điểm x
0
nằm trong đoạn
[x
2
,x
1
].Gọi
h
1
= x
1
- x
0
h
2
= x
0
- x
2
v = x - x
0
f(x
0
) = f
0
f(x
1
) = f
1
f(x
2
) = f
2
1
2
h
h
=
Qua 3 điểm này ta có một đờng parabol :
y = av
2
+ bv + c
Ta tìm các hệ số a,b,c từ các giá trị đã biết v:
22
2
222
11
2
111
0
2
0
fcbhah)xx(hv
fcbhah)xx(hv
fc)0(b)0(a)xx(0v
=++==
=++==
=++==
Từ đó ta có :
0
1
2
101
2
1
201
fc
h
ahff
b
)1(h
f)1(ff
a
=
=
+
+
+
=
Sau đó ta tìm nghiệm của phơng trình av
2
+ bv + c = 0 và có :
ac4bb
c2
xn
2
02,1
=
Tiếp đó ta chọn nghiệm gần x
0
nhất làm một trong 3 điểm để tính xấp xỉ mới.Các điểm này
đợc chọn gần nhau nhất.
Tiếp tục quá trình tính đến khi đạt độ chính xác yêu cầu thì dừng lại.
Ví dụ:Tìm nghiệm của hàm f(x) = sin(x) - x/2 trong đoạn [1.8,2.2].Ta chọn x
0
= 2
Ta có : x
0
= 2 f(x
0
) = -0.0907 h
1
= 0.2
x
1
= 2.2 f(x
1
) = -0.2915 h
2
= 0.2
x
2
= 1.8 f(x
2
) = 0.07385 = 1
Vậy thì :
x
1
,f
1
x
0
,f
0
x
2
,f
2
av
2
+bv+c
f(x)
h
1
h
2
96
0907.0c
91338.0
2.0
2.0)45312.0()097.0(2915.0
b
45312.0
)11(2.01
07385.0)11()0907.0()2915.0(1
a
2
2
=
=
ì
=
=
+ìì
+
+
ì
ì
=
Ta có nghiệm gần x
0
nhất là :
89526.1
)0907.0()45312.0(4)91338.0(91338.0
)0907.0(2
0.2n
2
1
=
ìì
ì
=
Với lần lặp thứ hai ta có :
x
0
= 1.89526 f(x
0
) = 1.9184ì10
-4
h
1
= 0.10474
x
1
= 2.0 f(x
1
) = -0.0907 h
2
= 0.09526
x
2
= 1.8 f(x
2
) = 0.07385 = 0.9095
Vậy thì :
4
24
2
4
109184.1c
81826.0
10474.0
10474.0)4728.0(109184.10907.0
b
4728.0
9095.110474.09095.0
07385.09095.1)109184.1()0907.0(9095.0
a
ì=
=
ìì
=
=
ìì
+ììì
=
Ta có nghiệm gần x
0
nhất là :
89594.1
109184.1)4728.0(4)81826.0(81826.0
109184.12
89526.1n
42
4
1
=
ììì
ìì
=
Ta có thể lấy n
1
= 1.895494 làm nghiệm của bài toán
Chơng trình giải bài toán bằng phơng pháp Muller nh sau:
Chơng trình 8-6
//phuong phap Muller
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{
float x0,x1,x2,h1,h2,eps;
float a,b,c,gamma,n1,n2,xr;
int dem;
float f(float);
clrscr();
printf("PHUONG PHAP MULLER\n");
printf("\n");
printf("Cho khoang can tim nghiem [a,b]\n");
printf("Cho gia tri duoi a = ");
scanf("%f",&x2);
[...]... b k = s ck 1 co = bo c1 = b1 + sbo = b1 + sco (2) 108 c2 = b2 + sc1 - pco ck = bk + sck-1 - pck-2 cn-1 = bn-1 + scn-2 - pcn-3 Nh vậy cc hệ số c ng đ c tính theo c ch nh cc 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 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) cho (x - 1) cho ta Pn-1(x) và một nghiệm mới kh c đ c tìm theo c ch trên khi chọn một giá trị xo mới hay chọn chính xo = 1.Khi b c của đa th c giảm xuống c n bằng 2 ta dùng cc công th c tìm nghiệm c a tam th c để tìm cc nghiệm c n lại Ví dụ:tìm nghiệm c a đa th c P3(x) = x3 - x2 -16x + 24 a1 = -1 a2= -16 a3 = 24 ao = 1 Chọn xo = 3.5 ta c : Po = ao = 1 P1 = a1 + pox0 = -1 + 3.5*1 = 2.5 P2 = a2... (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");... riêng yk c thể đ c x c định từ n giá trị yk-1,yk-2, ,yn-1.Điều cho phép tính toán bằng c ch truy hồi cc nghiệm riêng c a phơng trình vi phân Để tính nghiệm lớn nhất c a đa th c, ta xuất phát từ cc nghiệm riêng y1 = 0,y1 = 0, ,yn =1 để tính yn+1 .C ch tính này đ c tiếp t c để tính yn+2 xuất phát từ y1 = 0,y2 = 0, ,yn+1 và tiếp t c cho đến khi yk+1/yk không biến đổi nữa.Trị số c a yk+n đ c tính theo c ng... th c mới Qn-1(x).Tiếp t c dùng phơng pháp Bernoulli để tìm nghiệm lớn nhất c a Qn-1(x).Sau đó lại tiếp t ccc b c trên cho đến khi tìm hết cc nghiệm c a Pn(x) Chúng ta khảo sát phơng trình phơng trình sai phân c dạng nh sau : (1) = aoyk+n + a1yk+n-1 + + anyk = 0 Đây là một phơng trình sai phân tuyên tính hệ số hằng.Khi cho tr ccc giá trị đầu yo,y1, yn-1 ta tìm đ ccc giá trị yn,yn+1, Chúng đ c. .. nghiệm c a phơng trình sai phân tuyến tính (1) Đa th c (2) Pn(x) = a0xn + a1xn-1 + +an-1x + an với c ng một hệ số ai nh (1) đ c gọi là đa th c đ c tính c a phơng trình sai phân tuyến tính (1).Nếu (2) c n nghiệm phân biệt x1,x2, ,xn thì (1) ccc nghiệm riêng là yi = xik Nếu yi là cc nghiệm c a phơng trình sai phân là tuyến tính (1),thì k k (3) y = c1 x1k + c2 x2 + +cn x n k với cc hệ số ci bất kì c 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à cc 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 113 #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 Q2(x) = x2 - sx + p 106 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 cc 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à cc hệ số và đ c tính bằng... t c phân tích Pn-2(x) theo phơng pháp trên Cc b c tính toán gồm : - Chọn cc giá trị ban đầu bất kì s0 và p0 - Tính cc giá trị bo, ,bn theo (1) - Tính cc 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. .. thuật tính trên Chơng trình 8-8 //phuong phap Birge-Viette #include #include #include #define max 20 102 void main() { float a[max],p[max],d[max],x[max]; int k,j,i,n; float e1,e2,x0,x1; clrscr(); printf("Cho bac cua da thuc n = "); scanf("%d",&n); e1=0.0001; printf("Cho cac he so cua da thuc can tim nghiem\n"); for (i=0;i .
1
.Khi b c của đa th c giảm
xuống c n bằng 2 ta dùng c c công th c tìm nghiệm c a tam th c để tìm c c nghiệm c n
lại.
Ví dụ:tìm nghiệm c a đa th c P
3
(x). (4)
Để x c định c c hệ số c a đa th c (4) ta thay (4) vào (3) và c n bằng c c hệ số với đa
th c cần tìm nghiệm P
n
(x) mà c c hệ số a
i
đã cho:
(x