如何正确应用 ODE45 求解器

How to apply ODE45 solver correctly

数据点个数与时间步长、积分步长有什么关系?如何确定步长以便生成 N 个点?

例如,当 N=1000 个数据点(每个时间序列的长度)应该是 t 和积分时间步 dt。同样,如果我想生成 N=10k 那么如何确定 tdt。下面的代码用于模拟 Rossler system。我得到一个有趣的情节而不是通常的吸引子。我想生成一个用户定义的 N 点数。但我无法理解 tdt 应该采用什么值。 Rossler 系统应该在 a=0.38,b=0.2,c=5.7.

的参数值处给出一个整洁的混沌吸引子
a = 0.38; b = 0.2; c = 5.7;
t = [0,50];
xinit = [-20 0 0];
ross = @(t, x) [-x(2)-x(3); x(1) + a*x(2); b + x(3)*(x(1) - c)];
[T, X] = ode45(ross, t, xinit);
figure; hold on;
plot3(X(:,1), X(:,2), X(:,3))

For example, when N=1000 datapoints (length of each of the time series) what should be t and the integration time step, dt

t应该是你的1-by-N'datapoints'。使用ode45,它只允许你做起点和终点。

dt是相邻时间点之间的持续时间。 ode45 不需要它。如果您需要了解 Matlab 的功能,请查看 this article or pick up the first book in their reference list.

how to determine t

应该从你的问题的性质来看。

您可以从统一的时间步长开始。例如,t=linspace(0,50,10000).

我对自适应时间步长进行了快速 Google 搜索,前几个链接看起来相当不错。从 educational writing 使用欧拉方法说明概念开始。

ode45 使用自己选择的自适应时间步长。第一篇链接文章中描述了他们的方法。

The code below is for simulating the Rossler system.

您的 odefun 格式是正确的。 Ofc,因为我们只在 Minimal Reproducible Example 中交流,你的系数一定是正确的——尽管你可能希望 double-check.

对于以下结果是否是正确的解决方案,我没有意见。 (我不想。)

您可以尝试不同的公差值,看看是否可以产生更合理的结果。

当我手动实施 non-adaptive RK45 甚至 Euler 方法按预期工作时,当我从非常简单的系统中看到 ode45 的奇怪和不正确的结果时,也许您会发现这很有帮助。

如果我是你,我会同时在 math.stackexchange 上讨论自适应 ODE 方法收敛的原因和时间。也许这会让您深入了解 ode45 结果可能非常不准确的原因和时间。

I want to generate a user defined N number of points.

ode45 将决定自己的时间步长。输入扩展的 t 而不是仅输入端点会告诉 ode45 使用您想要的点数。它对于告诉 ode45 及时向后积分也很有用。生成 1-by-N 向量的格式为 t=linspace(t0,tf,N)。您不需要也不能为 ode45.

自定义 dt

使用ode45,100k 点,你的常量:

使用 ode113、100k 点、a=0.2ode15s 结果看起来相似: