使用scipy.signal.lti从状态矩阵创建Python的LTI系统

Jos*_*ter 6 python signal-processing numpy scipy

scipy.signal.lti权利要求要能接受四个阵列,A,B,C,和D,以限定系统(除了其它方法).但是,它给了我一个错误,我找不到说明这个的例子.

我的代码很简单:

A=np.array([[0,0,1,0],[0,0,0,1],[-2,1,-.02,.01],[1,-2,.01,-.02]])
B=np.array([[0],[0],[-1],[0]])
C=np.array([[0,0,1,0],[0,0,0,1]])
D=np.array([[0],[0]])
sys=scipy.signal.lti(A,B,C,D) #spelled out
Run Code Online (Sandbox Code Playgroud)

有错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/signal/ltisys.py", line 317, in __init__
    self._update(N)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/signal/ltisys.py", line 428, in _update
    self.C, self.D)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/signal/ltisys.py", line 259, in ss2zpk
    return tf2zpk(*ss2tf(A, B, C, D, input=input))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/signal/filter_design.py", line 315, in tf2zpk
    z = roots(b)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numpy/lib/polynomial.py", line 203, in roots
    raise ValueError("Input must be a rank-1 array.")
ValueError: Input must be a rank-1 array.
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?矩阵(数组)大小是正确的.

rth*_*rth 7

状态空间表示中,输入向量D的大小为2,这意味着此控制系统有2个输出变量.我认为当前的实施不支持这一点scipy.signal.lti.

例如,以下输入,一个输出变量确实有效.

C=np.array([[0,0,1,0]])
D=np.array([[0]])
Run Code Online (Sandbox Code Playgroud)

更多细节.问题在于您的原始输入参数,

num, den =  scipy.signal.ss2tf(A, B, C, D)
Run Code Online (Sandbox Code Playgroud)

为分母提供一维数组,但为分子提供一个二维数组(即其中有几个,因为有多个输出变量).但随后scipy.signal.tf2zpk(num, den)希望双方numden于只是多项式(即一维数组).因此,无法初始化lte类.