ValueError:数学域错误


102

我只是从“ 使用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

我将其范围缩小到了日志,因为当我删除日志并添加其他功能时,它可以工作。我认为这是由于对底座的某种干扰,我不知道怎么做。谁能提出解决方案?

Answers:


131

您的代码执行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]值的来源,但希望这将引导您走上正确的道路。


我看不到它是如何做负对数的,因为定义是定义方程组,即x [0],x [1]和x [2]是牛顿拉夫森使用的变量x,y和z 。它需要这些方程组来求解。
ramanunni.pm

1
此外,如我所说的X [2] = 1.0时,我在上面,日志(1)= 0的代码中定义X,至少我是这样,虽然,也许我错了..感谢您的帮助虽然..
ramanunni .pm 2013年

1
print x在函数f的开头添加a 。您将看到方程求解器如何连续尝试x的不同值,从而导致错误。
mtadd

3
在我的情况下,问题是参数不是负数,而是正好等于0,这导致了相同的异常(这对于具有JS背景的人来说可能是令人惊讶的,其中Math.log(0)只是-Infinity)
qbolec

1

您正在尝试对非正数做对数。

对数在被赋予一个数字和被赋予的底数后找出底数。log(0)意味着某种提升力量的东西20。指数永远不会导致0*,这意味着log(0)没有答案,因此抛出math domain error

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



0

您由于以下任一原因而遇到数学域错误:您试图在对数函数中使用负数或零值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.