SciPy阶跃响应图似乎打破了某些值

时间:2013-04-19 23:41:22

标签: python matplotlib scipy

我在控制系统类中使用SciPy而不是MATLAB来绘制LTI系统的阶跃响应。它到目前为止工作得很好,但我遇到了一个非常具体的系统问题。使用此代码:

from numpy import min
from scipy import linspace
from scipy.signal import lti, step
from matplotlib import pyplot as p

# Create an LTI transfer function from coefficients
tf = lti([64], [1, 16, 64])
# Step response (redo it to get better resolution)
t, s = step(tf)
t, s = step(tf, T = linspace(min(t), t[-1], 200))
# Plotting stuff
p.plot(t, s)
p.xlabel('Time / s')
p.ylabel('Displacement / m')
p.show()

代码按原样显示扁平线。如果我将分母的最终系数修改为64.00000001(即tf = lti([64], [1, 16, 64.0000001])),那么它将按预期工作,显示欠阻尼阶跃响应。将系数设置为63.9999999也有效。将所有系数更改为具有显式小数位(即tf = lti([64.0], [1.0, 16.0, 64.0]))不会影响任何内容,因此我猜这不是整数除法的情况。

这是SciPy中的错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:5)

这是step函数实现的限制。它使用矩阵指数来找到阶跃响应,并且它不能很好地处理重复的极点。 (你的系统在-8处有一个重复的极点。)

您可以使用函数scipy.signal.step2

,而不是使用step
In [253]: from scipy.signal import lti, step2

In [254]: sys = lti([64], [1, 16, 64])

In [255]: t, y = step2(sys)

In [256]: plot(t, y)
Out[256]: [<matplotlib.lines.Line2D at 0x5ec6b90>]

enter image description here