Bài toán tìm nghiệm xấp xỉ của phương trình f(x)= 0

Một phần của tài liệu Kỹ thuật lập trình (Trang 25 - 28)

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

Một phần của tài liệu Kỹ thuật lập trình (Trang 25 - 28)

Tải bản đầy đủ (PDF)

(108 trang)