scipy.special.erf prezision?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
florian101
User
Beiträge: 1
Registriert: Montag 9. Juli 2012, 15:45

Hi
Ich habe eine Frage zu scipy.special.erf(). Diese Funktion akzeptiert complexe Zahlen, allerdings liefert sie "nan" fuer bestimmte Zahlen und manche Ergebnisse sehen einfach nur falsch aus. Ich habe auch andere implementierungen der komplexen erf Funktion ausprobiert, und alle scheinen falsche Wert zu liefern, wenn der komplexe Teil des Eingabewerts zu gross wird. Hier einige Beispiele

input: output:
(0.166666666667-0.03j) (0.186500976956-0.0329333297342j)
(0.166666666667-17.85j) (-2.45799432305e+136-6.8926602433e+136j)
(0.166666666667-26.67j) (inf+nan*j)

mir ist nicht bekannt, dass die komplexe Fehler Funktion ihrgendwelche Eingabe Beschraenkungen hat (oder liege ich da falsch?), weshalb ich diese Ergebnisse nur so interpretieren kann, dass die python Implementierung (und alle Anderen die ich bis jetzt ausprobiert habe) nicht mit grossen imaginaeren Eingaben klarkommen?
oder was mache ich hier falsch?
Gruesse
florian
BlackJack

@florian101: Dir ist klar das sowohl Wertebereich als auch Genauigkeit von der üblicherweise intern verwendeten Gleitkommazahlen-Repräsentation begrenzt ist‽ Üblicherweise verwendet wird die Repräsentation mit der der Prozessor direkt etwas anfangen kann. Alles andere ist um einiges langsamer.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

florian101 hat geschrieben:weshalb ich diese Ergebnisse nur so interpretieren kann, dass die python Implementierung (und alle Anderen die ich bis jetzt ausprobiert habe) nicht mit grossen imaginaeren Eingaben klarkommen?
oder was mache ich hier falsch?
Ersten musst du aufpassen, da komplexe Zahlen sind meist als Gleitkommazahlen einfacher Genauigkeit implementiert sind. Deine Zahlen überschreiten diese Grenze bei weitem.

Zweitens liegt das an der Fehlerfunktion selbst. Die Reihenentwicklung derselben sieht wie folgt aus:

\operatorname{erf}(x) = \frac{2 x}{\sqrt{\pi }}-\frac{2 x^3}{3 \sqrt{\pi }}+\frac{x^5}{5 \sqrt{\pi }}-\frac{x^7}{21 \sqrt{\pi }}+\frac{x^9}{108 \sqrt{\pi }}+\mathcal{O}(x)^{11}

Setzt man nun für x, i x ein erhält man:

\operatorname{erf}(i x) = \frac{2 i x}{\sqrt{\pi }}+\frac{2 i x^3}{3 \sqrt{\pi }}+\frac{i x^5}{5 \sqrt{\pi }}+\frac{i x^7}{21 \sqrt{\pi }}+\frac{i x^9}{108 \sqrt{\pi }}+\mathcal{O}(x)^{11}

Was offensichtlich divergiert. Das nan erhältst du weil die resultierende Zahl 8.59622e306 + 1.4307e307 j den Wertebereich von floats überschreitet.
Antworten