scipy.signal.

lsim#

scipy.signal.lsim(system, U, T, X0=None, interp=True)[源代码]#

模拟连续时间线性系统的输出。

参数:
systemLTI 类的实例或描述系统的元组。

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

  • 1: (lti 的实例)

  • 2: (num, den)

  • 3: (zeros, poles, gain)

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

U类数组

一个描述在每个时间 T 的输入的输入数组(假设在给定时间之间进行插值)。如果存在多个输入,则秩为 2 的数组的每一列代表一个输入。如果 U = 0 或 None,则使用零输入。

T类数组

定义输入和期望输出的时间步长。必须为非负、递增且等间距。

X0类数组,可选

状态向量的初始条件(默认为零)。

interp布尔值,可选

是否对输入数组使用线性(True,默认值)或零阶保持(False)插值。

返回:
T一维 ndarray

输出的时间值。

yout一维 ndarray

系统响应。

xoutndarray

状态向量的时间演变。

注释

如果将 (num, den) 作为 system 传入,则分子和分母的系数都应按降幂顺序指定(例如,s^2 + 3s + 5 将表示为 [1, 3, 5])。

示例

我们将使用 lsim 来模拟应用于信号的模拟贝塞尔滤波器。

>>> import numpy as np
>>> from scipy.signal import bessel, lsim
>>> import matplotlib.pyplot as plt

创建一个截止频率为 12 Hz 的低通贝塞尔滤波器。

>>> b, a = bessel(N=5, Wn=2*np.pi*12, btype='lowpass', analog=True)

生成应用该滤波器的数据。

>>> t = np.linspace(0, 1.25, 500, endpoint=False)

输入信号是三个正弦曲线之和,频率分别为 4 Hz、40 Hz 和 80 Hz。滤波器应主要消除 40 Hz 和 80 Hz 分量,仅留下 4 Hz 信号。

>>> u = (np.cos(2*np.pi*4*t) + 0.6*np.sin(2*np.pi*40*t) +
...      0.5*np.cos(2*np.pi*80*t))

使用 lsim 模拟滤波器。

>>> tout, yout, xout = lsim((b, a), U=u, T=t)

绘制结果。

>>> plt.plot(t, u, 'r', alpha=0.5, linewidth=1, label='input')
>>> plt.plot(tout, yout, 'k', linewidth=1.5, label='output')
>>> plt.legend(loc='best', shadow=True, framealpha=1)
>>> plt.grid(alpha=0.3)
>>> plt.xlabel('t')
>>> plt.show()
../../_images/scipy-signal-lsim-1_00_00.png

在第二个示例中,我们模拟双积分器 y'' = u,其中输入恒定为 u = 1。我们将使用积分器的状态空间表示。

>>> from scipy.signal import lti
>>> A = np.array([[0.0, 1.0], [0.0, 0.0]])
>>> B = np.array([[0.0], [1.0]])
>>> C = np.array([[1.0, 0.0]])
>>> D = 0.0
>>> system = lti(A, B, C, D)

tu 定义要模拟的系统的时间和输入信号。

>>> t = np.linspace(0, 5, num=50)
>>> u = np.ones_like(t)

计算模拟结果,然后绘制 y。正如预期的那样,该图显示了曲线 y = 0.5*t**2

>>> tout, y, x = lsim(system, u, t)
>>> plt.plot(t, y)
>>> plt.grid(alpha=0.3)
>>> plt.xlabel('t')
>>> plt.show()
../../_images/scipy-signal-lsim-1_01_00.png