【发布时间】:2016-06-08 23:09:26
【问题描述】:
这个问题是我之前的问题Implementing minimization method 的后续问题。在当前问题中,我简化了我的问题,这里是示例 MATLAB 代码。我想在 Fortran 中实现它。
%Script script1.m
clear vars;
close all;
clc;
fun1 = @(x1,x2) 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10;
lower = -2;
upper = 0;
fun5 = fun15(fun1);
%fun5 is 'intermediate' function
%calling minimization function
[location,value]=minimize1(fun5,lower,upper)
在 script1.m 中,我创建了一个函数句柄 fun1 并希望为其分配值,如 fun15.m 所示
%fun15.m
function fun2 = fun15( fun1 )
arr1 = [4,5];
arr2 = [-2,3];
fun2 = @(a) fun1( ( arr1(1) + a*arr2(1)) , ( arr1(2) + a*arr2(2)));
%fun2 = @(a) @(x4,y4,x5,y5) 3*(x4+a*x5)^2 + 4*(y4+a*y5)^2 + 5*(x4+a*x5) + 6*(y4+a*y5) + 10; .....(1)
end
代替文件fun15.m,很可能创建一个闭包,如(1)所示。在这里,arr1 = [x4,y4] 和 arr2=[x5,y5]。我们可以首先传递x4,y4,x5,y5 的值,它会在变量a 中返回一个函数。这个返回的函数被传递给下面的最小化函数。
%minimize1.m
function [loc,val] = minimize1 (fun1,lower,upper)
c1 = 1; %counter
x_1 = lower + (upper-lower)*0.382; %lower value
x_2 = lower + (upper-lower)*0.618; %upper value
f_1 = fun1(x_1); %fun1 is passed in the arguments
f_2 = fun1(x_2);
x_lower=lower;
x_upper=upper;
locx=0;
while c1<10
if (f_1 > f_2)
x_lower = x_1;
x_1=x_2;
f_1=f_2;
x_2 = x_lower + (x_upper-x_lower)*0.618;
f_2 = fun1(x_2);
else
x_upper = x_2;
x_2 = x_1;
f_2 = f_1;
x_1 = x_lower + (x_upper-x_lower)*0.382;
f_1 = fun1(x_1);
end
c1=c1+1;
end
locx=(x_lower + x_upper)/2.0;
val = fun1(locx);
end
如何将其转换为 Fortran - 特别是函数返回函数? Fortran 不支持Anonymous 函数(C++11 支持它作为 lambda,ALGOL 68 也支持)。在Modern Fortran(90,95,03,08)中是否可以实现这个问题?
【问题讨论】:
-
您使用的是什么版本的 Fortran。您可以将指针传递给最新标准(我相信是 Fortran 2003 及更高版本)中的过程
-
@s8129 正确,您可以通过函数指针或创建接口(或在旧 fortran 中使用
external)将函数传递给另一个函数。但是如何从函数中获取函数输出似乎是更大的问题。 -
@VladimirF 我同意 roygvib,“原始”问题没有讨论完整代码。在这个问题中,我有完整而具体的代码,也描述了闭包。另一个问题没有类似的东西。 Stackoverflow 不应该是找出每个问题之间的相似之处并标记每个可能的重复项的地方。主要是注意为这个问题和其他问题提供的答案。阅读此问题的人肯定会受益于 IanH 提供的详细代码。其他问答的深度与本次问答的深度不匹配。
-
在我看来,这是完全重复的。甚至伊恩的答案也以与这两个答案完全匹配的两点开始。顺便说一句,当您显然喜欢它时,为什么您还不接受答案?请理解,关闭根本不是不删除,它更多的是链接它们,以便下一个寻求帮助的人得到这里的所有东西。对伊恩来说,这是一个优势,因为没有人可以在这里与他的答案竞争。他也可以随时为旧问题添加一个如此详细的答案。
-
@VladimirF “顺便说一句,当你显然喜欢这个答案时,你为什么还不接受它?”我正在等待更多时间。尽快接受答案有人发布一个不鼓励进一步的答案,这可能会更好。至少我个人是这样认为的。
标签: matlab fortran anonymous-function