目标是绘制两个完全相同的动力学系统。
我们有:
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
欢呼
*编辑:请注意,这基本上是我第一次尝试这种事情,很高兴收到更多文档和参考。
答案 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])