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()
在第二個範例中,我們模擬雙重積分器
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()