Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 是否有一种方法可以在fortran'中隐式定义函数midprogram;_Function_Fortran_Gfortran_Subroutine - Fatal编程技术网

Function 是否有一种方法可以在fortran'中隐式定义函数midprogram;

Function 是否有一种方法可以在fortran'中隐式定义函数midprogram;,function,fortran,gfortran,subroutine,Function,Fortran,Gfortran,Subroutine,我想解决一些特征值问题。我正在使用gfortran。我编写了一个模块,其中包含二分法子例程。在我的程序中,我定义了长期(m,x)函数,该函数采用2D数组m和浮点x,并在x处输出m的特征多项式;i、 e.det(m-x Id)。二分法子例程的一个参数是一个函数f,它是一个实际输入和实际输出的函数。但是,我想将“部分应用”函数legal(m,41;输入到该子例程。有没有办法做到这一点,而不用在模块中明确定义此函数 我不能明确定义这个函数,因为我要对几个矩阵m执行这个过程。此外,我不能修改二分法的主体

我想解决一些特征值问题。我正在使用gfortran。我编写了一个模块,其中包含
二分法
子例程。在我的程序中,我定义了
长期(m,x)
函数,该函数采用2D数组
m
和浮点
x
,并在
x
处输出
m
的特征多项式;i、 e.det(m-x Id)。
二分法
子例程的一个参数是一个函数
f
,它是一个实际输入和实际输出的函数。但是,我想将“部分应用”函数
legal(m,41;
输入到该子例程。有没有办法做到这一点,而不用在模块中明确定义此函数


我不能明确定义这个函数,因为我要对几个矩阵
m
执行这个过程。此外,我不能修改
二分法的主体,因为我也将其用于一个实参数的函数。在Fortran中有办法解决这个问题吗?

正如@francescalus所指出的,您希望解决您的问题

Fortran使用内部过程部分支持闭包,因为内部过程可以访问周围范围内的所有变量。ª

假设你想用你的代码找到
M
的特征值,它可以这样构造

module bisection_and_linalg
    use iso_fortran_env, only: real64
    integer, parameter :: wp = real64
    implicit none(type, external)

    abstract interface
        real(wp) pure function real_function(x)
            real(wp), intent(in) :: x
        end function
    end interface

contains

    !> Find the root of f in the interval I
    real(wp) pure function bisect(f, I)
        procedure(real_function) :: f
        real(wp) :: I(2)
        ...
    end function

    !> Evaluate the characteristic polynomial of m at x
    real(wp) pure function secular(M, x)
        real(wp), intent(in) :: M(:, :), x

        ...
    end function

    !> Get eigenvalues
    real(wp) pure function eigenvalues(M)
        real(wp), intent(in) :: M(:, :)

        ...

        ! n.b. here you can use the bisection method to
        !   find your eigenvalues.
        bisect(f, ...)

    contains

        real(wp) pure function f(x)
            ! n.b. here you have your closure.
            !   M is captured from surrounding scope.
            f = secular(M, x)
        end function
    end function

end module


唯一需要注意的是,只要周围范围存在,内部程序就存在。因此,遗憾的是,不可能编写一个通用函数,该函数接受函数并通过使用内部过程返回指向该函数的部分应用版本的函数指针。但这不是你的问题


²也许最好返回一个实际的特征多项式。然后你可以推导出它,例如使用牛顿·拉弗森(Newton Raphson)而不是二分法。

你的意思是像一个?@francescalus准确地说,不可能将形式为“f(x)”(通过主机关联引用“m”)的包装器内部过程传递到“二分法”(bisection\u method)()'作为参数?@roygvib我解决了这个问题,用参数
m
定义了一个包装函数,并添加了一个setter子例程。如果它有助于解决这个问题,请告诉我。