在how-do-i-solve-an-ode-with-time-dependent-parameters-in-matlab
中问:考虑以下具有时间相关参数的ODE:
y'(t) + f(t)y(t) = g(t)
和给定的初始条件:
y(0) = 1
这是具有时间依赖项的ODE的示例。假设时间相关项仅通过两个向量中给出的数据点集来定义。我应该使用哪个MATLAB ODE求解器,以及如何设置此问题?
答:此增强功能已包含在第14版Service Pack 3(R14SP3)中。对于以前的产品版本,请阅读下面的任何可能的解决方法
我的问题是:我确实使用了Release 14 Service Pack 3(R14SP3)。但答案没有提到如何处理它。如何在ODE45中实现时间相关参数?
我的问题二是:因为我不知道如何在(R14SP3)的ODE45中实现时间相关参数。我计划在该页面的答案中使用旧的插值方法。但是,为什么我们需要插值,因为我们已经知道时间相关参数的精确形式。
我的问题三是:Jan Simon在评论中指出了插值的缺陷。我已经使用“每个循环集成”实现了Jan Simon建议的方法。但Jan Simon的方法将变量视为ODE45内的常量。那么如何在ode45“h”区间内进行整合呢?我知道如何在我定义的时间间隔内进行积分,但ode45会在运行自己的时间间隔时将变量视为常量。例如,为每个时间步执行每个循环的集成:
function Integrationperloop
tResult = [];
xResult = [];
tStep = [0 1 2 3 4 5 6 7 8 9 10 11];
x0 = [1 2 3];
for index = 2:numel(tStep)
% Integrate:
beta = 1 + exp(-0.20*tStep(index - 1))
af = @(t,x) f(t, x, beta);
t = tStep(index-1:index);
[t, x] = ode45(af, t, x0);
% Collect the results:
tResult = cat(1, tResult, t);
xResult = cat(1, xResult, x);
% Final value of x is initial value for next step:
x0 = x(end, :);
end
%This is the derivative
function dx = f(t,x, beta)
dx = [-0.5*x(1)-beta*x(1)*x(3); ...
beta*x(1)*x(3) - x(2); ...
x(2) - x(3)];
但是在上面的代码中,ode45会在运行自己的间隔时将变量视为常量。在链接how-do-i-solve-an-ode-with-time-dependent-parameters-in-matlab中,MathWorks支持团队建议使用R14S13中的增强或使用插值。如果使用插值,当ODE45运行时,时间相关变量使用插值更改。