4

在主题中,我正在使用 python/numpy/scipy 进行一些数据分析,并且我想为离散系统创建一个 LTI 类的对象,指定 (num, den, dt) 或 (zeros,poles,增益,dt),甚至(A,B,C,D,dt),但文档从未提及如何做到这一点。

尽管如此,还是有像 dsim/dstep/dimpulse 这样的函数会接受一个 LTI 对象并用它做事,所以我想这是可能的。一旦我有了它,我想做一些事情,比如从一种表示转换为另一种表示(num/den -> zpk -> A、B、C、D),绘制波特图等。

此外,我完全不清楚 (num, den, dt) 表示是否会使用 z 或 z^-1 的系数,因为我认为没有明确的标准。

4

2 回答 2

2

似乎该scipy.signal.lti课程仅适用于连续时间系统。例如,检查文档scipy.signal.dstep,得到:

system : a tuple describing the system.
    The following gives the number of elements in the tuple and
    the interpretation.
      * 3: (num, den, dt)
      * 4: (zeros, poles, gain, dt)
      * 5: (A, B, C, D, dt)

所以论点system不能由 class 的对象lti。虽然scipy.signal.dlsim的文档 确实声明它接受 LTI 实例,但我认为这是错误的。至少使用 scipy 0.10.0,我得到:

TypeError: object of type 'lti' has no len()

所以显然也dlsim期望system参数是一个元组。

于 2013-08-20T06:46:59.720 回答
0

我认为 scipy 中存在一些不一致之处。一方面,您可以使用以下内容定义 lti 系统:

>> sys = sig.lti([1],[1,1])

该系统的类型是:

>> type(sys)
scipy.signal.ltisys.lti

scipy.signal.ltisys 下的许多模拟系统程序适用于这些类型的系统,但不适用于您在平面 scipy 中找到的那些。在那里,您还可以使用以下方式定义不同的系统:

sys_ss = scipy.signal.tf2ss([1],[1,2])
sysd_ss = scipy.signal.cont2discrete(sys_ss,1.0/10)
t,y = scipy.signal.dstep(sysd_ss)

并绘制它,您可以执行以下操作:

plt.plot(t,y[0])

signal.tf2ss 创建的对象只是一个带有状态空间矩阵的元组。要么我不太了解它(我碰巧没有太多的python经验),要么它很乱。

于 2014-03-01T12:26:34.260 回答