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)?