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

Réponses:


31

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

entrez la description de l'image ici


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.