我尝试用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
答案 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
这是一个很好的教训,使用隐式无无处不在。