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?
python
runtime-error
logarithm
ramanunni.pm
quelle
quelle
print x
am Anfang deiner Funktion hinzu f . Sie werden sehen, wie der Gleichungslöser nacheinander verschiedene Werte von x versucht, was zu Ihrem Fehler führt.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 erhoben2
wird0
. Ein Exponent kann niemals zu0
* führen, was bedeutet, dass erlog(0)
keine Antwort hat und somit das wirftmath domain error
* Hinweis:
0^0
kann zur Folge haben0
, kann aber auch zur Folge1
haben. Dieses Problem wird heftig diskutiert.quelle
Sie können auch verwenden
math.log1p
.Laut offizieller Dokumentation :
Sie können wieder in den ursprünglichen Wert konvertieren, mit
math.expm1
deme
die Potenz x minus 1 erhöht wird.quelle
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.
quelle