📚 知識家圖書館 奇摩知識+ 紀念館

求助fortran程設高手寫二分法求實數根

發問者 Alex Hsia (Lv.1) ・2009 年 4 月 4 日 ・程式設計

剛剛入門一點也摸不到頭緒 希望有高手能夠指點迷津 如果有程式碼能夠參考的話感激不盡>< (x - 1/3)(x - √3)(x - π)=0 利用二分法求其所有實數根 1. 確定n 個正實數根的範圍 [0 , 0.5] [0.5 , 1.0] [1.0 , 1.5]….. 2. 誤差小於5*10^(-4)

1 則回答

最佳解答
對函數 f(x),若 f(x1) 與 f(x2) 正負號相異,則在區間 [x1, x2] 內 f(x)=0 至少有一實數解。 更精確的說法應該是:若 f(x1) 與 f(x2) 正負號相異,則在區間 [x1, x2] 內 f(x)=0有奇數個實數解;若 f(x1) 與 f(x2) 正負號相同,則在區間 [x1, x2] 內 f(x)=0無解,或者有偶數個實數解。 至於取樣區間(即 x2-x1 的值)該設成多大,使得上述情形能簡化為:「若 f(x1) 與 f(x2) 正負號相異,則在區間 [x1, x2] 內 f(x)=0恰好有一實數解;若 f(x1) 與 f(x2) 正負號相同,則在區間 [x1, x2] 內 f(x)=0無解。」其實是程式師應該以「試誤法」去找出來的份內工作,不過在題目中既然已告訴我們取樣區間大小 = 0.5,就可以讓我們省事不少(初級班才有這種好康啦!)。 二分法的運作很簡單:取 x1、x2 的中點並代入函數中,若 f((x1+x2)/2) 與 f(x1) 同號,表示實根在中點與 x2 之間,可將中點設為新的 x1;反之,異號表示實根在中點與 x1 之間,可將中點設為新的 x2。一直重複這個動作,每次都可以將範圍縮小一半,直到 x2-x1 小於容許誤差,就找到一個實根的近似值了。 程式實作如下: program bisection integer nroot real a1, a2, a3, v, x1, x2 common a1, a2, a3 a1 = 1./3. a2 = sqrt(3.) a3 = 3.1415927 nroot = 0 v = .5 x1 = 0. 1x2 = x1 + v if (func(x1)*func(x2) < 0) then nroot = nroot + 1 write (*,*) 'Root', nroot, ' =', root (x1, x2) end if x1 = x1 + v if (nroot < 3) go to 1 stop end program bisection !-------------------------------------------------------- real function func(x) real x, a1, a2, a3 common a1, a2, a3 func = (x-a1) * (x-a2) * (x-a3) return end function func !-------------------------------------------------------- real function root (xx1, xx2) real xx1, xx2, x1, x2 x1 = xx1 x2 = xx2 1root = (x1+x2)/2. if (x2-x1 < 5e-4) return if (func(x1)*func(root) > 0) then x1 = root else x2 = root endif go to 1 end function root 執行結果: Root 1 = 0.333252 Root 2 = 1.73218 Root 3 = 3.14136
Jack(Lv.5) 2009 年 4 月 4 日

電腦與網際網路的其他問題