Schnelle und einfache diskrete 2D-Helmholtz-Hodge-Zerlegung mit FFTs?


8

Für einen albernen Bildschirmschoner, den ich entwickeln möchte, möchte ich zufällig ein divergenzfreies 2D-Array von 2D-Vektoren generieren und dann ein linienintegrales Faltungsdiagramm erstellen. Ich habe gehört , dass ein Weg , dies zu tun ist , zufälliges Rauschen zu erzeugen, und dann die solenoidal Komponente seiner Helmholtz-Hodge Zersetzung herausragen. Um dies zu tun, habe ich versucht, die folgenden Argumente zu verwenden:1

Eine Funktion hat eine Helmholtz-Hodge-Zerlegung wobei und wobei sind. Nehmen wir zunächst an, dass die harmonische Komponente verschwindet.f:R2R22

f=h+ϕ+Jψ
J=(0110)
ϕ,ψh

Im Fourierraum wird dies zu und wir können eine Solenoidprojektion definieren Operator im Fourierraum als , der über eine Funktion auf seine Solenoidkomponente projiziert

Ff=ikϕ^iJkψ^
P=Ikkkk
F1PFf=Jψ.

Ich habe dann versucht, dies in Mathematica zu implementieren und es auf ein Zufallsarray anzuwenden . Zuerst generiere ich das zufällige Array und wende die FFT auf jede der beiden Komponenten an:21×21×2

arr = RandomReal[{-1, 1}, {2, 21, 21}];
fArr = Fourier /@ arr;

Ich definiere dann als Funktion des Array-Index:k

k[k1_, k2_] := Mod[{k1 - 1, k2 - 1}, 21, -10]/21;

Dann führe ich die Projektion auf die Fourier-Komponenten durch (die Singularität bei wird mithilfe einer Anweisung in Ruhe gelassen ):k=0If

dat = Transpose[
   Table[If[k1 == 1 && k2 == 1, fArr[[;; , k1, k2]], 
     fArr[[;; , k1, k2]] - 
      k[k1, k2] (k[k1, k2].fArr[[;; , k1, k2]])/(k[k1, k2].k[k1, 
           k2])], {k1, 21}, {k2, 21}], {2, 3, 1}];

Dann habe ich die beiden Komponenten iFFT:

projArr = InverseFourier /@ dat;

Dies ergibt ein rein reales Array, und ich würde naiv erwarten, dass das Ergebnis eine Annäherung an . Meine Frage ist:Jψ

  • Inwiefern nähert sich das Ergebnis ?Jψ

Angeblich ist die Helmholtz-Hodge-Zerlegung von 2D-Daten eine nicht triviale Aufgabe, da Chris Beaumonts HH_DECOMP- Routine FFTs verwenden soll, um die Helmholtz-Hodge-Zerlegung durchzuführen, aber er sagt auch (in den Kommentaren oben im Code), dass die Methode scheint ungenau. Ebenso gibt es kompliziertere Variationsmethoden, um Helmholtz-Hodge-Zerlegungen von 2D-Daten durchzuführen , was darauf hindeutet, dass die einfachere FFT-Methode irgendwie unzureichend ist. Warum? Was macht die FFT-Methode falsch? Und ist es falsch anzunehmen, dass die harmonische Komponente für mein zufälliges Rauschen verschwindet?3

(1): Stabile Flüssigkeiten , Jos Stam.

(2): Merkmalserkennung in Vektorfeldern mit der Helmholtz-Hodge-Zerlegung , Alexander Wiebel, Seite 12.

(3): Diskrete Multiskalen-Vektorfeldzerlegung , Yiying Tong.


Ich werde gleich über Ihre eigentliche Frage nachdenken, aber warum nicht einfach ein zufälliges generieren und ? Weiterführende Literatur: " Curl Noise for Procedural Fluid Flow ", R. Bridson et al. ψf=Jψ

Antworten:


5

Der einfachste Weg, eine divergenzfreie 2D-Funktion zu generieren, ist die Verwendung der Stream-Funktion . Woψ

