Estoy a punto de comenzar a trabajar en una biblioteca de software de solucionadores numéricos de EDO , y estoy luchando sobre cómo formular pruebas para las implementaciones de solucionadores. Mi ambición es que la biblioteca, eventualmente, incluirá solucionadores para problemas no rígidos y rígidos, y al menos un solucionador implícito (más o menos a la par con las capacidades de las ode
rutinas en Matlab ), por lo que la metodología de prueba debe reflejar los diversos Tipos de problemas y criterios para diferentes solucionadores.
Mi problema ahora es que no sé por dónde comenzar con esta prueba. Se me ocurren algunas formas diferentes de probar la salida de un algoritmo:
Pruebe un problema que tenga una solución analítica y verifique que la solución numérica esté dentro de los niveles de tolerancia para todos los puntos de datos devueltos. Esto requiere el conocimiento de una serie de problemas analíticos que exhiben todas las propiedades con las que quiero que trabajen los diferentes solucionadores (rigidez, problemas implícitos, etc.), que no tengo, al menos no fuera de mi cabeza.
Este método prueba los resultados de un método solucionador. Por lo tanto, no hay garantía de que el solucionador realmente funcione, solo que funciona para el problema de prueba dado . Por lo tanto, sospecho que se necesita una gran cantidad de problemas de prueba para verificar con seguridad que el solucionador funciona.
Calcule manualmente la solución por unos pocos pasos de tiempo usando los algoritmos que pretendo implementar, y luego haga lo mismo con los solucionadores y verifique que los resultados sean los mismos. Esto no requiere el conocimiento de la verdadera solución al problema, pero a su vez requiere bastante trabajo práctico.
Este método, por el contrario, sólo prueba el algoritmo , el cual está bien para mí - si alguien más ha demostrado que el 4 º orden funciona de Runge-Kutta, no me siento una necesidad desesperada de. Sin embargo, me preocupa que sea muy engorroso formular casos de prueba, ya que no conozco un buen método para generar los datos de la prueba (excepto tal vez a mano, lo que será mucho trabajo ...).
Los dos métodos anteriores tienen serias limitaciones para mí con mi conocimiento actual: no conozco un buen conjunto de problemas de prueba para el primero y no conozco un buen método para generar datos de prueba para el segundo.
¿Hay otras formas de verificar los solucionadores numéricos de EDO? ¿Existen otros criterios sobre las implementaciones que deberían verificarse? ¿Hay algún recurso bueno (gratuito) para probar los solucionadores de ODE por ahí 1 ?
EDITAR:
Dado que esta pregunta es muy amplia, quiero aclarar un poco. El conjunto de pruebas que quiero crear cumplirá dos propósitos principales:
Verificando que los solucionadores funcionan según lo esperado, para los problemas que están destinados a resolver. En otras palabras, un solucionador de problemas no rígidos puede volverse loco en un problema rígido, pero debería funcionar bien en problemas no rígidos. Además, si hay otros solucionadores en la biblioteca que ofrecen una mayor precisión, puede que no sea necesario aplicar resultados muy precisos, solo "lo suficientemente precisos". Por lo tanto, parte de mi pregunta es qué pruebas deben usarse para qué solucionadores; o, al menos, cómo se debe razonar para decidir eso.
Prueba de cordura al instalar la biblioteca. Estas pruebas no necesitan (no deberían) ser elaboradas o llevar mucho tiempo; solo los conceptos básicos que se pueden ejecutar en menos de 5 segundos, pero que alertarán al usuario si algo está fuera de lo común. Por lo tanto, también necesito una forma de construir pruebas que sean muy simples, pero que aún me digan algo sobre el estado de la biblioteca.
1 Sí, he estado buscando en Google, pero la mayoría de lo que encuentro son notas de clase con ejemplos muy triviales, con la notable excepción del conjunto de pruebas CWI ODE de Bari que no sé si, o cómo, yo podría usar para mis propósitos, ya que trata solucionadores mucho más sofisticados que los que quiero probar ...