2016-09-08 112 views
1

我試圖實現二分法與Fortran 90的得到解決,精確到10^-5的3倍 - E 1 X = 0 1 < = X < = 2二分法不收斂

這是我想出的代碼,但是當我運行代碼時,它僅僅列出了.1.5000000000000000次。

我應該如何解決這個問題,以便我可以繼續正確應用二分法,直到我得到10^-5左右的數字?

program main 
implicit none 
double precision a,b, TOL 
integer maxN 
a = 1.d0 
b = 2.d0 
TOL = .000001d0 
maxN = 100 
call bisection(a, b, TOL, maxN) 
end program 

function f(x) 
double precision x,f 
f = 3*x - e**x 
end function 

subroutine bisection(a, b, TOL,maxN) 
implicit none 
double precision a, b, TOL 
integer maxN 

double precision p, fp, fa, fb, f 
integer j 

p = (a+b)/2.d0 
do j =1, maxN 
fp = f(p) 
fa = f(a) 
fb = f(b) 

    if (0.5d0 * (b-a) < TOL) then 
      print *, "Reach desired tolerance",p 
      return 

    end if 

    if (fa*fp <0) then 
      b = p 
    else if (fb*fp < 0) then 
      a = p 
    end if 

    p = (a+b)/2.d0 
    print *,j,p 
end do 
end subroutine bisection 
+0

歡迎使用StackOverflow。對所有Fortran問題使用標籤fortran。必要時添加特定版本。請注意,Fortran 90是一個25年的舊版本。 –

+0

在代碼中使用更多的縮進也是很好的選擇。 –

回答

4

的問題,其實並不是你的算法,而是你如何計算f。由於您沒有在函數中指定implicit none,因此編譯器允許e**x滑過,即使Fortran沒有按照您的意願定義e

當你糾正的功能如下,該程序正常工作:

function f(x) 
    implicit none 
    double precision x,f 
    f = 3*x - exp(x) 
end function f 

這是使用隱式的無到處一個很好的教訓。