为什么我在 MatCont 中出现 "current step too small" 错误?

why I get "current step too small" error in MatCont?

我正在尝试使用 MATLAB 的 MatCont 包对二阶动力系统进行分岔分析。一般来说,我对 MatCont 和 ODE 求解器还很陌生。

系统如下(写在MatCont中):

x1' = R*x1/L + x2/L
x2' = a+x2/D - (b*x2^3)/D - x1/D

其中R、L、D、a、b为参数。 当我开始仅关注一个变量的积分时(我的目标是针对分叉参数 R 绘制一个变量),我收到以下错误:

"current step too small".

我已经为 InitStepSize、MinStepSize 和 MaxStepSize 尝试了不同的值,但错误并没有消失,所以我无法执行分析。

我使用的求解器是 ode45。知道如何解决这个问题吗?

更多详情:

  1. 前 3 个导数以符号方式计算
  2. 初始点:(t=0, x1=0, x2=0, R=27, L=1.2e-08, D= 1.2e-11, a=0.04, b=0.18)

这是我从 matlab 得到的输出:

first point found
tangent vector to first point found
Current step size too small (point 1)
elapsed time  = 2.2 secs
npoints curve = 1
first point found
tangent vector to first point found
Current step size too small (point 1)
elapsed time  = 0.4 secs
npoints curve = 1

如果您需要更多详细信息,请询问。

在实现一种算法时,必须决定要使它具有多通用性。面对“现实世界”问题时可能出错的最直观的假设之一是所有变量具有大致相同的权重,所有感兴趣的区域都是非平面的,例如在未修改的欧几里得范数中接近圆形或球形或标量积。

有两种主要方法可以实现这个假设,传递一个用于构造自适应范数和标量积的比例向量,或者只传递这样一个标量积,或者只要求用户已经对他们的问题进行了缩放这样每个变量的值的范围大约是0.01到1000左右。

这可能不是这种情况的一个迹象是像这里 LD 这样的等式中“连接”系数的极值。虽然 ode45 可能仍然可以优雅地处理这个问题,但分叉分析背后的非线性根查找器可能不会。通过将时间尺度轻松更改 1e9 倍(即,将秒作为时间单位改为纳秒),时间尺度变得与状态 space 尺度相当。在代码中,只需将 L,D 乘以该因子即可实现此更改,得到 L=12D=0.012。据报道,这实际上已经足以使分析程序正常工作。