尊敬的使用Python的odeint用户
我正在尝试使用odeint解决ode系统,并且出现以下错误: “ RuntimeError:func返回的数组必须为一维,但必须为ndim = 2。”
我曾尝试在以前的文章中解决此错误,但是没有帮助。
代码如下:
import numpy as np
from scipy import linspace
from scipy.signal import lti, step, impulse, tf2ss, lsim
from scipy import signal
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from scipy.signal import chirp, sweep_poly
from scipy.integrate import odeint
A=[[-0.001 , 0.001 , 0. , 0. ],
[ 0.001 , -0.002 , 0.001 , 0. ],
[ 0. , 0.001 , -0.002 , 0.001 ],
[ 0. , 0. , 0.001 , -0.0014]]
B=[[ 0. ],
[ 0. ],
[ 0. ],
[ 0.0004]]
def ode45matlab(x,t,A,B,u):
# dxdt=np.add(np.dot(A,x),np.dot([4],u))
#If you uncomment the line above comment the line below then it will work!
dxdt=np.add(np.dot(A,x),np.dot(np.array(B),u))
return dxdt
t=linspace(0,1000000,100)
u = 21.5+0.5*(chirp(t, f0=1/(24*3600), f1=1/(24*3600), t1=10,method='linear'))
u=np.reshape(u,(1,len(t)))
ys=np.zeros((len(t),4))
y0=[22,22,22,22]
ys[0,:]=y0
for i in range(len(t)-1):
ts=[t[i],t[i+1]]
y=odeint(ode45matlab,y0,ts,args=(A,B,u[0,i]))
y0=y[1,:]
ys[i+1,:]=y0
plt.figure()
plt.plot(t,ys)
似乎B矩阵有问题。 我的dxdt = A x + B u。没有B矩阵,我可以求解方程组,但是有了B矩阵,我会得到尺寸误差。
感谢您的提前提示!