Ich versuche, die Advektionsgleichung zu lösen, aber es erscheint eine seltsame Schwingung in der Lösung, wenn die Welle von den Grenzen reflektiert wird. Wenn jemand dieses Artefakt schon einmal gesehen hat, wäre ich daran interessiert, die Ursache zu kennen und wie man sie vermeidet!
Dies ist ein animiertes GIF, das in einem separaten Fenster geöffnet wird, um die Animation anzuzeigen (es wird nur einmal abgespielt oder nicht, sobald es zwischengespeichert wurde!)
Beachten Sie, dass die Ausbreitung sehr stabil zu sein scheint, bis die Welle an der ersten Grenze zu reflektieren beginnt. Was denkst du könnte hier passieren? Ich habe einige Tage damit verbracht, meinen Code zu überprüfen, und kann keine Fehler finden. Es ist seltsam, weil es zwei sich ausbreitende Lösungen zu geben scheint: eine positive und eine negative; nach der Überlegung von der ersten Grenze. Die Lösungen scheinen sich entlang benachbarter Maschenpunkte zu bewegen.
Die Implementierungsdetails folgen.
Die Advektionsgleichung,
Dabei ist die Ausbreitungsgeschwindigkeit.
Der Crank-Nicolson ist eine bedingungslose (pdf-Link) stabile Diskretisierung für die Advektionsgleichung, vorausgesetzt, dass sich im Raum langsam ändert (enthält bei Fouriertransformation nur niederfrequente Komponenten).
Die Diskretisierung, die ich angewendet habe, ist,
Wenn Sie die Unbekannten auf die rechte Seite setzen, können Sie dies in linearer Form schreiben.
Dabei gilt: (um den Zeitmittelwert zu berechnen, der zwischen dem gegenwärtigen und dem zukünftigen Punkt gleichmäßig gewichtet ist) und .r = v Δ t
Diese Mengen von Gleichungen haben die Matrixform , wobei
Die Vektoren und sind die bekannten und unbekannten Größen, nach denen wir auflösen wollen.u n + 1
Ich wende dann geschlossene Neumann-Randbedingungen an der linken und rechten Grenze an. Mit geschlossenen Grenzen meine ich an beiden Schnittstellen. Für geschlossene Grenzen stellt sich heraus, dass (ich werde meine Arbeit hier nicht zeigen) wir nur die obige Matrixgleichung lösen müssen. Wie von @DavidKetcheson ausgeführt, beschreiben die obigen Matrixgleichungen tatsächlich Dirichlet-Randbedingungen . Für Neumann-Randbedingungen
Aktualisieren
Das Verhalten scheint ziemlich unabhängig von der Auswahl der von mir verwendeten Konstanten zu sein, aber dies sind die Werte für das Diagramm, das Sie oben sehen:
- = 2
- dx = 0,2
- dt = 0,005
- = 2 (Gaußsches hwhm)
- = 0,5
Update II
Bei einer Simulation mit einem Diffusionskoeffizienten ungleich Null, (siehe Kommentare unten), geht die Schwingung weg, aber die Welle reflektiert nicht mehr !? Ich verstehe nicht warum?