Wie testet man eine Implementierung eines numerischen ODE-Lösers?


26

Ich beginne mit der Arbeit an einer Softwarebibliothek numerischer ODE-Löser und habe Probleme damit, Tests für die Löserimplementierungen zu formulieren. Mein Ziel ist es, dass die Bibliothek schließlich Löser für nicht steife und steife Probleme sowie mindestens einen impliziten Löser (mehr oder weniger den Fähigkeiten der odeRoutinen in Matlab gleichwertig ) enthält, sodass die Testmethodik die verschiedenen berücksichtigen muss Arten von Problemen und Kriterien für verschiedene Löser.

Mein Problem ist jetzt, dass ich nicht weiß, wo ich mit diesem Testen beginnen soll. Ich kann mir verschiedene Möglichkeiten vorstellen, um die Ausgabe eines Algorithmus zu testen:

  • Prüfen Sie, ob ein Problem mit einer analytischen Lösung vorliegt, und stellen Sie sicher, dass die numerische Lösung für alle zurückgegebenen Datenpunkte innerhalb der Toleranzwerte liegt. Dies erfordert Kenntnisse über eine Reihe von analytischen Problemen, die alle Eigenschaften aufweisen, mit denen die verschiedenen Löser arbeiten sollen (Steifheit, implizite Probleme usw.), die ich nicht habe, zumindest nicht von oben.

    Diese Methode testet die Ergebnisse einer Lösungsmethode. Somit gibt es keine Garantie, dass der Löser tatsächlich funktioniert, sondern nur, dass er für das gegebene Testproblem funktioniert . Ich vermute daher, dass eine große Anzahl von Testproblemen erforderlich ist, um sicher zu überprüfen, ob der Löser funktioniert.

  • Berechnen Sie die Lösung manuell für einige Zeitschritte mit den Algorithmen, die ich implementieren möchte, und führen Sie dann dasselbe mit den Solvern aus und überprüfen Sie, ob die Ergebnisse identisch sind. Dies erfordert keine Kenntnis der wahren Lösung des Problems, erfordert jedoch eine Menge praktischer Arbeit.

    Diese Methode, die auf der anderen Seite prüft nur den Algorithmus , was in Ordnung von mir ist - wenn jemand anderes hat bewiesen, dass 4 th Ordnung Runge-Kutta funktioniert, ich habe keinen verzweifeltes Bedürfnis fühlen. Ich mache mir jedoch Sorgen, dass die Formulierung von Testfällen sehr umständlich sein wird, da ich keine gute Methode zum Generieren der Testdaten kenne (außer vielleicht von Hand, was eine Menge Arbeit sein wird ...).

Beide oben genannten Methoden haben nach meinem derzeitigen Kenntnisstand schwerwiegende Einschränkungen: Ich kenne keine guten Testprobleme für die erste und keine guten Methoden zum Generieren von Testdaten für die zweite.

Gibt es andere Möglichkeiten, numerische ODE-Löser zu überprüfen? Gibt es andere Kriterien für die Implementierung, die überprüft werden sollten? Gibt es gute (kostenlose) Ressourcen zum Testen von ODE-Solvern 1 ?

EDIT:
Da diese Frage sehr weit gefasst ist, möchte ich ein wenig klären. Die Testsuite, die ich erstellen möchte, erfüllt zwei Hauptzwecke:

  1. Überprüfen, ob die Löser für die Probleme, die sie lösen sollen, wie erwartet funktionieren. Mit anderen Worten, ein Löser für nicht steife Probleme kann ein steifes Problem mit Bananen lösen, sollte aber bei nicht steifen Problemen gute Ergebnisse erzielen. Wenn es in der Bibliothek andere Löser gibt, die eine höhere Genauigkeit bieten, ist es möglicherweise nicht erforderlich, sehr genaue Ergebnisse zu erzwingen - nur "genau genug". Ein Teil meiner Frage ist daher, welche Tests für welche Löser verwendet werden sollten. oder zumindest, wie man sich dazu entschließen sollte.

  2. Sanity Test bei der Installation der Bibliothek. Diese Tests müssen (sollten) nicht aufwendig oder zeitaufwändig sein. Dies sind nur die Grundlagen, die in weniger als 5 Sekunden ausgeführt werden können, die den Benutzer jedoch alarmieren, wenn etwas von den Diagrammen abweicht. Daher brauche ich auch eine Möglichkeit, Tests zu erstellen, die sehr einfach sind, aber trotzdem etwas über den Zustand der Bibliothek aussagen.


