在 Python 中绘制非线性 ODE 的鞍节点分岔图

计算科学 Python 数字 牛顿法
2021-12-28 01:57:03

我正在尝试绘制以下 ODE 的分岔图,

一阶 ODE - 鞍节点

此 ODE 导致鞍节点分叉 (参见 wiki)

但是我得到的并不完全正确。如下图所示,有很多“噪音”。

在此处输入图像描述

通常应该有从左下角到与橙色线交点的蓝线(稳定线)。然后是从蓝线到绿线的橙色线(中间的那条线——不稳定线)。然后是从与橙色线的交点到右上角的绿线(不稳定线)。

事实上,它应该更像这样(除了它是相反的,但你可以看到这个想法)。

这是我的问题:

  1. 有什么想法可以修复/改进我的算法吗?
  2. 有没有办法可以精确地指示 matplotlib 中的稳定/不稳定线(例如红色表示不稳定,绿色表示稳定)而不是所有这些颜色?
  3. 有什么方法可以在线条之间绘制动力系统的流动?

这是代码:

这段代码的想法是

  • 循环遍历强制参数范围的所有强制参数 (phi)。
  • 对于每个强制参数,寻找 ODE 的一些根。
  • 绘图。
import numpy as np
import matplotlib.pyplot as plt

from scipy.optimize import fsolve

# 1D EDO for Saddle-Node bifurcation paramaters
a1 = -1
a2 = 1

# initial conditions
x0 = 0.0
y0 = 5.0
z0 = 5.0

r0 = 5.0

# time range
t_init = 0
t_fin = 500
time_step = 0.01

def fold(v, phi):
  return np.array([
    a1 * (v[0] ** 3) + a2 * v[0] + phi
  ])


phi = 0
nphi = 100
nguesses = 3
phi_mesh = np.linspace(start=-2, stop=2, num=nphi)

# number of time steps
nt = int((t_fin - t_init) / time_step)
time_mesh = np.linspace(start=t_init, stop=t_fin, num=nt)

def fold_bifurcation():
    equilibria_mesh = np.zeros((nphi, nguesses))

    # for each phi
    for phi_index in range(0, nphi-1):

      # find the equilibria of our system
      guesses = np.linspace(start=-3, stop=3, num=nguesses)
      equilibria = []
      
      # look for some equilibria
      for guess in guesses:  
          equilibrium = fsolve(func=fold, x0=[guess], args=(phi_mesh[phi_index]))
          equilibria.append(equilibrium[0])
      
      np.array([equilibria])
      # add to the mesh
      #print(np.shape(equilibria_mesh[phi_index]), np.shape(equilibria))
        
      equilibria_mesh[phi_index] = np.array([equilibria])

    plot(dataset=equilibria_mesh.copy(), ylabel="x")

def plot(dataset, ylabel):
    plt.plot(phi_mesh, dataset)
    plt.xlabel("$\phi$")
    plt.ylabel(ylabel)
    plt.xlim(-2,2)
    plt.ylim(-5,5)
    plt.show()
    
fold_bifurcation()

1个回答

对于第一个问题:

你应该考虑继续。我不知道python所以我不能为你写代码,但基本上,你把算法改成这样:

  1. 寻找一些 phi = -2 的解决方案。
  2. 在寻找 phi = -1.9 时使用这些解决方案作为初始猜测
  3. 在剩余的时间间隔内重复步骤 2

因为您使用以前的解决方案作为猜测,所以您将避免分支跳跃(您所说的噪音)。不过有很多问题需要处理。延续是一种难以实现的算法。如果遇到更多麻烦,我建议您寻找图书馆。

对于第二个问题:

你可以看看导数dxdt. 如果是正-> 不稳定,负-> 稳定。然后使用该信息以正确的颜色绘制点。我建议使用虚线图来促进这一点,这样 IMO 看起来更好。

对于第三个问题:

不知道