Fortran使用附加参数最小化函数

时间:2014-10-10 10:20:42

标签: matlab fortran

在fortran中,我有一个外部优化例程,它将function f(x)和起点作为输入,并返回局部最小值。例如,如果函数名为minimum:

minimum(f,x0,xopt)

问题在于我需要最小化的函数取决于一些不属于最小化例程的其他参数:f(x,data)

我如何克服这个问题。 在matlab中我会使用匿名函数

g=@(x) f(x,data)

minimum(g, x0, xopt)

然而,正如我在fortran 90中所理解的那样,没有匿名功能。

感谢。

2 个答案:

答案 0 :(得分:5)

您不需要匿名功能。您的Matlab示例最后也不是匿名的,它的名称为g

Fortran内部函数在这里很有用(Fortran 2008功能,但在gfortran和ifort中受支持,在Solaris Studio中不受支持):

call minimum(g, x0, xopt)

contains

  real function g(x)
    real, intent(in) :: x
    g = f(x,data)
  end function

end

答案 1 :(得分:2)

你有正确的想法来自MATLAB,你可以创建另一个函数,在封装f时返回data的值。我想到了两种选择。

如果在编译时修复data,则可以将f包装在使用它的模块中:

Module Foo
    type(blah) :: data = ...
    Contains
        Real Function f(x)
          ! data is visible here.
        End Function f
End Module Foo

如果data通过用户输入或计算更具动态性,您可以定义一个返回data并从f内调用它的函数:

Real Function f(x)
  ...
  Type(blah), Save :: data
  Logical, Save :: data_not_loaded = .True.
  If data_not_loaded Then
    data = load_data(...)
    data_not_loaded = .False.
  End If
  ...
End Function f

除了load_data()函数之外,您还可以创建类似注册表的子例程,以便先在程序中设置data的值,然后从{{1}中检索data }}。但是,f中的逻辑不会发生太大变化。

可能还有一种使用过程指针的方法,但我从未在Fortran中使用过该功能,所以我可能错了。