Ich muss das Integral der folgenden Funktion in Bereichen berechnen, die so niedrig wie -150
beginnen:
Das Problem ist, dass dieser Teil der Funktion
ist %Vor% tendiert in Richtung unendlich - ich erhalte inf
für Werte von x
weniger als ungefähr -26
.
Und dieser Teil der Funktion
%Vor%was äquivalent zu
ist %Vor%tendiert in Richtung 0.
Also, eine sehr, sehr große Zahl mal eine sehr, sehr kleine Zahl sollte mir eine einigermaßen große Zahl geben - aber statt dessen gibt python
mir nan
.
Was kann ich tun, um dieses Problem zu umgehen?
Es gibt bereits eine solche Funktion: erfcx
. Ich denke, erfcx(-x)
sollte dir den gewünschten Integranden geben (beachte, dass 1+erf(x)=erfc(-x)
).
Ich denke, eine Kombination aus @ askewchans Lösung und scipy.special.log_ndtr
wird den Trick machen:
Für x <= -20
, log_ndtr(x)
verwendet einen Taylor Serienexpansion der Fehlerfunktion zur iterativen Berechnung der Protokoll-CDF direkt , die wesentlich numerischer stabil ist als einfach log(ndtr(x))
.
Wie Sie in den Kommentaren erwähnt haben, kann exp
auch überlaufen, wenn x
ausreichend groß ist. Während Sie dies mit mpmath.exp
umgehen könnten, ist es einfacher und schneller, in np.longdouble
zu konvertieren, was auf meinem Rechner Werte bis zu 1.189731495357231765e + 4932:
Nicht sicher, wie hilfreich das sein wird, aber hier sind ein paar Gedanken, die für einen Kommentar zu lang sind.
Sie müssen das Integral von , was Sie richtig gemacht haben identifiziert wäre Wenn Sie die Klammern öffnen, können Sie beide Teile der Summierung integrieren.
Scipy hat diese imaginäre Fehlerfunktion implementiert
Der zweite Teil ist schwieriger:
Dies ist eine generalisierte hypergeometrische Funktion . Leider sieht es aus wie scipy hat keine Implementierung davon , aber Dieses Paket behauptet, dies zu tun.
Hier habe ich unbestimmte Integrale ohne Konstanten benutzt, die from
to
Werte kennend, es ist klar, wie man bestimmte verwendet.
Tags und Links python numpy floating-point numbers scipy