求助fortran程設高手寫二分法求實數根
剛剛入門一點也摸不到頭緒
希望有高手能夠指點迷津
如果有程式碼能夠參考的話感激不盡><
(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