Como identificar cálculos instáveis ​​de ponto flutuante?

15

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

  1. (Passo preliminar) Reunir observações física P .

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

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

  4. 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?

user40989
fonte
pode ser que você tenha respostas mais interessantes em math.stackexchange.com
Simon Bergot 11/11
@ Simon Você pode estar certo, mas esta é definitivamente uma questão entre domínios. Acho que as pessoas capazes de responder estão registradas para matemática e para programadores ou para nenhuma ... Vamos esperar um pouco para ver se esta pergunta encontra sua resposta aqui!
user40989
1
Aritmética de intervalo?
SK-logic
2
Usar Euler para propagar o estado não é necessariamente mau; nem a otimização, mas você realmente precisa dividir o problema em subtarefas. A instabilidade numérica pode ser o menor dos seus problemas - a convergência para um máximo falso e os problemas relacionados à rigidez dos ODEs / PDEs parecem maiores do que isso. E sim, nunca use a precisão única :) #
Deer Hunter

Respostas:

6

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)

AProgrammer
fonte
3

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.

WPrecht
fonte
1

Como identificar cálculos instáveis ​​de ponto flutuante? Essa é uma técnica comum para investigar essa pergunta?

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:

  1. usando ponto flutuante para calcular valores monetários.
  2. usando ponto flutuante para grandes números.
  3. não fazendo divisões antes de outras operações quando é possível fazê-lo. (para tornar o valor mais próximo de 0).
  4. cálculo longo sem tratamento especial para propagação de erros.

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.

imel96
fonte
Obrigado pela sua resposta, no entanto, estou procurando informações mais detalhadas. Eu tenho um cálculo muito grande e quero identificar suas partes fracas. Eu editei a pergunta de acordo.
user40989
Não sei exatamente qual é a sua situação quando você diz que possui grande computação e deseja identificar partes fracas. Cálculos numéricos inerentemente possuem erros, mesmo uma simples operação de adição. Portanto, a menos que seu cálculo grande seja compensado por erros, eles precisam ser corrigidos como um todo. Melhorar pontos mais fracos pode não ser bom o suficiente. Se você agora é o "epsilon" do seu modelo de ponto flutuante, uma análise simples mostrará o tamanho do erro à medida que ele se propaga pela computação longa.
Imel96
0

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.

Ingo
fonte
Não quero evitar erros numéricos, quero descobrir quais partes da computação são instáveis. É semelhante à localização de gargalos de velocidade ao otimizar a velocidade. Então, eu quero otimizar a precisão e, portanto, quero encontrar gargalos de precisão. (Continuação fracções não são úteis aqui.)
user40989
1
@ user40989, você definitivamente precisa de aritmética de intervalo.
SK-logic