Реализация анонимных функций в Фортране
Этот вопрос является продолжением моего предыдущего вопросаРеализация метода минимизации, В текущем вопросе я упростил свою проблему, и вот пример кода MATLAB. Я хочу реализовать это на Фортране.
%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 (C ++ 11 поддерживает его как лямбды, а также ALGOL 68). Возможно ли реализовать эту проблему в Modern Fortran (90,95,03,08)?