Sto per iniziare a lavorare su una libreria software di solutori numerici ODE e sto lottando su come formulare test per le implementazioni del risolutore. La mia ambizione è che la biblioteca, alla fine, includerà risolutori per entrambi i problemi nonstiff e rigido, e almeno un risolutore implicita (più o meno alla pari con le funzionalità di le ode
routine in Matlab ), quindi le esigenze metodologia di prova per riflettere i vari tipi di problemi e criteri per diversi solutori.
Il mio problema ora è che non so da dove cominciare con questo test. Posso pensare a diversi modi per testare l'output di un algoritmo:
Verificare la presenza di un problema con una soluzione analitica e verificare che la soluzione numerica rientri nei livelli di tolleranza per tutti i punti di dati restituiti. Ciò richiede la conoscenza di una serie di problemi analitici che presentano tutte le proprietà con cui voglio che i diversi solutori lavorino (rigidità, problemi impliciti ecc.), Che non ho, almeno non al di sopra della mia testa.
Questo metodo verifica i risultati di un metodo del risolutore. Pertanto, non esiste alcuna garanzia che il risolutore funzioni effettivamente, solo che funzioni per il problema di prova specificato . Pertanto, sospetto che sia necessario un gran numero di problemi di test per verificare con sicurezza che il risolutore funzioni.
Calcola manualmente la soluzione per alcuni passaggi utilizzando gli algoritmi che intendo implementare, quindi fai lo stesso con i solutori e verifica che i risultati siano gli stessi. Ciò non richiede alcuna conoscenza della vera soluzione al problema, ma a sua volta richiede un sacco di lavoro pratico.
Questo metodo, d'altra parte, mette alla prova solo l' algoritmo , il che va bene per me - se qualcun altro ha dimostrato che Runge-Kutta del 4 ° ordine funziona, non ne sento il bisogno disperato. Tuttavia, temo che sarà molto complicato formulare casi di test, in quanto non conosco un buon metodo per generare i dati di test (tranne forse a mano, che sarà molto lavoro ...).
Entrambi i metodi di cui sopra hanno gravi limitazioni per me con le mie attuali conoscenze: non conosco un buon insieme di problemi di test per il primo e non conosco un buon metodo per generare dati di test per il secondo.
Esistono altri modi per verificare i solutori numerici ODE? Esistono altri criteri sulle implementazioni che devono essere verificati? Ci sono buone risorse (gratuite) per testare i risolutori ODE là fuori 1 ?
EDIT:
Poiché questa domanda è molto ampia, voglio chiarire un po '. La suite di test che voglio creare avrà due scopi principali:
Verifica che i solutori funzionino come previsto, per i problemi che intendono risolvere. In altre parole, a un solutore per problemi non rigidi è permesso di andare banane su un problema rigido, ma dovrebbe funzionare bene su problemi non rigidi. Inoltre, se nella libreria ci sono altri solutori che offrono una maggiore precisione, potrebbe non essere necessario imporre risultati molto precisi, solo "abbastanza precisi". Quindi, parte della mia domanda è quali test dovrebbero essere usati per quali solutori; o, almeno, come si dovrebbe ragionare per decidere.
Test di integrità al momento dell'installazione della libreria. Questi test non devono (non dovrebbero) essere elaborati o richiedere molto tempo; solo le basi che possono essere eseguite in meno di 5 secondi, ma ciò avviserà l'utente se qualcosa è fuori dagli schemi. Pertanto, ho anche bisogno di un modo per costruire test che siano molto semplici, ma che mi diano ancora qualcosa sullo stato della biblioteca.
1 Sì, ho cercato su Google gli occhi, ma la maggior parte di ciò che trovo sono appunti di lezioni con esempi molto banali, con la notevole eccezione del set di test ODE CWI di Bari che non so se, o come, potrei usare per i miei scopi, poiché tratta solutori molto più sofisticati di quelli che voglio testare ...