Wie vermeide ich eine katastrophale Aufhebung der Python-Funktion?

13

Ich habe Probleme, eine Funktion numerisch zu implementieren. Es leidet unter der Tatsache, dass das Ergebnis bei großen Eingabewerten eine sehr große Zahl mal eine sehr kleine Zahl ist. Ich bin mir nicht sicher, ob eine Katastrophenstornierung der richtige Begriff ist. Bitte korrigieren Sie mich, wenn dies der Fall ist. Beweise dafür, dass etwas schief läuft:

Bildbeschreibung hier eingeben

Wie kann ich die Schwingungen und die Zuweisung von 0.0 für größere Eingänge von 6 vermeiden?

Hier ist meine Funktion:

import numpy as np

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

Antworten:

31

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

Bildbeschreibung hier eingeben

Kirill
quelle
Fantastisch! Können Sie ein solches Buch empfehlen, in dem diese Techniken beschrieben sind?
Dipol
2
@Jack "Genauigkeit und Stabilität numerischer Algorithmen" ist ein gutes Buch der höheren Ebene. In jedem Einführungslehrbuch wird auch darauf eingegangen.
Kirill
Ich würde gerne wissen, ob Sie Wolfram Mathematica zum Zeichnen dieses Diagramms verwendet haben. THX :)
xyz
Kennen Sie Referenzen, in denen ähnliche Tricks gesammelt und / oder diskutiert werden, um mathematische Ausdrücke auf mathematisch äquivalente Weise umzuschreiben, wodurch der Bedeutungsverlust verringert wird? Ich habe das Buch von Higham gelesen, aber die Diskussion ist allgemein und in allen späteren Kapiteln geht es um lineare Algebra (was im Moment nicht mein Thema ist).
Becko
@becko Es ist meiner Erfahrung nach ziemlich ad hoc. Es ist viel einfacher, wenn Sie eine Möglichkeit haben, Ihre Formel mit korrekten Antworten zu testen (auch wenn Sie sie nur mit einer besonders präzisen Arithmetik generieren), damit Sie nicht nach numerischer Instabilität suchen, ohne vorher Testfälle zu bestehen. Und wenn es für alle bekannten Eingänge funktioniert, gibt es kein wirkliches Problem, ob irgendwo numerische Instabilität vorliegt oder nicht.
Kirill