scipy.signal.

lsim#

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

Simuliert die Ausgabe eines kontinuierlichen linearen Systems.

Parameter:
systemeine Instanz der LTI-Klasse oder ein Tupel, das das System beschreibt.

Das Folgende gibt die Anzahl der Elemente im Tupel und die Interpretation an.

  • 1: (Instanz von lti)

  • 2: (Zähler, Nenner)

  • 3: (Nullstellen, Pole, Verstärkung)

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

Uarray_like

Ein Eingangsarray, das die Eingabe zu jeder Zeit T beschreibt (Interpolation wird zwischen gegebenen Zeiten angenommen). Wenn es mehrere Eingänge gibt, dann repräsentiert jede Spalte des Rang-2-Arrays einen Eingang. Wenn U = 0 oder None, wird eine Nulleingabe verwendet.

Tarray_like

Die Zeitschritte, zu denen die Eingabe definiert ist und zu denen die Ausgabe gewünscht wird. Muss nicht-negativ, aufsteigend und gleichmäßig beabstandet sein.

X0array_like, optional

Die Anfangsbedingungen für den Zustandsvektor (standardmäßig Null).

interpbool, optional

Ob für das Eingangsarray eine lineare (True, Standard) oder eine Zero-Order-Hold (False) Interpolation verwendet werden soll.

Rückgabe:
T1D ndarray

Zeitwerte für die Ausgabe.

yout1D ndarray

Systemantwort.

xoutndarray

Zeitentwicklung des Zustandsvektors.

Hinweise

Wenn (Zähler, Nenner) für system übergeben wird, sollten die Koeffizienten für Zähler und Nenner in absteigender Exponentenreihenfolge angegeben werden (z. B. s^2 + 3s + 5 würde als [1, 3, 5] dargestellt werden).

Beispiele

Wir werden lsim verwenden, um einen analogen Bessel-Filter auf ein Signal anzuwenden.

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

Erstellen Sie einen Tiefpass-Bessel-Filter mit einer Grenzfrequenz von 12 Hz.

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

Generieren Sie Daten, auf die der Filter angewendet wird.

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

Das Eingangssignal ist die Summe von drei Sinuskurven mit Frequenzen von 4 Hz, 40 Hz und 80 Hz. Der Filter sollte die Komponenten bei 40 Hz und 80 Hz weitgehend eliminieren und nur das 4-Hz-Signal übrig lassen.

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

Simulieren Sie den Filter mit lsim.

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

Plotten Sie das Ergebnis.

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

In einem zweiten Beispiel simulieren wir einen doppelten Integrator y'' = u mit einer konstanten Eingabe u = 1. Wir werden die Zustandsraumdarstellung des Integrators verwenden.

>>> 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 und u definieren die Zeit und das Eingangssignal für das zu simulierende System.

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

Berechnen Sie die Simulation und plotten Sie dann y. Wie erwartet zeigt der Plot die Kurve 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