用Python模拟两个耦合的动力学系统

时间:2019-09-03 14:02:38

标签: python ode

目标是绘制两个完全相同的动力学系统。

我们有:

X = [x0,x1,x2]

U = [u0,u1,u2]

还有

Xdot = f(X)+ alpha *(U-X)

Udot = f(U)+ alpha *(X-U)

因此,我希望在一组轴上(例如在xyz中)绘制该宏系统的解,并最终更改耦合强度以研究行为。

import matplotlib.pyplot as plt
from scipy.integrate import odeint
from mpl_toolkits.mplot3d import Axes3D

def couple(s,t,a=0.2,beta=0.2,gamma=5.7,alpha=0.03):
    [x,u] = s
    [u0,u1,u2] = u
    [x0,x1,x2] = x
    xdot = np.zeros(3)
    xdot[0] = -x1-x2
    xdot[1] = x0+a*x1
    xdot[2] = beta + x2*(x0-gamma)
    udot = np.zeros(3)
    udot[0] = -u1-u2
    udot[1] = u0+a*u1
    udot[2] = beta + u2*(u0-gamma)
    sdot = np.zeros(2)
    sdot[0] = xdot + alpha*(u-x)
    sdot[1] = udot + alpha*(x-u)
    return sdot

s_init = [0.1,0.1]

t_init=0; t_final = 300; t_step = 0.01
tpoints = np.arange(t_init,t_final,t_step)

a=0.2; beta=0.2; gamma=5.7; alpha=0.03

y = odeint(couple, s_init, tpoints,args=(a,beta,gamma,alpha), hmax = 0.01)

我想象s_init出问题了,因为它应该是两个初始条件向量,但是当我尝试时,我得到“ odeint:y0应该是一维的”。另一方面,当我尝试将s_init设为6个向量时,我得到“无法解包的值太多(预期为两个)”。使用当前设置,我得到了错误

  File "C:/Users/Python Scripts/dynsys2019work.py", line 88, in couple
    [u0,u1,u2] = u

TypeError: cannot unpack non-iterable numpy.float64 object

欢呼

*编辑:请注意,这基本上是我第一次尝试这种事情,很高兴收到更多文档和参考。

1 个答案:

答案 0 :(得分:0)

ode定义接受并返回scipy odeint中的1D向量,我认为您的困惑是您实际上拥有1个带6个变量的ODE系统。您只需将其分配到两个独立的ODE中即可。

您可以这样做:

import matplotlib.pyplot as plt
from scipy.integrate import odeint
import numpy as np

def couple(s,t,a=0.2,beta=0.2,gamma=5.7,alpha=0.03):

    x0, x1, x2, u0, u1, u2 = s
    xdot = np.zeros(3)
    xdot[0] = -x1-x2
    xdot[1] = x0+a*x1
    xdot[2] = beta + x2*(x0-gamma)
    udot = np.zeros(3)
    udot[0] = -u1-u2
    udot[1] = u0+a*u1
    udot[2] = beta + u2*(u0-gamma)
    return np.ravel([xdot, udot])

s_init = [0.1,0.1, 0.1, 0.1, 0.1, 0.1]
t_init=0; t_final = 300; t_step = 0.01
tpoints = np.arange(t_init,t_final,t_step)
a=0.2; beta=0.2; gamma=5.7; alpha=0.03
y = odeint(couple, s_init, tpoints,args=(a,beta,gamma,alpha), hmax = 0.01)
plt.plot(tpoints,y[:,0])