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?
quelle
Antworten:
Die Gleichung, die Sie lösen, lässt keine richtigen Lösungen zu, daher gibt es für diese Gleichung keine reflektierende Randbedingung . Wenn Sie die Merkmale berücksichtigen, werden Sie feststellen, dass Sie nur an der rechten Grenze eine Randbedingung auferlegen können. Sie versuchen, an der linken Grenze eine homogene Dirichlet-Randbedingung aufzuerlegen, die mathematisch ungültig ist.
Um es noch einmal zu wiederholen: Die Methode der Eigenschaften besagt, dass die Lösung entlang einer beliebigen Linie der Form für eine beliebige Konstante konstant sein muss . Somit wird die Lösung entlang der linken Grenze durch die Lösung zu früheren Zeitpunkten innerhalb Ihrer Problemdomäne bestimmt. Sie können dort keine Lösung aufzwingen.x−νt=C C
Im Gegensatz zu der Gleichung, Ihr numerisches Schema nicht zugeben rechts laufende Lösungen. Die nach rechts gerichteten Moden werden als parasitäre Moden bezeichnet und umfassen sehr hohe Frequenzen. Beachten Sie, dass die rechtsgerichtete Welle ein Sägezahnwellenpaket ist, das den höchsten Frequenzen zugeordnet ist, die auf Ihrem Gitter dargestellt werden können. Diese Welle ist ein rein numerisches Artefakt, das durch Ihre Diskretisierung erzeugt wurde.
Zur Hervorhebung: Sie haben nicht das vollständige Problem mit den anfänglichen Grenzwerten aufgeschrieben, das Sie zu lösen versuchen. Wenn Sie dies tun, wird klar sein, dass es sich nicht um ein mathematisch gut gestelltes Problem handelt.
Ich bin froh, dass Sie dies hier gepostet haben, da es ein schönes Beispiel dafür ist, was passieren kann, wenn Sie ein Problem diskretisieren, das nicht gut gestellt ist, und das Phänomen der parasitären Modi. Ein großes +1 für deine Frage von mir.
quelle
Aus den obigen Antworten habe ich viel gelernt. Ich möchte diese Antwort einschließen, weil ich glaube, dass sie unterschiedliche Einblicke in das Problem bietet.
Dies erzeugt einen Impuls, der nach rechts läuft, bis er am rechten Rand verschwindet.
Hier klicken für Animation auf Dirichlet am linken Rand
Ich bekomme immer noch ein Geräusch, das ich nicht verstehen kann (könnte hier bitte jemand helfen?)
Die andere Möglichkeit besteht darin, periodische Randbedingungen festzulegen. Das heißt, anstatt die Dirichlet-Randbedingung auf der linken Seite aufzuerlegen, können wir das Wellenpaket auferlegen, das mit der Grenze auf der linken Seite übereinstimmt. Das ist:
Jedocha−c(t−t0)<a für t>t0 c>0 [a,b] b−a a−c(t−t0)+b−a=a+b(t−t0) u(a,t0)=p[b−c(t−t0]
Dieser Link zeigt, was ich als periodische Randbedingungen bezeichnen würde.
Ich habe die Animationen in Python erstellt und das Schema ist ein Crank-Nicholson-Schema, wie in der Frage hier angegeben.
Ich kämpfe immer noch mit dem Rauschmuster, nachdem die Welle die erste (rechte) Grenze erreicht hat.
quelle