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 ode
Routinen 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:
Ü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.
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 ...
Antworten:
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
Problemempfehlungen
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.
quelle
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
Überprüfen Sie den Fehler in
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 )
quelle
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
quelle