Python 用matplotlib绘制3 ODE系统的相位图

Python 用matplotlib绘制3 ODE系统的相位图,python,matplotlib,ode,Python,Matplotlib,Ode,我正试图绘制一个由3个ODE组成的动力学系统的时间序列和相位图。我首先绘制了4个初始条件下的时间序列,但也需要带箭头的相位图。我得到4个三维绘图,这不是我想要的。我想看看这篇文章最后几页的内容 我使用的代码是: import numpy as np import matplotlib.pyplot as plt import sympy as sp import scipy as scp from scipy.integrate import solve_ivp from scipy.integ

我正试图绘制一个由3个ODE组成的动力学系统的时间序列和相位图。我首先绘制了4个初始条件下的时间序列,但也需要带箭头的相位图。我得到4个三维绘图,这不是我想要的。我想看看这篇文章最后几页的内容

我使用的代码是:

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
import scipy as scp
from scipy.integrate import solve_ivp
from scipy.integrate import odeint
s=0  
omega=np.array([2,3.7,4,3])
omega11=omega[0]
omega12=omega[1]
omega21=omega[2]
omega22=omega[3]


beta=np.array([28,24])
beta1=beta[0]
beta2=beta[1] 

epsilon=np.array([1.12,3.1])
epsilon1=epsilon[0]
epsilon2=epsilon[1]

g12=2
gamma12=22
def dynamical_model_bacteria(X,t):

    x=X[0]
    y1=X[1]
    y2=X[2]




    dxdt=x*(1-x-y1-y2)+s
    dy1dt=y1*(-epsilon[0]*(1+omega11*y1+omega12*y2)-g12*y2+beta1*x)

    dy2dt=y2*(-epsilon[1]*(1+omega21*y1+omega22*y2)+gamma12*y1+beta2*x) 

    return [dxdt,dy1dt,dy2dt]
print( dynamical_model_bacteria([50,50,50],0))  
x0=np.array([
       [ 0.11111111,  0.88888889,  0.        ],
       [ 0.37237237,  0.        ,  0.62762763],
       [ 0.        ,  0.10813086, -0.22171438],
       [ 0.17247589,  0.35219856,  0.47532555]])
for i in x0:
    t=np.linspace(0,30,30000)
    x_sol=odeint(dynamical_model_bacteria,i,t)
    x=x_sol[:,0]
    y1=x_sol[:,1]
    y2=x_sol[:,2]
    fig=plt.figure(figsize=(15,5))
    plt.xlabel('Time  (day)')
    plt.ylabel('populations (num/ml)')
    plt.title(r' $\quad\beta_{1}<\epsilon_{1} and\ \beta_{2}<\epsilon_{2}$'+'      '+'$x_{0}=$' +str(i))
    plt.plot(t,x_sol[:,0],'r--' ,linewidth=2.5, markersize=1.5)
    plt.plot(t,x_sol[:,1],'b:', linewidth=3, markersize=0.5)
    plt.plot(t,x_sol[:,2],'g-.', linewidth=3.5, markersize=0.2)
    # set the limits
    plt.xlim([0, 30])
    plt.ylim([-1, 1])
    plt.legend( ('Bacteria','protozoa','Daphnia'),
           loc='upper center', shadow=True)
    fig=plt.figure(figsize=(15,5))
    ax = plt.axes(projection="3d")

    ax.plot3D(x,y1,y2)

    plt.savefig('EP2_fig2.png', dpi=300, bbox_inches='tight')

    plt.show()





将numpy导入为np
将matplotlib.pyplot作为plt导入
将sympy作为sp导入
将scipy作为scp导入
来自scipy.integrate import solve\u ivp
从scipy.integrate导入odeint
s=0
ω=np.数组([2,3.7,4,3])
ω11=ω[0]
ω12=ω[1]
ω21=ω[2]
ω22=ω[3]
beta=np.数组([28,24])
beta1=beta[0]
β2=β[1]
ε=np.数组([1.12,3.1])
ε1=ε[0]
ε2=ε[1]
g12=2
gamma12=22
def动力学模型细菌(X,t):
x=x[0]
y1=X[1]
y2=X[2]
dxdt=x*(1-x-y1-y2)+s
dy1dt=y1*(-epsilon[0]*(1+omega11*y1+omega12*y2)-g12*y2+beta1*x)
dy2dt=y2*(-epsilon[1]*(1+omega21*y1+omega22*y2)+gamma12*y1+beta2*x)
返回[dxdt,dy1dt,dy2dt]
打印(动态模式细菌([50,50,50],0))
x0=np.1数组([
[ 0.11111111,  0.88888889,  0.        ],
[ 0.37237237,  0.        ,  0.62762763],
[ 0.        ,  0.10813086, -0.22171438],
[ 0.17247589,  0.35219856,  0.47532555]])
对于x0中的i:
t=np.linspace(0,3030000)
x_sol=odeint(细菌动力学模型,i,t)
x=x_溶胶[:,0]
y1=x_溶胶[:,1]
y2=x_溶胶[:,2]
图=plt.图(图尺寸=(15,5))
plt.xlabel(‘时间(天)’)
plt.ylabel('总体(num/ml)')

