DMD in Python 1D

Einführung

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.

Umgebung

Demontageziel

Finden Sie die Periode aus den numerischen Daten der eindimensionalen Sinuswelle. Der Zeitraum beträgt $ 1j $ für komplexe Zahlen. $ y = \sin(x) $ sin_org.png

DMD-Beispiel, das nicht funktioniert

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

dmd_no.png

DMD-Beispiel, das funktioniert

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

dmd_ok.png

Verweise

Recommended Posts

DMD in Python 1D
Ein Liner in Python
Fizzbuzz in Python (in einer Zeile)
Segfo Python in einer Zeile
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Geokodierung in Python
SendKeys in Python
CGI Server (1) Python Edition in einer Zeile
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
Einzeiler webServer (mit CGI) in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
Zerlegen Sie Befehlsargumente in einer Zeile in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
[Python] Bool-Wertinversion in einer Zeile
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Ein Liner, der neunundneunzig in Python ausgibt
Versuchen Sie, zwei Stapel in Python auf einem Array zu implementieren
Ein Liner, der die Kernauslastung von CPU 1 in Python zu 100% erhöht
Mach ein Janken-Spiel in einer Zeile (Python)
In einem Fenster werden mehrere Grafiken angezeigt (Python).
Diejenige, die den Fortschrittsbalken in Python anzeigt
Beispiel, um Python Kivy in eine Datei zu packen
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python