2013-04-08 9 views
64

Właśnie testowałem przykład z Metody numeryczne w inżynierii z Pythonem.ValueError: błąd dziedziny matematyki

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) 

Kiedy go uruchomić, to pokazuje następujący błąd:

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 

mam zmniejszyła go do dziennika jako dziennika kiedy usunąć i dodać inną funkcję, to działa. Zakładam, że dzieje się tak z powodu jakiejś ingerencji w bazę, nie wiem jak. Czy ktoś może zaproponować rozwiązanie?

Odpowiedz

79

Twój kod wykonuje log liczby mniejszej lub równej zero. Jest to matematycznie niezdefiniowane, więc funkcja Pythona log podnosi wyjątek. Oto przykład:

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

Nie wiedząc co robi funkcja newtonRaphson2, nie jestem pewien, że mogę odgadnąć, gdzie nieważne wartość x[2] pochodzi, ale mam nadzieję, że doprowadzi Cię na właściwej drodze.

+0

Nie widzę sposobu wykonywania logu ujemnego, ponieważ definicja definiuje zbiór równań, tj. X [0], x [1] i x [2] to zmienne x, yiz, które Używa Newton Raphson. Ten układ równań wymaga rozwiązania. –

+0

Również, jak mówię x [2] = 1.0, kiedy definiuję x w powyższym kodzie, log (1) = 0, przynajmniej tak myślę, może się mylę .. Dzięki za pomoc chociaż .. –

+1

dodaj 'print x' na początku swojej funkcji ** f **. Dowiesz się, jak solver sukcesywnie próbuje różnych wartości x, prowadząc do twojego błędu. – mtadd

Powiązane problemy