Come si verifica un'implementazione numerica del solutore ODE?


26

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 oderoutine 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:

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

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


2
@ user75064: Assolutamente! Non sapevo nemmeno che quel sito esistesse =) Qualsiasi mod, sentiti libero di migrarmi lì.
Tomas Aschan,

Ci sono collegamenti ad altri set di test in questa risposta su Math Stack Exchange .
Geoff Oxberry,

@GeoffOxberry: ne ho trovati molti di quelli prima. La maggior parte di essi sono implementati in FORTRAN e presume che il lettore voglia testare i risolutori nella stessa lingua, il che aggiunge un'altra fonte di errore ... Tuttavia, un paio (gli articoli sulla suite DETEST) si sono rivelati davvero utili. Molte grazie!
Tomas Aschan,

Risposte:


12

Questa è una domanda molto ampia e ho intenzione di darti alcune cose a cui pensare (alcune sono già incluse nel tuo post, ma sono ripetute qui per completezza).

Ambito di problemi

  • È necessario definire l'interfaccia di come specificare i problemi.
  • Consentirai parametri che possono essere corretti o che possono variare per le soluzioni?
  • ϵ
  • Consentirai una precisione infinita?
  • Proverai velocità e sensibilità alla precisione numerica?
  • Hai scelto due (forse più) librerie già esistenti per confrontare i risultati?
  • Come sceglierete i criteri di arresto, userete vari metodi e consentirete all'utente di selezionare o definire i propri?
  • Misurerai l'errore usando varie misure e consentirai all'utente di accenderli e spegnerli?
  • Hai esaminato i pacchetti professionali come Computer-Algebra-Systems (CAS) e hai compreso tutte le opzioni che consentono?
  • Consentirai la visualizzazione di risultati e / o confronti e / o grafici?

Consigli sui problemi

  • È necessario scrivere una specifica di prova che definisca l'origine dei problemi, l'ambito di come sono stati testati i problemi, acquisendo risultati e metriche di esecuzione delle routine.
  • Cercherei sicuramente altre librerie già là fuori per i problemi che stanno utilizzando (forse i file di test).
  • Andavo nelle biblioteche del college e leggevo libri sugli ODE e tiravo fuori problemi di tutti i tipi, quelli con forma chiusa nota o soluzioni solo numeriche.
  • Caso 1: Vogliamo tutte le varianti dei problemi di soluzione in forma chiusa che possiamo ottenere per confrontare risultati esatti e numerici.
  • Caso 2: vorrei andare su ogni libro di analisi numerica che posso trovare e catturare gli esempi lavorati e duplicarli. Vorrei inoltre acquisire i set di problemi, in particolare quelli che presentano alcune patologie che esistono nella maggior parte dei libri (sensibilità a questo o quel tipo).
  • Caso 3: andrei a diversi rami della matematica applicata come Fisica, Ecologia, Biologia, Economia, ecc. e acquisire problemi da ciascuno di questi domini per convalidare che il linguaggio delle specifiche per i problemi consenta tali esempi.
  • Caso 4: vorrei ricercare articoli / riviste contenenti gli esempi più utili in cui il particolare autore ha dovuto modificare un particolare approccio per tenere conto di alcune patologie, stranezze o durezze.
  • Caso 5: cerca nel web altri esempi. Per i rigidi , vedere i riferimenti qui e esaminarli TUTTI per individuare i problemi di test. Ecco alcuni esempi di MATLAB da esaminare.

Questo non è unico. Se guardi il libro "Metodi numerici per l'ottimizzazione non vincolata e le equazioni non lineari" di Dennis e Schnabel, Appendice B, "Problemi di prova", puoi vedere come hanno fatto. Dopo aver sviluppato uno dei set di algoritmi più belli che abbia mai visto, hanno lanciato una serie di problemi che hanno reso impazziti. Dovevi modificare qua e là! Includono cinque problemi molto diversi e patologici che mettono a dura prova le capacità dei solutori. Questo mi ha insegnato che possiamo continuare a gettare problemi agli algoritmi che non sono in grado di gestire per una serie di ragioni. Nota, hanno anche preso in prestito questo insieme di problemi da More ', Garbow e Hillstrom (puoi anche cercare quel riferimento e forse ce ne sono altri che puoi usare come guida).

In altre parole, questo non è un compito banale. Sono necessari casi di test con risposta nota che consentono sempre di testare la validità degli aggiornamenti e di non interrompere le cose. Cioè, un insieme ripetibile ed esteso di problemi da basso ad alto, da facile a difficile, da possibile a impossibile, ... Hai anche bisogno di una raccolta di problemi che i tuoi solutori non possono gestire per comprenderne veramente i limiti.


2

Un controllo di integrità che corro contro i miei solutori ODE è semplicemente quello di controllarlo su sistemi lineari più piccoli tramite il calcolo preciso dell'esponenziale della matrice del sistema. cioè dato

dudt=UNu

controlla l'errore in

exp(tUN)u0-u^(t)

u^(t)

Basta non calcolare l'esponenziale con uno dei tuoi time-stepper (cioè il metodo numero dubbia 6 :) http://www.cs.cornell.edu/cv/researchpdf/19ways+.pdf )


Solo una nota: gli integratori di DE sono stati considerati "dubbiosi" in quanto erano un po 'inefficienti rispetto al ridimensionamento + quadratura, non a causa di inesattezze.
JM,

1

Potresti provare a studiare il "Metodo delle soluzioni prodotte", che è una metodologia generale utilizzata per testare l'implementazione di codici che risolvono PDE (può essere utilizzata per trovare errori matematici e di codifica). Immagino che potrebbe essere adattato per funzionare per risolvere gli ODE, se la tua metodologia di soluzione è abbastanza generale.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.