1 Ja, ich habe meine Augen ausgegoogelt, aber das meiste, was ich finde, sind Vorlesungsunterlagen mit sehr trivialen Beispielen, mit Ausnahme des CWI-ODE-Testsets von Bari, von dem ich nicht weiß, ob oder wie ich könnte für meine Zwecke verwenden, da es weitaus komplexere Löser als die behandelt, die ich testen möchte ...


2
@ user75064: Auf jeden Fall! Ich wusste nicht, dass es diese Seite überhaupt gibt =) Irgendwelche Mods, zögern Sie nicht, mich dorthin zu migrieren.
Tomas Aschan

In dieser Antwort auf Math Stack Exchange finden Sie Links zu anderen Testsätzen .
Geoff Oxberry

@GeoffOxberry: Ich habe schon einige davon gefunden. Die meisten davon sind in FORTRAN implementiert und gehen davon aus, dass der Leser Löser in derselben Sprache testen möchte, was eine weitere Fehlerquelle hinzufügt ... Ein paar (die Artikel in DETEST suite) haben sich jedoch als sehr nützlich erwiesen. Vielen Dank!
Tomas Aschan

Antworten:


12

Dies ist eine sehr umfassende Frage, und ich möchte Ihnen einige Überlegungen anstellen (einige sind bereits in Ihrem Beitrag enthalten, werden jedoch der Vollständigkeit halber hier wiederholt).

Umfang der Probleme

  • Sie müssen die Schnittstelle definieren, über die Probleme angegeben werden.
  • Werden Sie Parameter zulassen, die festgelegt werden können oder für Lösungen variieren können?
  • ϵ
  • Wirst du unendliche Präzision zulassen?
  • Testen Sie die Geschwindigkeit und Empfindlichkeit auf numerische Präzision?
  • Haben Sie zwei (vielleicht mehrere) Bibliotheken ausgewählt, die bereits existieren, um die Ergebnisse zu vergleichen?
  • Wie werden Sie Stoppkriterien auswählen, verschiedene Methoden anwenden und den Benutzer seine eigenen auswählen oder definieren lassen?
  • Werden Sie Fehler mit verschiedenen Maßnahmen messen und dem Benutzer erlauben, diese ein- und auszuschalten?
  • Haben Sie sich die professionellen Pakete wie Computer-Algebra-Systems (CAS) angeschaut und alle Möglichkeiten verstanden, die sie bieten?
  • Möchten Sie die Anzeige von Ergebnissen und / oder Vergleichen und / oder Darstellungen zulassen?

