matplotlib 绘制非线性常微分方程系统的相图

quhf5bfb  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(167)

我对Python有点陌生,我需要绘制这个方程系统的相图:

x˙ = x(3 − 2x − y)
y˙ = y(2 − x − y)

我用odeint函数解决了这个系统,并试图用4个固定点绘制相图,但最终得到了不同的图。以下是我目前为止写的代码:

# function for the ODE
def f(u, t):
    x, y = u
    dxdt = x * (3 - 2*x - y)
    dydt = y * (2 - x - y)
    return np.array([dxdt, dydt])

#those are my fixed points + 0.01
values = np.array([[0.01,0.01], [0.01,2.01], [1.51, 0.01], [1.01,1.01])

t = np.linspace(0, 15, 1000)

for v in values:
    X0 = [v[0], v[1]]
    X = odeint(f, X0, t)
    plt.plot(X[:,0], X[:,1], color="black")

plt.ylabel("Sheeps")
plt.xlabel("Rabbits")
plt.legend(loc="upper right")
plt.show()

我应该得到这样的东西:

但我不是有人能帮忙吗?

fafcakar

fafcakar1#

正如@Lutz Lehmann在他们的评论中所说,你展示的相位画像有超过4个起点(它实际上有10个;在x和y轴上有线)。当你创建你的情节,你只探索4个可能的轨迹。你看不到这4条轨迹,因为有些是稳定的不动点,所以解会停留在那里。您要做的是使用streamplot来探索更多的起点。在this solution之后,您可以相应地创建流图。

import numpy as np
import matplotlib.pyplot as plt

plt.close("all")

fixed_points = np.array([[0.,0.], [0.,2.], [1.5, 0.], [1.,1.]])

x = np.linspace(0, 3, 10)
y = np.linspace(0, 3, 10)
X, Y = np.meshgrid(x, y)

Xdot = X * (3 - 2*X - Y)
Ydot = Y * (2 - X - Y)

fig, ax = plt.subplots()
ax.streamplot(X, Y, Xdot, Ydot)
ax.scatter(*fixed_points.T, color="r")
fig.show()

顺便说一句,当使用scipy解决初始值问题时,您应该更喜欢使用solve_ivp而不是过时的odeint

相关问题