在Fortran中使用非线性求解器:SNSQE - SLATEC

时间:2015-06-30 23:20:05

标签: segmentation-fault fortran fortran90 nonlinear-functions nonlinear-optimization

我试图弄清楚如何在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是使用相同的编译器从源代码编译的。

1 个答案:

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