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 ...