相关疑难解决方法(0)

传递内部过程作为参数

我想为不同的参数多次解决微分方程.它是比这更复杂,但是为了清楚起见,让我们说的ODE是y'(x) = (y+a)*xy(0) = 0,我想y(1).我从netlib中选择了dverk算法来解决ODE,并且它希望右侧的函数具有某种形式.现在我对英特尔Fortran编译器所做的是以下(简化):

subroutine f(x,a,ans)
implicite none
double precision f,a,ans,y,tol,c(24),w(9)
...
call dverk(1,faux,x,y,1.d0,tol,ind,c,1,w)
...
contains
    subroutine faux(n,xx,yy,yprime)
           implicite none
           integer n
           double precision xx,yy(n),yprime(n)
           yprime(1) = (yy(1)+a)*xx
    end subroutine faux
end subroutine f
Run Code Online (Sandbox Code Playgroud)

这对ifort工作得很好,子子程序faux看到参数a,一切都按预期工作.但我希望代码与gfortran兼容,并且使用此编译器,我收到以下错误消息:

错误:内部过程'faux'不允许作为(1)的实际参数

我需要将faux例程放在里面f,否则我不知道如何告诉它的值a,因为我无法更改参数列表,因为这是dverk例程所期望的.

我想保留dverk例程并了解如何在没有解决方法的情况下解决这个特定问题,因为当我需要将参数化函数与不同的集成器集成时,我觉得它将再次变得重要.

fortran parameter-passing gfortran

4
推荐指数
1
解决办法
4796
查看次数

在Fortran中实现匿名函数

这个问题是我之前的问题实现最小化方法的继承者.在当前的问题中,我简化了我的问题,这是示例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)
Run Code Online (Sandbox Code Playgroud)

在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) …
Run Code Online (Sandbox Code Playgroud)

matlab fortran anonymous-function

4
推荐指数
1
解决办法
955
查看次数