program main
implicit none
double precision p, a, b, tol
a = 1.0d0
b = 30.0d0
tol = 1e-8
call newtonbisection(p, a, b, tol)
contains
function f(x)
implicit none
double precision x,f
f = SIN(X) - exp(-x)
end function
function fprime(x)
implicit none
double precision fprime, x
fprime = COS(x) + exp(-x)
end function
subroutine newtonbisection(p, a, b, tol)
implicit none
double precision p, a, b, tol
double precision f, fprime
double precision fb, fp, fp2
a = 1.0d0
b = 30.0d0
p = a
do
fb = f(b)
fp = f(p)
fp2 = fprime(p)
p = p - (fp/fp2)
if (p < a .or. p > b) then
p = (a+b) / 2.d0
end if
if (fp*fb < 0) then
a = p
else
b = p
end if
print*, "a, b, p, fp", a, b, p, fp
if (dabs(fp) < tol) then
exit
end if
end do
end subroutine
end program
当我编译(gfortran newtonbisection.f90)时,我遇到了以下错误:
newtonbisection.f90:(.text+0x76): undefined reference to 'f_'
newtonbisection.f90:(.text+0x8f): undefined reference to 'f_'
newtonbisection.f90:(.text+0xa8): undefined reference to 'fprime_'
collect2: ld returned 1 exit status
上次当我遇到类似问题时,将隐式无效并包含修复它们,但不是这次。为什么说f和fprime没有被定义?
答案 0 :(得分:2)
你不能把行放在
double precision f, fprime
进入子程序newtonbisection
。这意味着f
和fprime
将是外部函数,但它们不是,它们是主程序的内部函数。
删除该行。它没有位置,内部函数由于所谓的主机关联而看到其他函数,它们都包含在一个主机程序中。
此外,内部函数和子程序不需要重复implicit none
,主程序中的implicit none
在其中有效,因为它们包含在其中。