在fortran中,我有一个外部优化例程,它将function f(x)
和起点作为输入,并返回局部最小值。例如,如果函数名为minimum:
minimum(f,x0,xopt)
问题在于我需要最小化的函数取决于一些不属于最小化例程的其他参数:f(x,data)
。
我如何克服这个问题。 在matlab中我会使用匿名函数
g=@(x) f(x,data)
minimum(g, x0, xopt)
然而,正如我在fortran 90中所理解的那样,没有匿名功能。
感谢。
答案 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中使用过该功能,所以我可能错了。