我刚刚测试了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
我已将其范围缩小到日志,因为当我删除日志并添加不同的功能时,它可以工作。我认为这是因为对基地的某种干扰,我不知道是怎么回事。谁能提出解决方案吗?
另请参阅:使用 math.acos 函数的 Python 数学域错误,了解使用
math.acos
的等效问题; python 数学域错误 - sqrt 对于使用 math.sqrt
的等效问题。
您的代码正在执行小于或等于零的数字的
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]
值来自哪里,但希望这会引导你走上正确的轨道。
您也可以使用
math.log1p
。
根据官方文档:
数学.log1p(x)
返回 1+x(以 e 为底)的自然对数。结果 的计算方式对于 x 接近于零是准确的。
您可以使用
math.expm1
转换回原始值,这会返回 e
的 x 次方减 1。
由于以下任一原因,您会收到数学域错误: 您尝试在 log 函数内使用负数或零值。
当我们使用
log()
库中的 sqrt()
或 math
时,我们会遇到这个问题。在这个问题“数学域错误”中,我们使用了负数,例如(-1或其他)或零数,而我们不应该使用它。
您正在尝试对非正值求对数。
对数在给定数字后计算出底数及其幂。
log(0)
表示某物的 2
次方为 0
。指数永远不会导致 0
*,这意味着 log(0)
没有答案,从而抛出 math domain error
*注意:
0^0
可以导致0
,但也可以同时导致1
。这个问题引起了激烈的争论。
def f(x):
f = np.zeros(len(x))
f[0] = np.sin(x[0]) + x[1]**2 + np.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 = [1.0, 1.0, 1.0]
y = f(x)
print(y)
它给出输出 [-5.15852902 5. -2. ]