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))
Dipolo
fonte

Respostas:

31

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

insira a descrição da imagem aqui

Kirill
fonte
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