如何正确应用 ODE45 求解器
How to apply ODE45 solver correctly
数据点个数与时间步长、积分步长有什么关系?如何确定步长以便生成 N
个点?
例如,当 N=1000
个数据点(每个时间序列的长度)应该是 t
和积分时间步 dt
。同样,如果我想生成 N=10k
那么如何确定 t
和 dt
。下面的代码用于模拟 Rossler system。我得到一个有趣的情节而不是通常的吸引子。我想生成一个用户定义的 N
点数。但我无法理解 t
和 dt
应该采用什么值。 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.2
和 ode15s
结果看起来相似:
数据点个数与时间步长、积分步长有什么关系?如何确定步长以便生成 N
个点?
例如,当 N=1000
个数据点(每个时间序列的长度)应该是 t
和积分时间步 dt
。同样,如果我想生成 N=10k
那么如何确定 t
和 dt
。下面的代码用于模拟 Rossler system。我得到一个有趣的情节而不是通常的吸引子。我想生成一个用户定义的 N
点数。但我无法理解 t
和 dt
应该采用什么值。 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.2
和 ode15s
结果看起来相似: