数学域错误

我只是在测试一个来自 Python 工程中的数值方法的例子。

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

我已经将范围缩小到日志,因为当我删除日志并添加一个不同的函数时,它就可以工作了。我猜是因为基地受到了某种干扰,我不知道是怎么回事。有人能提出解决办法吗?

465303 次浏览

您的代码正在执行一个小于或等于零的数字的 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]值来自哪里,但是希望这将引导您走上正确的道路。

你试图做一个对数的东西是不正的。

对数在得到一个数字和它被提高到的权值之后计算出基数。log(0)意味着某物的功率上升到 2就是 0。指数永远不会导致 0 * ,这意味着 log(0)没有答案,因此抛出了 math domain error

* 注意: 0^0可以产生 0,但同时也可以产生 1。这个问题引起了激烈的争论。

您也可以使用 math.log1p

根据 正式文件:

Log1p (x)

返回1 + x (基数 e)的自然对数 计算方法对 x 接近于零是精确的。

您可以使用 math.expm1转换回原始值,它返回的 e提高到 x 的幂减1。

你会因为以下两个原因中的一个得到数学域错误: 要么是在 log 函数中使用负数,要么是使用零值。

当我们从 math库中使用 log()sqrt()时,我们面临这个问题。在这个问题 “数学领域错误”中,我们使用了一个负数,比如(-1或另一个) ,或者一个零数,在这里我们不应该使用它。