II. MỘT SỐ BÀI TOÁN GIẢI BẰNG GIẢI THUẬT ĐỆ QUY ĐIỂN HÌNH
5. Bài toán tìm nghiệm xấp xỉ của phương trình f(x)= 0
Bài toán : Hàm f(x) liên tục trên đoạn [ao,bo] , tìm một nghiệm xấp xỉ với độ chính xác ε trên [ao,bo] của phương trình f(x) = 0.
Ý tưởng của giải thuật :
- Trường hợp neo : bo - ao < ε
+ Nếu f(ao).f(bo) ≤ 0 thì hàm f có nghiệm trên [ao,bo] .Và vì ta đang tìm nghiệm xấp xỉ với độ chính xác ε nên ao là nghiệm xấp xỉ cần tìm .
+ Nếu f(ao).f(bo) > 0 thì ta xem như không có nghiệm xấp xỉ trên đoạn xét. - Trương hợp bo - ao ≥ ε thì chia đôi đoạn [ao,bo] rồi tìm lần lượt nghiệm trên từng đoạn con : đoạn con trái, đoạn con phải .
Ta sẽ xây dựng một hàm đệ qui trả về giá trị là nghiệm xấp xỉ của f (nếu có),hay một hằng E ( đủ lớn) nếu f không có nghiệm xấp xỉ trên [ao,bo] .
Kỹ thuật lập trình nâng cao - 26 -
a) Thông số hoá:
Xét hàm ROOT với 3 thông số là g , a,b ,(ROOT(g,a,b)) trả về giá trị nghiệm xấp xỉ ε của phương trình g(x) =0 trên đoạn [a,b] hoặc giá trị C nếu phương trình xét không có nghiệm xấp xỉ . Để giải bài toán ban đấu ta gọi hàm ROOT(f,ao,bo) .
b) Trường hợp tầm thường:
đó là khi b - a < epsilon . Khi đó :
if ( g(a).g(b) ) <= 0 then ROOT(g,a,b) = a ; // a là nghiệm xấp xỉ else ROOT(g,a,b) = E ; // không có nghiệm xấp xỉ
c) Phân rã trường hợp tổng quát:
khi b - a >= ε ta phân [a,b] làm 2 đoạn [a,c] và [c,b] với c = (a + b) / 2.
- Nếu ROOT(g , a ,c) < E thì ROOT(g , a , b ) = ROOT(g ,a ,c) (bài toán tìm nghiệm trên đoạn [a,c] ) .
- còn không thì ROOT(g , a , b ) = ROOT(g ,c ,b) (bài toán tìm nghiệm trên đoạn [c ,b] ) .
d) Hàm tìm nghiệm xấp xỉ trên NN Pascal có dạng:
const epsilon = ; E = ;
Function ROOT(a,b :real ) :real ; var c , R : real ;
begin
if ((b-a) < epsilon ) then if ( f(a)*f(b) <= 0 ) then ROOT := a else ROOT := L else
begin
c := (a + b)/2 ;
if ( ROOT(a ,c ) < E ) then ROOT := ROOT(a,c) else ROOT := ROOT(c,b) end;
e) Chương trình con tìm nghiệm xấp xỉ trong NN LT C++
const double epsilon = ; const double E = ; double ROOT(double a , double b )
{ if((b - a) < epsilon ) if(f(a)*f(b) <= epsilon return (a ) ; else return ( L ) ;
else
Kỹ thuật lập trình nâng cao - 27 -
double R = ROOT(a,c) ; if( R< E ) return R ;
else return ( ROOT(c , b) ) ; }
Kỹ thuật lập trình nâng cao - 28 -
CHƯƠNG III KHỬ ĐỆ QUY