【问题标题】:SciPy step response plot seems to break for some valuesSciPy 阶跃响应图似乎因某些值而中断
【发布时间】:2013-04-19 23:41:22
【问题描述】:

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

【问题讨论】:

  • 我不确定您所说的“而不是”是什么意思,您使用 scipy 进行计算,使用 maplotlib 进行绘图,完全符合它们的设计用途。
  • 你确定那组参数是非奇异的吗?您是否对 matplotlib 有任何问题,或者只是使用它?
  • @tcaswell 我使用的是 Python 库而不是 MATLAB。我不知道参数必须是非奇异的,谢谢!

标签: python matplotlib scipy


【解决方案1】:

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

【讨论】:

  • 谢谢!我不知道重复的极点会有问题。一般情况下step2可以代替step吗?
  • @DanielBuckmaster:是的,一般情况下你可以用step2代替step
  • @pv.: 当然可以,但是step 确实应该改进。可以在这里制作更多的 cmets:projects.scipy.org/scipy/ticket/577
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多