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)

Uarray_like

一個輸入陣列,描述每個時間 T 的輸入 (假設在給定時間之間進行插值)。如果有多個輸入,則 rank-2 陣列的每一列代表一個輸入。如果 U = 0 或 None,則使用零輸入。

Tarray_like

定義輸入和期望輸出的時間步長。必須是非負、遞增且等間隔的。

X0array_like,選用

狀態向量的初始條件 (預設為零)。

interpbool,選用

是否對輸入陣列使用線性 (True,預設值) 或零階保持 (False) 插值。

返回:
T1D ndarray

輸出的時間值。

yout1D ndarray

系統響應。

xoutndarray

狀態向量的時間演變。

註解

如果為 system 傳入 (num, den),則分子和分母的係數都應以指數遞減的順序指定 (例如,s^2 + 3s + 5 將表示為 [1, 3, 5])。

範例

我們將使用 lsim 來模擬應用於訊號的類比 Bessel 濾波器。

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

建立截止頻率為 12 Hz 的低通 Bessel 濾波器。

>>> 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