我试图用odeint模拟状态空间形式的动态系统。 我的A矩阵是12 * 12而B矩阵是12 * 4(行* cols)所以我的初始状态向量是12 * 1,因为它建议。
我的代码如下
import numpy as np
from scipy.integrate import odeint
tmp = np.loadtxt("system.txt", skiprows =2)
A=np.matrix(tmp)[0:12,0:12]
B=np.matrix(tmp)[0:12,12:]
control = np.matrix([[0.0],[0.0],[-0.6310],[0.0]])
def aircraft(state, t):
return A*state + B*control
state0 = np.array([[6.809827628],[0.439572153],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]])
t = np.arange(0.0, 10.0, 0.1)
state = odeint(aircraft, state0, t)
我收到此错误
Traceback (most recent call last):
File "sim.py", line 17, in <module>
state = odeint(aircraft, state0, t)
File "/home/aluminium/anaconda2/lib/python2.7/site-packages/scipy/integrate/odepack.py", line 215, in odeint
ixpr, mxstep, mxhnil, mxordn, mxords)
ValueError: Initial condition y0 must be one-dimensional.
我认为定义状态向量的唯一方法是作为列向量。 你能告诉我如何定义一个初始状态向量来克服这个问题吗?
非常感谢。
答案 0 :(得分:1)
我得到了答案并想到在这里分享它,希望将来有同样问题的人会受益。
odeint似乎期望1d数组作为状态变量来调用函数,并且1d数组也从函数返回。
所以我相应地改变了变量。这是代码。
def aircraft(state, t):
xdot= A*state.reshape(12,1) + B*control
return np.squeeze(np.asarray(xdot))
state0 = np.array([6.809827628,0.439572153,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0])
干杯
答案 1 :(得分:0)
您可以在将y0初始条件向量传递给odeint函数之前对其进行重塑:
y0_reshaped = y0.reshape(n,)
其中n = y0向量中的元素数。