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

bfnvny8b  于 2023-01-12  发布在  Python
关注(0)|答案(5)|浏览(308)

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

我已经把范围缩小到日志,因为当我删除日志并添加一个不同的功能时,它工作了。我想这是因为某种干扰的基础,我不知道是怎么回事。有人能建议一个解决方案吗?
另请参阅:Python math domain error using math.acos function使用math.acos的等价问题;使用math.sqrt的等效问题的python math domain error - sqrt

bsxbgnwa

bsxbgnwa1#

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

zed5wv10

zed5wv102#

您也可以使用math.log1p
根据official documentation
数学对数1p(x)
返回1+x(以e为底)的自然对数。计算结果的方法是x接近零时精确。
您可以使用math.expm1将其转换回原始值,它返回e的x次幂减1。

jmo0nnb3

jmo0nnb33#

由于以下原因之一,您将获得数学域错误:您尝试在log函数中使用负数或零值。

vulvrdjw

vulvrdjw4#

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

xuo3flqw

xuo3flqw5#

你在试着对一个非正的东西求对数。
对数在给定一个数字及其自乘的幂之后计算基数。log(0)意味着自乘到2的幂的东西是0。指数永远不能得到0 *,这意味着log(0)没有答案,因此抛出math domain error

  • 注意:0^0可以导致0,但也可以同时导致1,这个问题争论很大。

相关问题