Pergunta

Existem bons recursos on-line sobre como criar, manter e pensar em escrever rotinas de teste para código de análise numérica?

Uma das limitações que posso ver em algo como testar a multiplicação de matrizes é que os testes óbvios (como ter uma matriz sendo a identidade) podem não testar completamente a funcionalidade do código.

Além disso, há o fato de que geralmente você também lida com grandes estruturas de dados.Alguém tem boas idéias sobre maneiras de abordar isso ou tem dicas de bons lugares para procurar?

Foi útil?

Solução

Parece que você precisa pensar em testar pelo menos duas maneiras diferentes:

  1. Alguns métodos numéricos permitem algum meta-pensamento.Por exemplo, operações invertíveis permitem configurar casos de teste para ver se o resultado está dentro dos limites de erro aceitáveis ​​do original.Por exemplo, matriz M-inverso vezes a matriz M * vetor aleatório V deverá resultar em V novamente, dentro de alguma medida aceitável de erro.
    Obviamente, este exemplo exercita matriz inversa, multiplicação de matrizes e multiplicação de vetores de matrizes.Gosto de cadeias como essas porque você pode gerar muitos casos de teste aleatórios e obter cobertura estatística que seria um trabalho árduo para escrever à mão.No entanto, eles não exercem operações únicas isoladamente.

  2. Alguns métodos numéricos possuem uma expressão fechada de seu erro.Se você puder configurar uma situação com uma solução conhecida, poderá então comparar a diferença entre a solução e o resultado calculado, procurando uma diferença que exceda esses limites conhecidos.

Fundamentalmente, esta questão ilustra o problema de que testar bem métodos complexos requer bastante conhecimento de domínio.Referências específicas exigiriam informações um pouco mais específicas sobre o que você está testando.Eu definitivamente recomendo que você pelo menos tenha Lista de livros recomendados de Steve Yegge na mão.

Outras dicas

Se você for fazer cálculos matriciais, use LAPACK.Este é um código muito bem testado.Pessoas muito inteligentes têm trabalhado nisso há décadas.Eles pensaram profundamente sobre questões nas quais os não iniciados nunca pensariam.

Em geral, recomendo dois tipos de teste:sistemático e aleatório.Por sistemático quero dizer explorar casos extremos, etc.Ajuda se você puder ler o código-fonte.Freqüentemente, os algoritmos têm pontos de ramificação:calcule desta forma para números neste intervalo, desta outra forma para números em outro intervalo, etc.Teste os valores próximos aos pontos de ramificação em ambos os lados porque é aí que o erro de aproximação costuma ser maior.

Valores de entrada aleatórios também são importantes.Se você escolher racionalmente todos os casos de teste, poderá evitar sistematicamente algo que não percebe ser um problema.Às vezes, você pode fazer bom uso de valores de entrada aleatórios, mesmo que não tenha os valores exatos para testar.Por exemplo, se você tiver código para calcular uma função e sua inversa, poderá gerar 1.000 valores aleatórios e ver se a aplicação da função e sua inversa o colocará de volta perto de onde começou.

Confira um livro de David Gries chamado A Ciência da Programação.Trata-se de provar a exatidão dos programas.Se você quiser ter certeza de que seus programas estão corretos (a ponto de provar que estão corretos), este livro é um bom lugar para começar.

Provavelmente não é exatamente o que você está procurando, mas é a resposta da ciência da computação para uma questão de engenharia de software.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top