【问题标题】:How to apply ODE45 solver correctly如何正确应用 ODE45 求解器
【发布时间】:2020-11-12 17:22:01
【问题描述】:

数据点的数量与时间步长和积分步长有什么关系?如何确定步长以便生成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))

【问题讨论】:

    标签: matlab numerical-integration chaos


    【解决方案1】:

    例如,当 N=1000 个数据点(每个时间序列的长度)时,t 和积分时间步长应该是多少,dt

    t 应该是您的 1×N“数据点”。使用ode45,它只允许你做初始点和结束点。

    dt 是相邻时间点之间的持续时间。 ode45 不需要它。如果您需要了解 Matlab 的功能,请查看this article 或在他们的reference list 中获取第一本书。

    如何确定t

    它应该来自你的问题的性质。

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

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

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

    以下代码用于模拟罗斯勒系统。

    您的odefun 格式正确。 Ofc,由于我们只在Minimal Reproducible Example 中交流,因此您的系数必须是正确的——尽管您可能希望再次检查。

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

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

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

    如果我是你,我会同时在 math.stackexchange 上就自适应 ODE 方法收敛的原因和时间进行对话。也许这会让您了解ode45 结果可能高度不准确的原因和时间。

    我想生成一个用户定义的 N 个点。

    ode45 将决定自己的时间步长。输入扩展的t 而不是仅输入端点告诉ode45 使用您想要的点数。告诉ode45 及时向后整合也很有用。生成 1×N 向量的格式为 t=linspace(t0,tf,N)ode45 不需要也不能自定义dt


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多