【问题标题】:ValueError: math domain errorValueError:数学域错误
【发布时间】:2013-04-08 22:58:46
【问题描述】:

我只是在测试 Numerical Methods in Engineering with 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 runtime-error logarithm


    【解决方案1】:

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

    【讨论】:

    • 我看不出它是如何做负对数的,因为定义是定义方程组,即 x[0]、x[1] 和 x[2] 是变量 x Newton Raphson 使用的 ,y 和 z。它需要这组方程来求解。
    • 另外,正如我所说的 x[2] = 1.0,当我在上面的代码中定义 x 时,log(1) = 0,至少我是这样,也许我错了.. 谢谢不过求帮助..
    • 在函数 f 的开头添加 print x。您将看到方程求解器如何连续尝试不同的 x 值,从而导致您的错误。
    • 在我的情况下,问题是参数不是负数,而是完全等于 0,这会导致相同的异常(对于具有 JS 背景的人来说,这可能会令人惊讶,其中 Math.log(0)只是-Infinity)
    【解决方案2】:

    您也可以使用math.log1p。

    根据official documentation:

    math.log1p(x)

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

    您可以使用 math.expm1 转换回原始值,这将返回 e 的 x 次幂减 1。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您正在尝试对非正数进行对数。

        对数在给出一个数字后计算出底数和它的幂。 log(0) 表示提升到2 的力量的东西是0。一个指数永远不会导致0*,这意味着log(0)没有答案,因此抛出math domain error

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-01-04
            • 2021-08-04
            • 2020-05-06
            • 1970-01-01
            • 2021-11-10
            • 2016-11-16
            • 2019-10-12
            相关资源
            最近更新 更多