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

Antworten:


31

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

Bildbeschreibung hier eingeben


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.