Berechne

13

Die Funktion hat eine Singularität in der Nähe von . Diese Singularität kann jedoch aufgehoben werden: für sollte man , da Und damit Die Form ist jedoch nicht nur bei nicht definiert ist es in der Nähe dieses Punktes auch numerisch instabil; Um für sehr kleine numerisch zu berechnen, könnte man eine Taylor-Expansion verwenden, dh eine Kürzung der oben genannten Potenzreihen.x = 0 x = 1 f ( x ) = 1 e x = Σ k = 0 x kf:x(ex1)/xx=0x=1f(x)=1(ex-1)/x=k=1x k - 1

ex=k=0xkk!
(ex1)/x=k=1xk1k!
(ex1)/xx=0f(x)x

F : Hat die Funktion einen Namen? Mit anderen Worten, ist das ein häufiges Problem?f

F : Ist jemandem eine C / C ++ - Bibliothek bekannt, die diese Situation gut handhabt, dh die Taylor-Erweiterung in einem angemessenen Grad nahe 0 und die andere Darstellung von Null entfernt verwendet?

anonym
quelle

Antworten:

19

Möglicherweise könnte man mit der Funktion die Teil des C99-Standards ist, und e x - 1 genau in der Nähe von x = 0 berechnen .expm1ex1x=0

n00b
quelle
17

Dies ist ein Fall eines Stornierungsfehlers. Die C-Standardbibliothek (ab C99) enthält eine Funktion expm1, die dieses Problem umgeht. Wenn Sie expm1(x) / xanstelle von verwenden (exp(x) - 1.0) / x, tritt dieses Problem nicht auf (siehe Abbildung unten). <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </ code>

Die Details und die Lösung dieses speziellen Problems werden ausführlich in Abschnitt 1.14.1 der Genauigkeit und Stabilität numerischer Algorithmen erörtert . Die gleiche Lösung wird auch auf Seite 19 von W. Kahans Aufsatz mit dem Titel " Wie sinnlos sind sinnlose Einschätzungen der Rundung bei der Gleitkommaberechnung?" Erläutert. . Die tatsächliche Implementierung expm1in der GNU C-Bibliothek unterscheidet sich von dem in den obigen Referenzen beschriebenen Ansatz und ist im Quellcode gründlich dokumentiert .

Juan M. Bello-Rivas
quelle
1
Danke, genau das habe ich gebraucht! Leider kann ich nur eine Antwort akzeptieren ...
anonym
Natürlich! Kein Problem :-)
Juan M. Bello-Rivas
3

Um Ihre erste Frage zu beantworten, nein, die Funktion hat keinen Namen (zumindest keinen, der allgemein bekannt ist).

Wie andere bereits erwähnt haben, besteht die beste Methode zur Berechnung der Funktion darin, mehrere Sonderfälle zu behandeln. So würde jede Bibliothek die Funktion berechnen.

  1. Fall 0: x = 0, gebe 1 zurück.
  2. |x|<δ1+x/2δdouble2e-85e-4
  3. Fall sonst: Rückgabe expm1(x)/x.

Mit abgeschnittenen Taylor-Serien kann man anspruchsvoller sein und im Sonderfall mehr Dinge tun, aber es lohnt sich wahrscheinlich nicht. Tatsächlich ist es nicht ganz klar, dass Fall 1 separat behandelt werden muss, da die Löschung sicher ist, wie k20 hervorhob. Wenn ich es jedoch separat handhaben würde, würde ich mich sicherer fühlen.

Victor Liu
quelle
2

Ich erinnere mich, dass diese Frage früher auf dieser Website gestellt wurde, und überraschenderweise müssen Sie nur im Sonderfall eine exakte Gleichheit von Null angeben. Die Fehler heben sich gegen Null auf. Ich habe den Link nicht.

Ja, diese Antwort war völlig falsch. Ich bin mir nicht sicher, warum so viel darüber gestimmt wurde, wahrscheinlich, weil es so autoritär formuliert wurde. Ich habe den Link gefunden, den ich mir vorgestellt habe. Es war auf der Mathe Stack hier , nicht auf dem SciComp Stack. Die expm1-freie Fehlerannullierungsformel wird in der Antwort von JM angegeben und verwendet eine u = exp(x)Transformation.

k20
quelle
xdx(edx-1)/dx(1+dx-1)/dx1
1
dx1+dx=1
0

Um die erste Frage zu beantworten und eine (wahrscheinlich numerisch ineffiziente) Methode für die zweite bereitzustellen, ist zu beachten, dass dies die Umkehrung der Erzeugungsfunktion der Bernoulli-Zahlen ist .

Nikolaj-K
quelle
Das ist eine interessante Verbindung, danke, dass Sie darauf hingewiesen haben. Leider glaube ich, dass die dreifache Summe dies unerschwinglich teuer machen wird. Darüber hinaus ist nicht sofort klar, wo die einzelnen Summen abgeschnitten werden müssen, um die gewünschte Genauigkeit zu erzielen.
Anonym
@anonymous: Welche dreifache Summe meinst du? Sie brauchen nicht die Bernoulli-Polynome, sondern nur die Bernoulli-Zahlen und können diese im Voraus auflisten. Aber ja, es ist immer noch nicht besser als die Taylor-Serie.
Nikolaj-K
Sie können diese im Voraus berechnen, wenn klar ist, dass Sie nur eine feste endliche Zahl für eine Eingabe benötigen.
Anonym
@anonymous: Nun ja, genau wie Sie die Taylor-Koeffizienten im Voraus auflisten würden.
Nikolaj-K