Em números, é muito importante ser capaz de identificar esquemas instáveis e melhorar sua estabilidade. Como identificar cálculos instáveis de ponto flutuante?
Estou trabalhando em uma simulação muito complexa, onde muitos esquemas numéricos trabalham juntos e estou procurando um método para identificar suas partes fracas. Estou trabalhando em um modelo físico envolvendo equações diferenciais. Uma visão geral do processo geral é:
(Passo preliminar) Reunir observações física P .
Determine os parâmetros iniciais da simulação. Isso usa um algoritmo de otimização, no qual caminhamos em um espaço de parâmetros e procuramos pelos parâmetros C, de modo que alguma função de erro E (F (C), P) seja minimizada, onde F é alguma quantidade derivada dos parâmetros.
Conecte C no mecanismo de simulação. Este é um esquema de Euler do EDP, para que, a cada passo, calculemos os termos que impulsionam a dinâmica (cada um deles é uma função complexa, potencialmente sujeita à instabilidade) e alimentamos o esquema de Euler com esses termos dinâmicos para calcular os próximos Estado. Isso continua por milhares de pontos no tempo.
No final da simulação, calculamos alguma função Prova (S) do estado final S e comparamos com algumas quantidades que Requer (P) deduzidas das quantidades observadas. Esta não é uma prova formal do resultado, mas uma verificação de plausibilidade.
Além disso, vejo uma torre de operações complexas (computação de termos dinâmicos, dentro do esquema de Euler, dentro da Prova ). E gostaria de reconhecer "partes ruins" e corrigi-las.
Especulo que o uso de uma implementação de software de números de ponto flutuante com precisão reduzida aumentaria a instabilidade dos esquemas numéricos, facilitando assim a comparação entre diferentes implementações. Essa é uma técnica comum para investigar essa pergunta? É possível usar uma máquina virtual, como Bochs, para conseguir isso sem alterar o programa?
Para lidar adequadamente com a questão da estabilidade, às vezes é aceitável direcionar a entrada típica do procedimento numérico, para que possa ser ajustado para se sair bem nessa entrada e talvez menos bem em outra entrada válida, mas improvável. Dada uma amostra de entradas típicas, é possível bisbilhotar alguns resultados intermediários e preparar um perfil estatístico para eles. Novamente, essa é uma técnica comum para estudar questões de estabilidade? Uma máquina virtual é útil para isso?
fonte
Respostas:
O estudo da estabilidade da computação em ponto flutuante faz parte da análise numérica e, se você realmente deseja um resultado sólido, deseja que alguém com conhecimento nesse domínio faça a análise dos algoritmos utilizados.
Existem algumas coisas que podem ajudar a identificar experimentalmente algoritmos instáveis. Executando com o arredondamento definido para modos diferentes (cima / baixo / aleatório) ou com precisão diferente e verificando se o resultado não varia muito. Responder é demais? não é nada simples e, mesmo quando a resposta é negativa , não significa que o algoritmo seja estável, apenas que não foi detectado instável no conjunto de dados que você usou.
A aritmética de intervalos foi proposta nos comentários. Quando eu olhei para ele, mesmo o mais raivoso defensor da aritmética intervalar admitiu que funcionava bem com algoritmos projetados para aritmética intervalar, mas que mudar para ele sem analisar o algoritmo e garantir que não tivesse padrões conhecidos por não funcionar bem não funcionaria. ser útil (os oponentes pareciam considerar que as condições prévias para a aritmética de intervalo são úteis quando restritivas demais para serem de interesse prático)
fonte
Projetar algoritmos estáveis de ponto flutuante é altamente não trivial. Aqueles com mais habilidades matemáticas do que eu sugerem o uso de bibliotecas conceituadas sempre que possível, em vez de tentar criar as suas próprias. A referência padrão na área parece ser:
NJ Higham. Precisão e Estabilidade de Algoritmos Numéricos. Society for Industrial and Applied Mathematics, Filadélfia, PA, EUA, segunda edição, 2002. ISBN 0-89871-521-0
Não saber mais sobre que tipos de cálculos, linguagens etc. torna difícil dar uma resposta muito concreta. Há uma boa palestra aqui: http://introcs.cs.princeton.edu/java/91float/ isso pode ser um pouco básico, mas é uma boa introdução se você estiver usando java.
fonte
Eu acho que, a menos que você precise mostrar algumas estatísticas sobre erros, você realmente não precisa coletar amostras. O que você precisa é de Análise Numérica , que também se enquadra nos assuntos de Métodos Numéricos, Álgebra Linear Numérica, etc.
De qualquer maneira, na programação geral, a maioria dos problemas é fácil de detectar, dada a compreensão básica sobre como o ponto flutuante funciona e os métodos numéricos básicos. Porém, problemas ainda mais complexos são "mais fáceis" de resolver hoje, com disponibilidade de flutuadores de 128 bits, ainda menos motivo para produzir amostras de erros. Aqui estão alguns problemas de exemplo para mostrar meu ponto de vista:
Há também um exemplo de algoritmo ingênuo e algoritmo compensado por erro aqui para calcular a variação . No exemplo, olhando para a versão ingênua, você pode sentir o cheiro de que o cálculo em loops acarreta alguns erros e não está sendo compensado.
fonte
Você pode evitar erros numéricos usando tipos de dados apropriados (como, por exemplo, frações continuadas). Se você precisar ou quiser usar aritmética de ponto flutuante, deverá aplicar o conhecimento numérico para conhecer os erros.
fonte