120

我只是在用 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

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

4

5 回答 5

156

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

于 2013-04-08T23:06:46.630 回答
3

您也可以使用math.log1p.

根据官方文档

数学.log1p(x)

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

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

于 2020-02-10T08:55:56.923 回答
3

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

于 2020-06-23T16:37:20.093 回答
1

您正在尝试对不是正数的事物进行对数。

对数在给出一个数字和它的幂后计算出底数。log(0)表示某物的幂次20。指数永远不会导致0*,这意味着log(0)没有答案,因此抛出math domain error

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

于 2019-07-01T21:54:38.300 回答
0
于 2021-11-17T17:48:49.733 回答