在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
变量?
答案 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), '.');