ValueError(“分母多项式必须是rank-1数组。”)
问题描述:
我在lti transient response analysis using Python(numpy, scipy, matplotlib)中获得了以下代码。我是python中的新成员。我有一个转移矩阵,我必须绘制。ValueError(“分母多项式必须是rank-1数组。”)
我碰到了mathwork: tf。我想如下:
from numpy import min, max
from scipy import linspace
from scipy.signal import lti, step, impulse
num00 = [0.0]
den00 = [0.0]
num01 = [-2383.3]
den01 = [1.0,160.3460,-1962.0,-314598.852]
num10 = [1.0]
den10 = [1.0]
num11 = [31.9361,0,111320.0]
den11 = [1.0,160.3460,-1962.0,-314598.852]
num = [[num00,num01],[num10,num11]]
den = [[den00,den01],[den10,den11]]
tf = lti(num,den)
t = 0
s = 0
# get t = time, s = unit-step response
t , s = step(tf)
t , s = step(tf, T = linspace(min(t), t[-1], 1000))
t , i = impulse(tf, T = linspace(min(t), t[-1], 1000))
from matplotlib import pyplot as plt
plt.plot(t, s, t, i)
plt.title('Transient-Response Analysis')
plt.xlabel('Time(sec)')
plt.ylabel('Amplitude')
plt.hlines(1, min(t), max(t), colors='r')
plt.hlines(0, min(t), max(t))
plt.xlim(xmax=max(t))
plt.legend(('Unit-Step Response', 'Unit-Impulse Response'), loc=0)
plt.grid()
plt.show()
我收到以下错误:问题的
>>> tf = lti(num,den)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\site-packages\scipy\signal\ltisys.py", line 236, in __init__self.__dict__['num'], self.__dict__['den'] = normalize(*args)
File "C:\Python26\lib\site-packages\scipy\signal\filter_design.py", line 276, in normalize raise ValueError("Denominator polynomial must be rank-1 array.") ValueError: Denominator polynomial must be rank-1 array.
答
部分是要传递的num/den的是不是一个能够形成矩阵。在你的代码有:
num01 = [-2383.3]
den01 = [1.0,160.3460,-1962.0,-314598.852]
因为据numpy的来讲,你想创建一个矩阵,我知道这只是一个传递函数矩阵的组成部分,只有1这将不能很好地工作分子中的元素和分母中的四个元素。所以你需要这样的东西:
num01 = [ 0, 0, 0,-2383.3]
无论是你或你的意思是有一个非常高的分子。当我尝试一步,我得到: 这可能不是你所期望的。我也建议看看python-control包。当然,你需要获得这个包的所有prerequists,比如SLICOT python package。我相信它最终会为你服务。
正如您对链接博客评论的回复所述,您需要一个'numpy.array',而不是一个列表。你有没有经历numpy教程? – geoffspear 2012-02-21 11:21:06
'num00 = np.array(0.0) den00 = np.array(0.0) num01 = np.array(-2383.3) den01 = np.array([1.0,160.3460,-1962.0,-314598.852]) num10 = np.array([1.0]) den10 = np.array([1.0]) num11 = np.array([31.9361,0,111320.0]) den11 = np.array([1.0,160.3460, -1962.0,-314598.852]) num0010 = np.array([num00,num10]) num0011 = np.array([num01,num11])'从这里只有它的列表。似乎变量不能更改为数组。 – Rick2047 2012-02-21 13:33:04
现在我做了如下:'num = np.array([[[0.0],[1.0]],[[ - 2383.3],[31.9361,0,111320.0]]]) den = np.array([ [0.0],[1.0]],[[1.0,160.3460,-1962.0,-314598.852],[1.0,160.3460,-1962.0,-314598.852]])) tf = lti(num,den) '仍然是它的相同。 :| – Rick2047 2012-02-21 14:24:20