使用持久变量使用MATLAB ODE套件中的ode45传递额外参数?

时间:2016-06-30 10:40:41

标签: matlab ode numerical-integration

How do I pass out extra parameters using ODE23 or ODE45 from the MATLAB ODE suite?" MathWorks支持团队"建议使用persistent变量使用MATLAB ODE套件中的ode45传递额外参数。

但是,如果集成失败并且求解器将在前一个时间步调用您的函数,该怎么办? ode45求解器使用自适应时间步长,有时积分可能会失败,因此求解器会自动缩短时间步长,并且必须返回。"

是#34; MathWorks支持团队"他们建议使用persistent变量的错误?我看到'OutputFcn'方法可用于传递额外的参数,但我不知道如何使用它。你能用'OutputFcn'方法给我一个大纲或示例代码来检测失败的步骤/标志等,以提供正确的额外参数吗?如果我使用'OutputFcn'方法,是否需要global变量?

1 个答案:

答案 0 :(得分:2)

这是一个示例,稍微修改一下文档。

定义ODE功能。 param将是要交换的变量。

function dy = rigid(t, y)

global param

dy = zeros(3,1);    % a column vector
dy(1) = param + y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);

param = dy(1) * dy(3);

输出函数必须声明要作为全局交换的变量。每个成功的步骤后都会调用myout

function status = myout(t, y, flag)

global param

% Don't ever halt the integration
status = 0;

if strcmp(flag, 'init')
    % Initialization (apparently useless).
    param = -2;

elseif isempty(flag)
     % Main code to update param.
     param = param * mean(t);

elseif strcmp(flag, 'done')
     % Nothing to do.

end

以这种方式致电ode45

% True initialization.
global param
param = -2;

odeOpts = odeset(  ...
    'RelTol', 1e-6,  ...
    'AbsTol', 1e-7,  ...
    'OutputFcn', @myout);

[time, y] = ode45(@rigid, [0 10], [0 1 1], odeOpts);

plot(  ...
    time, y(:,1), '-',   ...
    time, y(:,2), '-.',  ...
    time, y(:,3), '.');