2013-04-08 88 views
64

我只是在測試中的一個例子,用Python工程中的數值方法ValueError:數學域錯誤

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) 

當我運行它,它顯示了以下錯誤:

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 

我已經把範圍縮小到日誌中,當我刪除日誌,並添加不同的功能,它的工作原理。我認爲這是因爲某些干擾基地,我無法弄清楚。任何人都可以提出解決方案

回答

79

您的代碼正在執行一個小於或等於零的數字log。這在數學上是未定義的,所以Python的log函數引發了一個異常。這裏有一個例子:

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

不知道你newtonRaphson2的功能是什麼,我不知道我能猜出這些無效x[2]值是從哪裏來的,但希望這會導致你在正確的軌道上。

+0

我看不出它是如何操作的方式爲定義定義所述一組方程組的負對數,即x [0],X [1]和X [2]是變量x,y和z,其牛頓拉夫森使用。它需要這些方程來解決。 – 2013-04-08 23:11:40

+0

此外,正如我所說的x [2] = 1.0當我在上面的代碼中定義x時,log(1)= 0,至少這是我雖然,也許我錯了..謝謝你的幫助.. – 2013-04-08 23:18:55

+1

在你的函數** f **的開頭添加一個'print x'。你會看到方程求解器如何連續嘗試不同的x值,導致你的錯誤。 – mtadd 2013-04-08 23:28:07