Dan*_*ter 4 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()
Run Code Online (Sandbox Code Playgroud)
代码按原样显示扁平线.如果我将分母的最终系数修改为64.00000001(即tf = lti([64], [1, 16, 64.0000001])),那么它将按预期工作,显示欠阻尼阶跃响应.设置系数63.9999999也有效.将所有系数更改为具有显式小数位(即 tf = lti([64.0], [1.0, 16.0, 64.0])),不会影响任何内容,因此我猜这不是整数除法的情况.
这是SciPy中的错误,还是我做错了什么?
这是该step功能实现的限制.它使用矩阵指数来找到阶跃响应,并且它不能很好地处理重复的极点.(你的系统在-8处有重复的极点.)
step您可以使用函数scipy.signal.step2而不是使用
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>]
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
4521 次 |
| 最近记录: |