Implementando funções anônimas no Fortran

Esta pergunta é sucessora da minha pergunta anteriorImplementando o método de minimização. Na pergunta atual, simplifiquei meu problema e aqui está o código MATLAB de amostra. Eu quero implementá-lo no 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)

No script1.m, criei um identificador de funçãofun1 e deseja atribuir valores a ele, como mostrado nafun15.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

Em vez do arquivo fun15.m, é bem possível criar um fechamento como mostrado por (1). Aqui,arr1 = [x4,y4] earr2=[x5,y5]. Podemos primeiro passar valores dex4,y4,x5,y5 e retornará uma função na variávela. Essa função retornada é passada para uma função de minimização abaixo.

%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

Como converter isso em Fortran - especialmente função retornando função?Anônimo funções não são suportadas pelo Fortran (o C ++ 11 o suporta como lambdas e o ALGOL 68 também). É possível implementar esse problema no Modern Fortran (90,95,03,08)?

questionAnswers(2)

yourAnswerToTheQuestion