Problemempfehlungen

  • Sie müssen eine Testspezifikation schreiben, in der die Ursache der Probleme, der Umfang der getesteten Probleme, die Ergebnisse und die Metriken für die Ausführung der Routinen festgelegt werden.
  • Ich würde mich auf jeden Fall an andere Bibliotheken wenden, die es bereits gibt, um herauszufinden, welche Probleme sie verwenden (möglicherweise Testdateien).
  • Ich würde in Hochschulbibliotheken gehen und Bücher über ODEs durchgehen und Probleme aller Art herausfinden, solche mit bekannter geschlossener Form oder nur numerischen Lösungen.
  • Fall 1: Wir möchten so viele Variationen von Lösungsproblemen in geschlossener Form wie möglich haben, um exakte mit numerischen Ergebnissen zu vergleichen.
  • Fall 2: Ich würde zu jedem numerischen Analysebuch gehen, das ich finden, die bearbeiteten Beispiele erfassen und duplizieren kann. Ich würde zusätzlich die Problemmengen erfassen, insbesondere diejenigen, die eine Pathologie aufweisen, die in den meisten Büchern vorhanden ist (Sensibilität für diese oder jene Arten).
  • Fall 3: Ich würde zu verschiedenen Zweigen der angewandten Mathematik gehen, wie Physik, Ökologie, Biologie, Ökonomie, et. al und erfassen Sie Probleme aus jeder dieser Domänen, um zu überprüfen, ob Ihre Spezifikationssprache für Probleme solche Beispiele zulässt.
  • Fall 4: Ich recherchiere Artikel / Zeitschriften, die die nützlichsten Beispiele enthalten, bei denen der jeweilige Autor einen bestimmten Ansatz modifizieren musste, um eine Pathologie oder Verrücktheit oder Härte zu berücksichtigen.
  • Fall 5: Suchen Sie im Web nach weiteren Beispielen. Für steife , lesen Sie die Referenzen hier und lesen Sie sie ALLE, um Testprobleme aufzuspüren. Hier sind einige MATLAB- Beispiele zum Durchlesen.

Das ist nicht eindeutig. Wenn Sie sich das Buch "Numerische Methoden zur uneingeschränkten Optimierung und nichtlineare Gleichungen" von Dennis und Schnabel, Anhang B, "Testprobleme" ansehen, können Sie sehen, wie sie es gemacht haben. Nachdem sie eine der schönsten Algorithmen entwickelt hatten, die ich je gesehen habe, warfen sie eine Reihe von Problemen auf sie, die zum Verrücktwerden führten. Sie mussten hier und da zwicken! Sie umfassten fünf sehr unterschiedliche und pathologische Probleme, die die Fähigkeiten der Löser belasteten. Dies hat mich gelehrt, dass wir weiterhin Probleme mit Algorithmen werfen können, die aus einer Vielzahl von Gründen nicht verarbeitet werden können. Beachten Sie, dass sie diese Probleme sogar von More ', Garbow und Hillstrom ausgeliehen haben (Sie können diese Referenz auch nachschlagen und vielleicht gibt es andere, die Sie als Leitfaden verwenden können).

Mit anderen Worten, dies ist keine triviale Aufgabe. Sie benötigen Testfälle mit bekannter Antwort, mit denen Sie immer die Gültigkeit von Aktualisierungen testen können, ohne Probleme zu verursachen. Das heißt, eine wiederholbare und umfassende Reihe von Problemen von niedrig bis hoch, von leicht bis schwer, von möglich bis unmöglich. Sie benötigen auch eine Sammlung von Problemen, mit denen Ihre Löser nicht umgehen können, um die Grenzen wirklich zu verstehen.


2

Eine Sicherheitsüberprüfung, die ich für meine ODE-Löser durchführe, besteht darin, sie einfach auf kleineren linearen Systemen zu überprüfen, indem die Exponentialfunktion der Systemmatrix genau berechnet wird. dh gegeben

dudt=EINu

Überprüfen Sie den Fehler in

exp(tEIN)u0-u^(t)

u^(t)

Berechnen Sie das Exponential einfach nicht mit einem Ihrer Zeitspringer (dh der zweifelhaften Methode Nr. 6 :) http://www.cs.cornell.edu/cv/researchpdf/19ways+.pdf )


Nur eine Anmerkung: DE-Integratoren wurden insofern als "zweifelhaft" eingestuft, als sie im Vergleich zu Skalieren + Quadrieren nicht aufgrund von Ungenauigkeiten ziemlich ineffizient waren.
JM

1

Sie können versuchen, die "Methode für hergestellte Lösungen" zu untersuchen. Hierbei handelt es sich um eine allgemeine Methode zum Testen der Implementierung von Codes, die PDEs lösen (sie kann zum Auffinden von mathematischen und Codierungsfehlern verwendet werden). Ich stelle mir vor, dass es für die Lösung von ODEs angepasst werden könnte, wenn Ihre Lösungsmethodik allgemein genug ist.

http://prod.sandia.gov/techlib/access-control.cgi/2000/001444.pdf

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.