Como evitar o cancelamento catastrófico na função python?


13

Estou tendo problemas para implementar uma função numericamente. Ele sofre com o fato de que, com valores de entrada grandes, o resultado é um número muito grande vezes um número muito pequeno. Não tenho certeza se o cancelamento catastrófico é o termo correto, por favor, corrija-me se for. Evidência de algo dando errado:

insira a descrição da imagem aqui

Como posso evitar as oscilações e a atribuição de 0,0 para entradas maiores de 6?

Aqui está a minha função:

import numpy as np

def func(x):
    t = np.exp(-np.pi*x)
    return 1/t*(1-np.sqrt(1-t**2))

Respostas:


31

t1+1-t2.
1-1-t21+1-t2

insira a descrição da imagem aqui


Fantástico! Você pode recomendar um desses livros onde essas técnicas estão descritas?
Dipolo

2
@Jack "Precisão e estabilidade de algoritmos numéricos" é um bom livro de nível superior. Qualquer livro introdutório também discutirá isso.
Kirill

Eu gostaria de saber se você usou o Wolfram Mathematica para desenhar este graph.THX :)
xyz

Você conhece alguma referência que colete e / ou discuta truques semelhantes para reescrever expressões matemáticas de maneiras matematicamente equivalentes que reduzam a perda de importância? Eu li o livro de Higham, mas a discussão é geral e todos os capítulos posteriores são sobre álgebra linear (que não é o meu tópico no momento).
Becko

@ Becko É bastante ad hoc na minha experiência. É muito mais fácil fazer isso se você tiver uma maneira de testar sua fórmula com respostas corretas (mesmo que você as gere com aritmética de precisão extra), para não procurar instabilidade numérica sem primeiro ter casos de teste com falha. E se funcionar para todas as entradas conhecidas, não há problema real se a instabilidade numérica está presente em qualquer lugar ou não.
Kirill
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.