我想为不同的参数多次解决微分方程.它是比这更复杂,但是为了清楚起见,让我们说的ODE是y'(x) = (y+a)*x
有y(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
例程并了解如何在没有解决方法的情况下解决这个特定问题,因为当我需要将参数化函数与不同的集成器集成时,我觉得它将再次变得重要.
这个问题是我之前的问题实现最小化方法的继承者.在当前的问题中,我简化了我的问题,这是示例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)