2013-05-29 6 views
0

Я работаю над преобразованием своих программ MATLAB в Fortran (хотя все еще пользуюсь некоторыми функциями MATLAB). Я пытаюсь использовать подпрограммы, доступные в IMSL. Он предоставляет решение нелинейного уравнения, neqnf, но мне не удалось выяснить, как проходить переменные, которые меняются в зависимости от того, когда вызывается подпрограмма (например, как вы можете с fsolve в MATLAB). Например, ниже представлена ​​mexFunction для MATLAB, написанная в Fortran, которая вызывает neqnf. Подпрограмма, sub, содержит систему уравнений, которую нужно решить. Как передать переменные через neqnf в sub для коэффициентов и перехватов двух линейных уравнений?Как переносить переменные в решатель нелинейного уравнения Fortran IMSL neqnf?

Спасибо!

#include "fintrf.h" 
#include "link_fnl_shared.h" 
subroutine mexFunction(nlhs, plhs, nrhs, prhs) 
    ! Declarations 
    use NEQNF_INT 
    implicit none 
    external sub 

    ! mexFunction arguments 
    mwPointer plhs(*), prhs(*) 
    integer*4 nlhs, nrhs 

    ! mex declarations 
    mwpointer mxGetPr,mxCreateNumericArray 
    integer*4 mxClassIDFromClassName 

    ! Internal variables 
    integer*4 myclassid 

    ! Output variables 
    mwpointer :: f_pr,x_pr 
    double precision :: f(2),x(2) 

    ! Create return arguments and assign pointers 
    myclassid = mxClassIDFromClassName('double') 
    plhs(1) = mxCreateNumericArray(1,2,myclassid,0) 
    plhs(2) = mxCreateNumericArray(1,2,myclassid,0) 
    f_pr = mxGetPr(plhs(1)) 
    x_pr = mxGetPr(plhs(2)) 

    ! Test nonlinear solver (Math.pdf, pg. 1238) 
    call d_neqnf(sub,x) 

    ! Assign output 
    call mxCopyReal8toPtr(f,f_pr,2) 
    call mxCopyReal8toPtr(x,x_pr,2) 

end subroutine mexFunction 

! Subroutine 
subroutine sub(x,f,n) 
    mwSize n 
    double precision :: x(n) ! input 
    double precision :: f(n) ! output 
    f(1) = 2.d0*x(1) + 1 
    f(2) = -1.d0*x(2) + 4 
end subroutine sub 

ответ

0

Чтобы получить переменные в суб, вы можете использовать модуль, чтобы объявить несколько переменных, а затем «использовать» модуль в суб и основную программу. Таким образом, вы можете изменить переменные в основной подпрограмме (или получить переменные из Matlab), а затем получить доступ к ним в суб.

Почему вы конвертируете в fortran? Скорость выполнения?

Кроме того, если вы делаете много такого типа конвертирования, рассмотрите возможность использования matlab2fmex при обмене файлами. Он может сделать много занятой работы по преобразованию числового кода matlab в fortran для вас.

+0

ОК, спасибо за предложение! Я рассмотрю использование модулей. Итак, в основном, что вы предлагаете, я могу установить параметры в модуле, в котором я могу обновить их значения в основной программе перед вызовом sub? Это похоже на глобальные переменные в MATLAB. Я привык не использовать глобальные переменные и вместо этого решил явно передать переменные в функции из основного сценария. – nathrock

+0

Я определил места в моих сценариях MATLAB, которые очень медленные. Например, в одной точке итерации в моей программе много интерполяции аппроксимирующей функции. Я обнаружил, что программирование цикла для выполнения интерполяции намного быстрее в Фортране, чем в MATLAB. Как правило, петли, как правило, медленны в MATLAB. Я также обнаружил, что OpenMP - превосходная альтернатива партитуре MATLAB. Основным недостатком до сих пор является отладка кода Fortran; очень легко выявить проблемы со сценариями в MATLAB. – nathrock

Смежные вопросы