Wie debuggen Sie numerischen Code, was könnte die Ursache für diesen oszillierenden Fehler sein?

16

Leise kann aus Erfahrung viel Einsicht gewonnen werden, ich habe mich nur gefragt, ob jemand etwas Ähnliches schon einmal gesehen hat. Das Diagramm zeigt die Anfangsbedingung (grün) für die Advektions-Diffusions-Gleichung, dann die Lösung bei Iteration 200 (blau) und dann erneut bei Iteration 400 (rot).

Oszillatorischer Fehler

Die Lösung der Advektions-Diffusions-Gleichung explodiert nach einigen Iterationen. Die Pécletzahl und die CFL Bedingung erfüllt ist , , so dass die Gleichungen sollten stabil sein. Ich gehe davon aus, dass ich einen Fehler im Zahlencode habe.μ0.07C0.0015

Hintergrund. Die Diskretisierung ist sowohl für die Advektion als auch für die Diffusion ein zentraler Unterschied. Ich glaube, dies ist die erste Ordnung der Advektion und die zweite Ordnung der Diffusion. Ich habe dies mit einem Finite-Volumen-Ansatz (zum ersten Mal) implementiert, bei dem die Werte der Koeffizienten (Geschwindigkeit und Diffusionskoeffizient) an den Zellflächen durch lineare Interpolation aus den Zelldurchschnitten ermittelt werden. Ich wende die Robin-Randbedingung auf die linke und rechte Fläche an und setze den Fluss an den Grenzen auf Null.

Wie debuggen Sie Ihren numerischen Code? Hat jemand so etwas schon mal gesehen, wo könnte man anfangen, danach zu suchen?

Aktualisieren

Aktualisieren

Einfacher geht es nicht! Ich habe gerade einen Vorzeichenfehler beim Diffusionsbegriff gemacht. Es ist seltsam, ich bin mir sicher, dass ich den Fehler nicht gefunden hätte, wenn ich ihn nicht gepostet hätte! Wenn jemand Tipps zum Debuggen seines Zahlencodes geben möchte, bin ich immer noch interessiert. Ich habe keine Methode, es ist ein bisschen verpasst und ich versuche immer wieder Dinge, um Anhaltspunkte zu bekommen, aber dieser Prozess kann (manchmal) Wochen dauern.

Beweis, dass es funktioniert ( Hinweis : Bei der Methode mit endlichem Volumen müssen Sie zur Berechnung der Fläche nur eine Summe aus Breite Höhe für alle Zellen berechnen , wenn Sie eine Integrationsmethode wie numpy.trapz verwenden und Ihre Ergebnisse die numerische Methode einschließen Fehler der Trapezmethode). Was passiert hier? Es gibt konstante Geschwindigkeits- und Diffusionskoeffizienten, jedoch mit geschlossenen Randbedingungen. Daher sehen wir an der Grenze das Gleichgewicht zwischen dem nach rechts drückenden Geschwindigkeitsfeld und dem nach links drückenden Diffusionsfeld.×

Advektions-Diffusions-Gleichung mit geschlossenen Randbedingungen nach der Finite-Volumen-Methode.

Boyfarrell
quelle
2
Welche Art von Diskretisierung verwenden Sie? Welche Bestellmethode? Was sind Ihre Randbedingungen?
Geoff Oxberry
Danke @GeoffOxberry, ich habe mit mehr Details aktualisiert. Obwohl, um wirklich zu verstehen, was ich getan habe, können Sie meine Laborbuchnotizen auf dem Github-Link oben lesen.
Boyfarrell
2
Ich bewundere Ihre bewusste Herangehensweise an dieses Problem. Sind diese Diagramme aus den zeitabhängigen Gleichungen? Wenn ja, was beobachten Sie für ? θ=0,0.5,1
Jan
1
Ich habe das versucht, es gibt im Großen und Ganzen das gleiche. Aber jetzt fühle ich mich dumm, ich habe auf einen Vorzeichenfehler getestet ... das Setzen von und bewirkt, dass es funktioniert (im Diffusionslimit, ja, negative Diffusion bewirkt, dass es funktioniert!). Zum späteren Nachschlagen könnte das oben Gesagte mit einem Vorzeichenfehler übereinstimmen. Noch nicht vollständig getestet, daher melde ich mich bald wieder! PS. Danke für das Kompliment :)a=0d<0
Boyfarrell

Antworten:

9

Ich habe hier einige meiner Erfahrungen mit dem Debuggen numerischer Codes gesammelt: deal.II FAQ: Debugging . Ich weiß nicht, ob Ihnen das in diesem speziellen Fall geholfen hätte, aber vielleicht auch in anderen.

Wolfgang Bangerth
quelle
Hallo, dieser Link ist beim Umzug des Projekts kaputt gegangen - ist das jetzt der richtige? github.com/dealii/dealii/wiki/…
Hyperpallium
Ja, das ist die richtige. Vielen Dank für die Aktualisierung in Ihrem Kommentar!
Wolfgang Bangerth