0

我正在使用以下命令来求解 ODE 函数“DynamicFunc”:

x0_sim = zeros(12,1);
time_sim = [0 100];
options=odeset('AbsTol',1e-9,'RelTol',1e-6);
[tp,xp]=ode45(@DynamicFunc,time_sim,x0_sim,options);

DynamicFunc 可以是任何函数,并且代码运行良好。模拟时间为 0 - 100 秒。决赛 XP 的大小为 3017x12(即有 12 个状态和 3017 个试验点)。如果我想在持续时间为 1 秒的 FOR 循环中运行此代码,则如下所示:

x0_sim = zeros(12,1);
time_sim = [0 1];
for tt = 1:100
    options=odeset('AbsTol',1e-9,'RelTol',1e-6);
    [tp,xp]=ode45(@DynamicFunc,time_sim,x0_sim,options);
    x0_sim = xp(:,end);
end

最终迭代的次数会如此不同。如何使它们具有相同的大小(使两种方法的最终输出具有相同的向量大小)?我猜这个问题可能与设置特定选项有关,但我找不到。

4

1 回答 1

1

您的问题是由于步长控制ODE45动态增加和减少时间步长的大小。在您的第二个设置中,您每秒强制执行时间网格点,而在第一个设置中,算法选择自己的网格点。

为了使两者匹配,您应该考虑提供正确选择的时间网格向量的选项,tspan以获取预定义网格处的函数值。

于 2013-05-22T12:31:00.030 回答