问题:ValueError:数学域错误
我只是从“ 使用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
我将其范围缩小到了日志,因为当我删除日志并添加其他功能时,它可以工作。我认为这是由于对底座的某种干扰,我不知道怎么做。谁能提出解决方案?
回答 0
您的代码执行log
的a小于或等于零。这在数学上是未定义的,因此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]
值的来源,但希望这将引导您走上正确的道路。
回答 1
您正在尝试对非正数做对数。
对数在被赋予一个数字和被赋予的底数后找出底数。log(0)
意味着某种提升力量的东西2
是0
。指数永远不会导致0
*,这意味着log(0)
没有答案,因此抛出math domain error
*注意:0^0
可以产生0
,但也可以同时产生1
。这个问题被激烈参数。
回答 2
您也可以使用math.log1p
。
根据官方文件:
math.log1p(x)
返回1 + x(以e为底)的自然对数。对x接近零的结果进行精确计算。
您可以转换回原始值,并使用math.expm1
该原始值将e
乘幂x减1。
回答 3
您由于以下任一原因而遇到数学域错误:您试图在对数函数中使用负数或零值。