scipy.signal.
lsim#
- scipy.signal.lsim(system, U, T, X0=None, interp=True)[source]#
模拟连续时间线性系统的输出。
- 参数:
- systemLTI 类的实例或描述系统的元组
以下是元组中元素的数量及其解释
1: (
lti实例)2: (分子, 分母)
3: (零点, 极点, 增益)
4: (A, B, C, D)
- Uarray_like
一个输入数组,描述在每个时间点 T 的输入(假设给定时间点之间进行插值)。如果有多个输入,则该二维数组的每一列代表一个输入。如果 U = 0 或 None,则使用零输入。
- Tarray_like
定义输入及获取输出的时间步长。必须是非负的、递增的且等间距的。
- X0array_like,可选
状态向量的初始条件(默认为零)。
- interpbool, 可选
是否对输入数组使用线性插值(True,默认值)或零阶保持插值(False)。
- 返回:
- T1D ndarray
输出的时间值。
- yout1D 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()
在第二个示例中,我们模拟一个双积分器
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)
t 和 u 定义了要模拟的系统的时间和输入信号。
>>> 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()