Comment éviter l'annulation catastrophique de la fonction python?

13

J'ai du mal à implémenter une fonction numériquement. Il souffre du fait qu'à de grandes valeurs d'entrée, le résultat est un très grand nombre fois un très petit nombre. Je ne sais pas si l'annulation catastrophique est le terme correct, alors corrigez-moi si c'est le cas. Preuve que quelque chose tourne mal:

entrez la description de l'image ici

Comment puis-je éviter les oscillations et l'assignation de 0,0 pour des entrées plus grandes de 6?

Voici ma fonction:

import numpy as np

def func(x):
    t = np.exp(-np.pi*x)
    return 1/t*(1-np.sqrt(1-t**2))
Dipôle
la source

Réponses:

31

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

entrez la description de l'image ici

Kirill
la source
Fantastique! Pouvez-vous recommander un de ces livres où ces techniques sont décrites?
Dipole
2
@Jack "Précision et stabilité des algorithmes numériques" est un bon livre de niveau supérieur. Tout manuel d'introduction en discutera également.
Kirill
Je voudrais savoir si vous avez utilisé Wolfram Mathematica pour dessiner ce graphique. THX :)
xyz
Connaissez-vous des références collectant et / ou discutant des astuces similaires pour réécrire des expressions mathématiques de manière mathématiquement équivalente qui réduisent la perte de signification? J'ai lu le livre de Higham, mais la discussion est générale et tous les chapitres suivants portent sur l'algèbre linéaire (ce qui n'est pas mon sujet pour le moment).
Becko
@becko C'est assez ad hoc d'après mon expérience. C'est beaucoup plus facile à faire si vous avez un moyen de tester votre formule avec des réponses correctes (même si vous les générez simplement avec une arithmétique extra-précise), afin de ne pas chercher l'instabilité numérique sans avoir d'abord des cas de test défaillants. Et si cela fonctionne pour toutes les entrées connues, il n'y a pas de vrai problème que l'instabilité numérique soit présente n'importe où ou non.
Kirill