我试图弄清楚如何在Fortran中调用求解器来求解一些n维非线性方程。我遇到过具有一些非线性求解器例程的SLATEC库,我尝试使用的是SNSQE。 (除此之外:也许你知道一些更好/更容易使用的求解器。请告诉我们!)
我的示例代码试图解决一个简单的二维问题。您可以手动解决它,但重点是弄清楚求解器的工作原理。代码在这里:
program test
implicit none
! declarations
real :: theta0, x0, d(2), theta_ss(2)
integer, parameter :: nprint=0, n=2, iopt=2, lwa = 180
integer :: info
real :: tol, fvec(2), jac(2), wa(lwa)
! set parameters
theta_ss = 3.
tol = .0000001
! make sure my function works
d = FNC(theta_ss)
write(*,*) theta_ss
write(*,*) d
! call the solver and write output
call SNSQE( FNC, jac, iopt, n, theta_ss, fvec, tol, nprint, info, wa, lwa )
write(*,*) theta_ss, fvec, tol, info
contains
function FNC(x)
real, intent(in) :: x(2)
real :: FNC(2)
FNC(1) = x(1)**2 - 1
FNC(2) = x(2)**3 - 10
end function FNC
end program test
我使用以下代码编译:
ifort -fast test_solver.f90 -o test -lslatec
我运行生成的可执行文件./test
并获取:
3.000000 3.000000
8.000000 17.00000
forrtl: severe (174): SIGSEGV, segmentation fault occurred
所以我的函数FNC独立工作,但不在SNSQE中。我的所有输入都是正确的类型和正确的顺序。我尝试过以不同的方式编写FNC功能。我不确定为什么它不起作用。
运行OSX - Yosemite,Intel Fortran编译器,SLATEC是使用相同的编译器从源代码编译的。
答案 0 :(得分:3)
用户提供的功能不是SNSQE
所期望的功能。从链接文件中的注释中可以看出FCN
必须是以下形式的子例程:
SUBROUTINE FCN(N,X,FVEC,IFLAG)
INTEGER N,IFLAG
REAL X(N),FVEC(N)
! ----------
! Calculate the functions at X and
! return this vector in FVEC.
! ----------
END SUBROUTINE