Estou prestes a começar a trabalhar em uma biblioteca de software de solucionadores numéricos de ODE e estou tendo dificuldades em formular testes para as implementações do solucionador. Minha ambição é que a biblioteca, finalmente, irá incluir solucionadores para ambos os problemas nonstiff e rígido, e pelo menos um solver implícita (mais ou menos a par com as capacidades das ode
rotinas em Matlab ), de modo que as necessidades metodologia de teste para refletir os vários tipos de problemas e critérios para diferentes solucionadores.
Meu problema agora é que não sei por onde começar com este teste. Posso pensar em algumas maneiras diferentes de testar a saída de um algoritmo:
Teste um problema que tenha uma solução analítica e verifique se a solução numérica está dentro dos níveis de tolerância para todos os pontos de dados retornados. Isso requer o conhecimento de vários problemas analíticos que exibem todas as propriedades com as quais eu quero que os diferentes solucionadores trabalhem (rigidez, problemas implícitos, etc.), os quais não tenho, pelo menos não da cabeça.
Este método testa os resultados de um método solucionador. Portanto, não há garantia de que o solucionador realmente funcione, apenas que funcione para o problema de teste especificado . Portanto, suspeito que seja necessário um grande número de problemas de teste para verificar com segurança se o solucionador funciona.
Calcule manualmente a solução por algumas etapas, usando os algoritmos que pretendo implementar, e faça o mesmo com os solucionadores e verifique se os resultados são os mesmos. Isso não requer conhecimento da verdadeira solução para o problema, mas, por sua vez, exige bastante trabalho prático.
Este método, por outro lado, apenas testa o algoritmo , que é bem por mim - se alguém tem provado que 4 ª ordem de Runge-Kutta funciona, eu não sinto uma necessidade desesperada de. No entanto, receio que seja muito complicado formular casos de teste, pois não conheço um bom método para gerar os dados de teste (exceto talvez manualmente, o que dará muito trabalho ...).
Ambos os métodos acima têm sérias limitações para mim com meu conhecimento atual - não conheço um bom conjunto de problemas de teste para o primeiro e não conheço um bom método de gerar dados de teste para o segundo.
Existem outras maneiras de verificar os resolvedores numéricos de ODE? Existem outros critérios nas implementações que devem ser verificados? Existem bons recursos (gratuitos) para testar os solucionadores de ODE existentes 1 ?
EDIT:
Como essa pergunta é muito ampla, quero esclarecer um pouco. O conjunto de testes que eu quero criar preencherá dois propósitos principais:
Verificando se os solucionadores funcionam conforme o esperado, para os problemas que eles pretendem resolver. Em outras palavras, um solucionador de problemas não-rígidos pode banir-se com um problema rígido, mas deve ter um bom desempenho em problemas não-rígidos. Além disso, se houver outros solucionadores na biblioteca que ofereçam maior precisão, talvez não seja necessário aplicar resultados muito precisos - apenas "suficientemente precisos". Assim, parte da minha pergunta é quais testes devem ser usados para quais solucionadores; ou, pelo menos, como alguém deve raciocinar para decidir isso.
Teste de sanidade após a instalação da biblioteca. Esses testes não precisam (não devem) ser elaborados ou demorados; apenas os princípios básicos que podem ser executados em menos de 5 segundos, mas que alertarão o usuário se algo for estranho. Portanto, também preciso de uma maneira de construir testes muito simples, mas que ainda me digam algo sobre o estado da biblioteca.
1 Sim, tenho pesquisado no Google, mas quase tudo o que encontro são notas de aula com exemplos muito triviais, com a exceção notável do conjunto de testes CWI ODE de Bari, que eu não sei se, ou como, eu poderia usar para meus propósitos, pois trata solucionadores muito mais sofisticados do que os que eu quero testar ...