4

我在控制系统类中使用 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 中的错误,还是我做错了什么?

4

1 回答 1

7

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

step您可以使用函数scipy.signal.step2而不是using

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>]

在此处输入图像描述

于 2013-04-20T02:30:09.533 回答