ValueError: Fehler in der mathematischen Domäne

102

Ich habe gerade ein Beispiel aus Numerical Methods in Engineering mit Python getestet .

from numpy import zeros, array
from math import sin, log
from newtonRaphson2 import *

def f(x):
    f = zeros(len(x))
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
    f[1] = 3.0*x[0] + 2.0**x[1] - x[2]**3 + 1.0
    f[2] = x[0] + x[1] + x[2] -5.0
    return f

x = array([1.0, 1.0, 1.0])
print newtonRaphson2(f,x)

Wenn ich es ausführe, wird der folgende Fehler angezeigt:

File "example NR2method.py", line 8, in f
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
ValueError: math domain error

Ich habe es auf das Protokoll eingegrenzt, da es funktioniert, wenn ich das Protokoll entferne und eine andere Funktion hinzufüge. Ich nehme an, es liegt an einer Störung der Basis, ich kann nicht herausfinden, wie. Kann jemand eine Lösung vorschlagen?

ramanunni.pm
quelle

Antworten:

131

Ihr Code hat logeine Zahl, die kleiner oder gleich Null ist. Das ist mathematisch undefiniert, daher loglöst die Python- Funktion eine Ausnahme aus. Hier ist ein Beispiel:

>>> from math import log
>>> log(-1)
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    log(-1)
ValueError: math domain error

Ohne zu wissen, was Ihre newtonRaphson2Funktion bewirkt, bin ich mir nicht sicher, woher der ungültige x[2]Wert kommt, aber hoffentlich führt Sie dies auf den richtigen Weg.

Blckknght
quelle
Ich sehe nicht, wie es ein negatives Protokoll macht, da die Definition den Satz von Gleichungen definiert, dh x [0], x [1] und x [2] sind Variablen x, y und z, die Newton Raphson verwendet . Es braucht diese Gleichungen, um zu lösen.
ramanunni.pm
1
Auch, wie ich x [2] = 1.0 sage, wenn ich x im obigen Code definiere, log (1) = 0, zumindest ist es das, was ich dachte, vielleicht irre ich mich. Danke für die Hilfe.
ramanunni .pm
1
füge a print xam Anfang deiner Funktion hinzu f . Sie werden sehen, wie der Gleichungslöser nacheinander verschiedene Werte von x versucht, was zu Ihrem Fehler führt.
Mtadd
3
In meinen Fällen war das Problem, dass das Argument nicht negativ war, sondern genau gleich 0, was zu derselben Ausnahme führt (was für Personen mit JS-Hintergrund überraschend sein kann, bei denen Math.log (0) einfach -Infinity ist)
qbolec
1

Sie versuchen, einen Logarithmus für etwas zu erstellen, das nicht positiv ist.

Logarithmen ermitteln die Basis, nachdem sie eine Zahl erhalten haben, und die Potenz, auf die sie erhöht wurde. log(0)bedeutet, dass etwas zur Macht erhoben 2wird 0. Ein Exponent kann niemals zu 0* führen, was bedeutet, dass er log(0)keine Antwort hat und somit das wirftmath domain error

* Hinweis: 0^0kann zur Folge haben 0, kann aber auch zur Folge 1haben. Dieses Problem wird heftig diskutiert.

Eric Xue
quelle
1

Sie können auch verwenden math.log1p.

Laut offizieller Dokumentation :

math.log1p (x)

Geben Sie den natürlichen Logarithmus von 1 + x (Basis e) zurück. Das Ergebnis wird auf eine Weise berechnet, die für x nahe Null genau ist.

Sie können wieder in den ursprünglichen Wert konvertieren, mit math.expm1dem edie Potenz x minus 1 erhöht wird.

Catalina Chircu
quelle
0

Sie erhalten einen Fehler in der mathematischen Domäne aus einem der folgenden Gründe: Entweder versuchen Sie, eine negative Zahl in der Protokollfunktion oder einen Nullwert zu verwenden.

Physik3067
quelle