我刚刚测试了 * 使用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。
5条答案
按热度按时间bsxbgnwa1#
你的代码正在对一个小于或等于零的数执行
log
运算,这在数学上是未定义的,所以Python的log
函数会引发一个异常,下面是一个例子:如果不知道
newtonRaphson2
函数的作用,我不确定是否能猜出无效的x[2]
值来自何处,但希望这将引导您走上正确的道路。zed5wv102#
您也可以使用
math.log1p
。根据official documentation:
数学对数1p(x)
返回1+x(以e为底)的自然对数。计算结果的方法是x接近零时精确。
您可以使用
math.expm1
将其转换回原始值,它返回e
的x次幂减1。jmo0nnb33#
由于以下原因之一,您将获得数学域错误:您尝试在log函数中使用负数或零值。
vulvrdjw4#
我们在使用
log()
或math
库中的sqrt()
时遇到这个问题。在这个问题中**“数学域错误”**中,我们使用了一个负数,如(-1或其他)或一个不应该使用的零。xuo3flqw5#
你在试着对一个非正的东西求对数。
对数在给定一个数字及其自乘的幂之后计算基数。
log(0)
意味着自乘到2
的幂的东西是0
。指数永远不能得到0
*,这意味着log(0)
没有答案,因此抛出math domain error
0^0
可以导致0
,但也可以同时导致1
,这个问题争论很大。