【发布时间】:2018-12-09 11:06:05
【问题描述】:
如何制作一个函数 func2(func1,t,y0),它接收另一个函数 func1 作为参数,但其中 func1 是一个返回一维实数(kind=8)、维度(:)数组的函数?
我有以下用 Matlab 编写的代码,为了速度和可移植性,我想用 Modern Fortran 编写一个等效的代码。我已经为一阶微分方程编写了一个,但是我正在为编写二阶和更高阶微分方程的代码而苦苦挣扎,因为对应于微分方程的外部变量必须返回一个带有维度(:) 的数组。我想要一个通用的代码,即我想要一个可以传递任何微分方程的函数或子程序。
MatLab 代码是:
%-------------------------------------------- -----------------------------
clear all
close all
clc
t = [0:0.01:20]';
y0 = [2, 0]';
y = func_runge_kutta(@func_my_ode,t,y0);
function dy=func_my_ode(t,y)
% Second order differential equation y'' - (1-y^2)*y'+y = 0
dy = zeros(size(y));
dy(1) = y(2);
dy(2) = (1-y(1)^2)*y(2)-y(1);
end
function y = func_runge_kutta(func_my_ode,t,y0)
y = zeros(length(t),length(y0));
y(1,:) = y0';
for i=1:(length(t)-1)
h = t(i+1)-t(i);
F_1 = func_my_ode(t(i),y(i,:)');
F_2 = func_my_ode(t(i)+h/2,y(i,:)'+h/2*F_1);
F_3 = func_my_ode(t(i)+h/2,y(i,:)'+h/2*F_2);
F_4 = func_my_ode(t(i)+h,y(i,:)'+h*F_3);
y(i+1,:) = y(i,:)+h/6*(F_1+2*F_2+2*F_3+F_4)';
end
end
%-------------------------------------------- -----------------------------
【问题讨论】:
-
那么,您的问题是“如何编写一个返回自动调整大小的一维数组的 Fortran 函数?”
-
不是真的,我的问题是如何制作一个函数 func2(func1,t,y0) 接收另一个函数 func1 作为参数,但其中 func1 是一个返回一维实数的函数(kind= 8)、维度(:)数组。
-
到目前为止你有什么尝试?
-
对于一阶微分方程,即当 func1 返回单个实数值时,我有以下代码。但是,当我使用返回数组的 func1 尝试以下代码时,编译器会抱怨不匹配。我也不接受带维度的外部变量。
-
函数 func_runge_kutta(func,t,y0)result(y) ! i/o 变量 real(8), external :: func real(8), allocatable, intent(in) :: t(:) real(8), intent(in) :: y0 real(8), allocatable ::你(:)!内部变量...结束函数func_runge_kutta
标签: function fortran numerical-methods runge-kutta