u=ψyandv=ψx

Sobald Sie einen zufälligen generiert haben , können Sie Ihre Fourier-Darstellung (oder endliche Differenzen) verwenden, um die beiden Ableitungen zu berechnen. Ich habe so etwas jedoch nicht mit wirklich zufälligen Eingaben versucht. Sie können davon profitieren, wenn Sie mit einer weicheren, aber zufälligen Eingabe beginnen (wie einer Summe von Sinusfunktionen mit zufälligen Frequenzen und Koeffizienten).ψ


Vielen Dank, wie Sie sagen, die Verwendung von wobei eine Summe von Gaußschen oder etwas anderem ist, würde definitiv funktionieren und einfach sein und wahrscheinlich gut aussehen. Um die Glätte zu gewährleisten, besteht eine zweite Möglichkeit darin, wobei ein Tiefpassfilter und zufälliges Rauschen ist , was ich auch gefunden habe funktioniert gut. Eine dritte Möglichkeit, die auch periodische Randbedingungen sicherstellt, besteht darin, eine gewichtete Summe mehrerer der realen Solenoid-Basisfunktionen . JψψF1LPFfLf2Jk^N1N2cos(2πkr+τ)
DumpsterDoofus

4

Sie haben in Ihrem Beitrag mehrere Fragen gestellt. Obwohl Bill eine Lösung für das zugrunde liegende Problem bereitgestellt hat, sollte meiner Meinung nach jemand auch einige Dinge zu Ihren gestellten Fragen sagen.

Inwiefern nähert sich das Ergebnis ?Jψ

Wenn Sie das Eingabearray als aliasfreie Abtastung eines periodischen, bandbegrenzten Vektorfeldes interpretieren , ist das Ergebnis genau die Abtastung von . Schließlich ist die FFT des abgetasteten Arrays im Wesentlichen die Fourier-Reihe der zugrunde liegenden periodischen Funktion (unter der Annahme einer ausreichenden Abtastung).f=h+ϕ+Jψh+Jψ

Da periodisch ist, ist lediglich ein konstantes Vektorfeld.fh

Chris Beaumonts HH_DECOMP-Routine soll FFTs verwenden, um eine Helmholtz-Hodge-Zerlegung durchzuführen, aber er sagt auch (in den Kommentaren oben im Code), dass die Methode ungenau erscheint.

Ich bin nicht sicher, was dort los ist, weil ich IDL nicht lesen kann, aber es sieht so aus, als ob die Testvektorfelder nicht periodisch sind?

Ebenso gibt es kompliziertere Variationsmethoden, um Helmholtz-Hodge-Zerlegungen von 2D-Daten durchzuführen, was darauf hindeutet, dass die einfachere FFT-Methode irgendwie unzureichend ist. Warum?

Ich denke, du machst dir zu viele Sorgen. Auf der zweiten Seite des von Ihnen zitierten Papiers heißt es: "Die diskrete Helmholtz-Hodge-Zerlegung auf regulären Gittern wurde bereits in Grafiken verwendet (siehe z. B. [25, 10]) und ist mit einem Finite-Differenzen-Ansatz relativ einfach zu implementieren Es ist jedoch viel schwieriger, eine praktische und genaue Methode für beliebige Gitter zu entwerfen. "

Was macht die FFT-Methode falsch?

Wenn Sie periodische Randbedingungen haben, nichts. Unter diesen Bedingungen ergeben Spektralmethoden wie diese eine exponentielle Konvergenz im Vergleich zur Polynomkonvergenz von Finite-Differenzen-Methoden. Es ist jedoch schwieriger, sie auf beliebige Geometrien anzuwenden.

Und ist es falsch anzunehmen, dass die harmonische Komponente für mein zufälliges Rauschen verschwindet?

Technisch gesehen ja, aber im periodischen Fall ist das einzig mögliche harmonische Vektorfeld eine Konstante. Sie machen es also gut, wenn Sie die DC-Komponente in Ruhe lassen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.