为什么 math.log 会导致 ValueError: math 域错误?

问题描述 投票:0回答:6

我刚刚测试了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

我已将其范围缩小到日志,因为当我删除日志并添加不同的功能时,它可以工作。我认为这是因为对基地的某种干扰,我不知道是怎么回事。谁能提出解决方案吗?


另请参阅:使用 math.acos 函数的 Python 数学域错误,了解使用

math.acos
的等效问题; python 数学域错误 - sqrt 对于使用
math.sqrt
的等效问题。

python runtime-error logarithm
6个回答
174
投票

您的代码正在执行小于或等于零的数字的

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]
值来自哪里,但希望这会引导你走上正确的轨道。


4
投票

您也可以使用

math.log1p

根据官方文档

数学.log1p(x)

返回 1+x(以 e 为底)的自然对数。结果 的计算方式对于 x 接近于零是准确的。

您可以使用

math.expm1
转换回原始值,这会返回
e
的 x 次方减 1。


4
投票

由于以下任一原因,您会收到数学域错误: 您尝试在 log 函数内使用负数或零值。


3
投票

当我们使用

log()
库中的
sqrt()
math
时,我们会遇到这个问题。在这个问题“数学域错误”中,我们使用了负数,例如(-1或其他)或零数,而我们不应该使用它。


2
投票

您正在尝试对非正值求对数。

对数在给定数字后计算出底数及其幂。

log(0)
表示某物的
2
次方为
0
。指数永远不会导致
0
*,这意味着
log(0)
没有答案,从而抛出
math domain error

*注意:

0^0
可以导致
0
,但也可以同时导致
1
。这个问题引起了激烈的争论。


0
投票
def f(x):
f = np.zeros(len(x))
f[0] = np.sin(x[0]) + x[1]**2 + np.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 = [1.0, 1.0, 1.0]
y = f(x)
print(y)

它给出输出 [-5.15852902 5. -2. ]

© www.soinside.com 2019 - 2024. All rights reserved.