Dynamic Mode Decomposition (DMD) wurde 2008 angekündigt [^ 1] [^ 2]. DMD ist eine Zerlegungsmethode, die Hauptkomponentenanalyse und Fourier-Transformation kombiniert und Daten in Merkmale in dimensionaler und zeitlicher Richtung in Merkmale aufteilen kann.
Die Kommentarartikel, auf die ich mich bezog, sind unten.
Die Eigenwerte und Eigenvektoren von DMD sind komplexe Zahlen, und die komplexen Komponenten der Eigenwerte repräsentieren die Zerlegung in Zeitrichtung. Es besteht jedoch das Problem, dass es nicht gut getrennt werden kann, wenn es sich um eine eindimensionale stehende Welle handelt. Die Erklärung finden Sie im folgenden Artikel.
Ich glaube nicht, dass DMD für eindimensionale Daten verwendet wird, aber da der Python-Code noch nicht veröffentlicht wurde, werde ich ihn als Referenz beschreiben. Hier sind einige Beispiele, die nicht gut zerlegt werden können, und einige, die es können. Das Basispapier ist Tu 2014 [^ 3] und der Code ist DMD Book. Es basiert auf dem Matlab-Code von.
Windows 10 home
Anaconda(Python 3.7.6)
Numpy(1.18.1)
Finden Sie die Periode aus den numerischen Daten der eindimensionalen Sinuswelle. Der Zeitraum beträgt $ 1j $ für komplexe Zahlen.
In dem erfolglosen Beispiel wird der Eigenwert zu einer reellen Zahl, da die Daten nur eindimensional sind, und es erscheint keine komplexe Zahl. Daher kann die periodische Komponente nicht zerlegt werden.
import numpy as np
import numpy.linalg as LA
import matplotlib.pyplot as plt
%matplotlib inline
t = np.arange(0, 10.01, 0.01)
x = np.sin(t)
dt = t[2] - t[1]
#Datenmatrix
X1 = x[:-1]
X2 = x[1:]
#SVD
U,S,Vh = LA.svd(X1[np.newaxis,:],False)
V = Vh.T
#Atilde mit A reduziert um einen linken Singularvektor
Atilde = np.dot(np.dot(np.dot(U.T, X2[np.newaxis,:]), V), LA.inv(np.diag(S)))
#Finden Sie den Eigenwert und den Eigenvektor von Atilde
Lam, W = LA.eig(Atilde)
print("Eigenwert:",Lam)#Lam:1.00025541 ist eine reelle Zahl
#Finden Sie den Eigenvektor von A aus dem Eigenvektor von Atilde
Phi = np.dot(np.dot(np.dot(X2[np.newaxis,:], V), LA.inv(np.diag(S))), W)
#Diskret bis kontinuierlich exp(**)von**Ich suche
Omega = np.log(Lam)/dt
#Stellen Sie die ursprüngliche Funktion von Omega und Phi wieder her.
b = np.dot(LA.pinv(Phi * np.exp(Omega * t)).T, x)
x_dmd = b * Phi * np.exp(Omega * t)
plt.plot(t, x_dmd[0,:])
plt.show()
Es wird in Erklärender Artikel vorgestellt, aber die Daten werden in zeitliche Richtung verschoben. Machen Sie eine andere Dimension und machen Sie es zweidimensionale Daten. Auf diese Weise erscheint eine komplexe Komponente im Eigenwert, und $ \ sin (x) $ kann in den numerischen Daten gefunden werden. Das ist es.
import numpy as np
import numpy.linalg as LA
import matplotlib.pyplot as plt
%matplotlib inline
t = np.arange(0, 10.01, 0.01)
x = np.sin(t)
dt = t[2] - t[1]
#Datenmatrix
#Der Hauptunterschied ist hier. Es ist zweidimensional.
X_aug1 = np.array([x[:-2], x[1:-1]])
X_aug2 = np.array([x[1:-1], x[2:]])
#SVD
U,S,Vh = LA.svd(X_aug1,False)
V = Vh.conj().T
#Atilde mit A reduziert um einen linken Singularvektor
#U nimmt ein komplexes Konjugat und macht es zu einer Translokationsmatrix.
Atilde = np.dot(np.dot(np.dot(U.conj().T, X_aug2), V), LA.inv(np.diag(S)))
#Finden Sie den Eigenwert und den Eigenvektor von Atilde
Lam, W = LA.eig(Atilde)
print("Eigenwert:", Lam)#Lam:[0.9995+0.00999983j 0.9995-0.00999983j]Komplexe Zahl
#Finden Sie den Eigenvektor von A aus dem Eigenvektor von Atilde
Phi = np.dot(np.dot(np.dot(X_aug2, V), LA.inv(np.diag(S))), W)
#Diskret bis kontinuierlich exp(**)von**Ich suche
Omega = np.diag(np.log(Lam)/dt)
print("Omega:", Omega)#Nur für den Fall, es wird 1j sein
#Stellen Sie die ursprüngliche Funktion von Omega und Phi wieder her.
#Was Sie tun, ist das gleiche wie in 1D, aber der Schreibstil ist anders.
b = np.dot(LA.pinv(Phi), X_aug1[:,0])
x_dmd = np.zeros([2,len(t)], dtype='complex')
for i, _t in enumerate(t):
x_dmd[:,i] = np.dot(np.dot(Phi, np.exp(Omega * _t)), b)
plt.plot(t, x_dmd[0,:].real)
plt.show()
Recommended Posts