scipy.signal.

cont2discrete#

scipy.signal.cont2discrete(system, dt, method='zoh', alpha=None)[源代码]#

将连续状态空间系统转换为离散状态空间系统。

参数:
system一个描述系统的元组或 lti 的实例

以下给出了元组中元素的数量和解释

  • 1: (lti 的实例)

  • 2: (num, den)

  • 3: (zeros, poles, gain)

  • 4: (A, B, C, D)

dtfloat

离散化时间步长。

methodstr,可选

使用哪种方法

  • gbt: 广义双线性变换

  • bilinear: Tustin 近似(alpha=0.5 的 “gbt”)

  • euler: 欧拉(或前向差分)方法(alpha=0 的 “gbt”)

  • backward_diff: 后向差分(alpha=1.0 的 “gbt”)

  • zoh: 零阶保持(默认)

  • foh: 一阶保持(版本新增:1.3.0

  • impulse: 等效脉冲响应(版本新增:1.3.0

alpha[0, 1] 范围内的浮点数,可选

广义双线性变换加权参数,仅当 method="gbt" 时指定,否则将被忽略

返回:
sysd包含离散系统的元组

根据输入类型,输出将采用以下形式

  • 传递函数输入为 (num, den, dt)

  • 零极点增益输入为 (zeros, poles, gain, dt)

  • 状态空间系统输入为 (A, B, C, D, dt)

注释

默认情况下,该例程使用零阶保持 (zoh) 方法执行转换。 或者,可以使用广义双线性变换,其中包括常见的 Tustin 双线性近似、欧拉方法技术或后向差分技术。

零阶保持 (zoh) 方法基于 [1],广义双线性近似基于 [2][3],一阶保持 (foh) 方法基于 [4]

参考文献

[3]

G. Zhang, X. Chen, and T. Chen, Digital redesign via the generalized bilinear transformation, Int. J. Control, vol. 82, no. 4, pp. 741-754, 2009. (https://www.mypolyuweb.hk/~magzhang/Research/ZCC09_IJC.pdf)

[4]

G. F. Franklin, J. D. Powell, and M. L. Workman, Digital control of dynamic systems, 3rd ed. Menlo Park, Calif: Addison-Wesley, pp. 204-206, 1998.

示例

我们可以将连续状态空间系统转换为离散状态空间系统

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.signal import cont2discrete, lti, dlti, dstep

定义一个连续状态空间系统。

>>> A = np.array([[0, 1],[-10., -3]])
>>> B = np.array([[0],[10.]])
>>> C = np.array([[1., 0]])
>>> D = np.array([[0.]])
>>> l_system = lti(A, B, C, D)
>>> t, x = l_system.step(T=np.linspace(0, 5, 100))
>>> fig, ax = plt.subplots()
>>> ax.plot(t, x, label='Continuous', linewidth=3)

使用几种方法将其转换为离散状态空间系统。

>>> dt = 0.1
>>> for method in ['zoh', 'bilinear', 'euler', 'backward_diff', 'foh', 'impulse']:
...    d_system = cont2discrete((A, B, C, D), dt, method=method)
...    s, x_d = dstep(d_system)
...    ax.step(s, np.squeeze(x_d), label=method, where='post')
>>> ax.axis([t[0], t[-1], x[0], 1.4])
>>> ax.legend(loc='best')
>>> fig.tight_layout()
>>> plt.show()
../../_images/scipy-signal-cont2discrete-1.png