二分法不收敛

时间:2016-09-08 06:41:54

标签: fortran bisection

我尝试用Fortran 90实现Bisection方法来获得解,精确到10 ^ -5以内3x-e ^ x = 0 for 1< = x< = 2

这是我想出的代码,但是当我运行代码时,它只列出了.1.5000000000000000 100次。

我应该如何修复此代码,以便我可以继续正确应用二分法,直到达到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

1 个答案:

答案 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

这是一个很好的教训,使用隐式无无处不在