plt.title(r'$\quad\beta{1}预先计算给定平衡点的解,如下所示

sol=[ odeint(dynamical_model_bacteria,init,t) for init in x0];
然后,您可以在单独的循环中使用它们来构建这两个图。使用子图可以减少图像窗口的数量,组装后的图将给出

之后,使用相同的Axis对象绘制其中的所有曲线,为一些随机初始点添加一些曲线以填充空间

范围内k的
(len(x0)):
x、 y1,y2=sol[k].T
坐标图(x,y1,y2,'r',lw=2)
对于范围(80)内的k:
sol=odeint(细菌动力学模型,0.3*np.rand.rand(3),t)
x、 y1,y2=溶胶T
轴图(x,y1,y2,'b',lw=1)
然后,保存的绘图将被删除

将numpy导入为np
将matplotlib.pyplot作为plt导入
从mpl_toolkits.mplot3d导入Axes3D
来自scipy.integrate import solve_ivp,odeint
s=0
ω=np.数组([2,3.7,4,3])
ω11,ω12,ω21,ω22=ω
beta=np.数组([28,24])
β1,β2=β
ε=np.数组([1.12,3.1])
ε1,ε2=ε
g12=2
gamma12=2
def动力学模型细菌(X,t):
x、 y1,y2=x
dxdt=x*(1-x-y1-y2)+s
dy1dt=y1*(-epsilon[0]*(1+omega11*y1+omega12*y2)-g12*y2+beta1*x)
dy2dt=y2*(-epsilon[1]*(1+omega21*y1+omega22*y2)+gamma12*y1+beta2*x)
返回[dxdt,dy1dt,dy2dt]
打印(动态模式细菌([50,50,50],0))
#以“有序”的方式计算一些解
x0=np.1数组([
[ 0.11111111,  0.88888889,  0.        ],
[ 0.37237237,  0.        ,  0.62762763],
[ 0.        ,  0.10813086, -0.22171438],
[ 0.17247589,  0.35219856,  0.47532555]])
t=np.linspace(0,308000)
sol=[odeint(动力学模型细菌,init,t)表示x0中的init];
#第一个情节
图=plt.图(图尺寸=(15,5))
对于范围内的k(len(x0)):
打印(动力学模型细菌(x0[k],0))
plt.子地块(2,2,k+1);
x、 y1,y2=sol[k].T
plt.xlabel(‘时间(天)’)
plt.ylabel('总体(num/ml)')

plt.title(r'$\quad\beta{1}请不要要求一个完整的解决方案。自己检查代码。如果您陷入某个地方,请询问具体问题。@我确实尝试在代码中绘图,但希望所有初始值都是一个阶段,而不是我得到的4。您应该加上初始点都是平衡点或接近平衡点,只有第三个就足够了我想给出一个非常量解,与其他3个解在3D绘图中显示为点有关。您可能应该向集合中添加一些其他初始点以填充方框。我一直在尝试使用您的解。这两个绘图是我想要的,但我仍然不知道如何使用我发布的绘图中提供的代码。我的编码技能有限,因此发布给出两个图的完整代码会很有帮助。顺便问一下,框中的红线是什么?红线(颜色/线条样式参数
'r'
)是给定初始条件下第一个循环的唯一轨迹,从第三个循环开始。其他点提供恒定的解决方案,这些解决方案在3D绘图中是无量纲的,因此不会被蓝色打印或擦除(
'b'
)随机初始条件的解决方案。抱歉要求太高。你知道如何在标题的初始条件中使用逗号来区分坐标吗?以及绘制方向箭头如何。我知道我应该使用quiver,但不知道如何使用。我不知道有什么箭头可以系统地添加到曲线。
streamplot
以某种方式实现了这一点,但并没有使该方法普遍可用。//
numpy
将数组打印为矩阵。普通python列表使用逗号打印,
str(list(x0[k])
工作,但提供了具有17位精度的完全识别格式。您还可以构建自己的,例如
“[”+“,”.join(f“{x:.6g}”表示x0[k])+“]”中的x。不幸的是,我没有意识到这一点。我没有看到在3D中使用plt.streamplot命令,这可能是系统解决方案的最有可能的候选者。