2013-04-08 8 views
64

Ich habe gerade ein Beispiel aus Numerische Methoden in Engineering mit Python getestet.ValueError: Math-Domain-Fehler

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 laufen, es wird folgende Fehler zeigt:

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 es verengt haben in das Protokoll nach unten, wie wenn ich log entfernen und eine andere Funktion hinzuzufügen, es funktioniert. Ich nehme an, dass es wegen einer Art Störung der Basis ist, ich kann nicht herausfinden, wie. Kann jemand eine Lösung vorschlagen?

Antwort

79

Ihr Code macht eine log einer Zahl, die kleiner oder gleich Null ist. Das ist mathematisch undefiniert, so dass Pythons log-Funktion eine Ausnahme auslöst. Hier 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 newtonRaphson2 funktioniert, ich bin nicht sicher, ich kann erraten, wo der ungültige x[2] Wert herkommt, aber dies wird hoffentlich Sie auf dem richtigen Weg führen.

+0

Ich sehe nicht, wie es ein negatives Protokoll macht, da die Definition den Satz von Gleichungen definiert, das heißt 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. –

+0

Also, wie ich x [2] = 1.0 sage, wenn ich x im obigen Code definiere, log (1) = 0, zumindest was ich tue, vielleicht bin ich falsch .. Danke für die Hilfe aber .. –

+1

füge ein "print x" am Anfang deiner Funktion hinzu ** f **. Sie werden sehen, wie der Gleichungslöser nacheinander verschiedene Werte von x ausprobiert, was zu Ihrem Fehler führt. – mtadd