如何在 Matlab 上为参数的多个值存储 ODE 的所有解

计算科学 matlab
2021-12-09 23:11:46

我想为参数的多个值求解 ODE,p最重要的是,保存所有不同值的所有解决方案。

到目前为止,我一直在使用这个:

p = -200:+1:300;
time = 0:.01:10;
y0 = [0 0 0 0 0 0 0 0]; 
y = NaN(length(time),length(y0),length(p));

for i=1:length(p)
    [t,y(:,:,i)] = ode45(@myode,time,y0,[],p(i)); 
end

但它有t预定义的,这是不应该的。

我认为的一个问题是,我无法将y所有时间t的所有值和所有值存储p在矩阵中,因为我无法t在循环之前使用该变量。如果我改用变量time,我将无法利用ODE45使用自己的dt区间的积分,这取决于它将遇到的非线性。

我能想到的一个潜在解决方案如下:

p = -200:+1:300;
time = [0 10];
y0 = [0 0 0 0 0 0 0 0];
y = NaN(1,length(y0),length(p));

for i=1:length(p)
    [t,x] = ode45(@ode,time,y0,[],p(i)); 

    y(1:length(t),:,i) = x(:,:);
end

在这种情况下,它设法存储所有值,但是,集成步骤从一个循环变为另一个循环。因此,对于最短 的情况length(t),由于它们都共存于同一个矩阵中,因此剩余的矩阵位置为0我知道我可能需要使用插值来查找已自动替换为0.

我在循环中使用以下行,但它不起作用:

y(1:length(t),:,i) = interp1(x,time)

因为我想使用 进行插值tspan,但没有成功。我猜我在插值上做错了什么。

我真的很感激任何建议!

1个回答

我认为由于对 ODE45 的工作原理有误解,您遇到了问题。如果我正确理解您的问题,您希望在特定时间绘制行为,但您担心使用 ODE45 无法做到这一点。这是对 ODE45 工作原理的误解。ODE45 使用自适应时间步长,并且永远不会使用您给它的时间数组。它将使用自己的自适应时间步长过程和局部误差控制机制,然后使用高阶插值函数插值到您想要的时间片。因此,无论错误控制机制如何,您都可以提前选择时间片,因为高阶插值被设计为具有与 matlab 在 ODE45 中使用的 DPRK45 方法相似的错误行为。您可以参考他们的文档以获取更多信息。