0

我想弄清楚如何在Fortran中調用求解器來求解一些n維非線性方程。我遇到了具有一些非線性求解例程的SLATEC庫,我嘗試使用的庫是SNSQE。 (旁白:也許你知道一些更好/更容易使用的解算器,請告訴!)在Fortran中使用非線性求解器:SNSQE - SLATEC

我的示例代碼試圖解決一個簡單的二維問題。你可以手工解決它,但重點是找出解算器的工作原理。代碼在這裏:

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,英特爾Fortran編譯器,SLATEC是使用相同編譯器從源代碼進行編譯的。

回答

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 
相關問題