在Python中使用牛顿法时出现溢出错误
我正在尝试在Python中使用牛顿法来解决一个问题。我参考了一些例子的做法,但遇到了溢出错误。你知道这可能是什么原因吗?
def f1(x):
return x**3-(2.*x)-5.
def df1(x):
return (3.*x**2)-2.
def Newton(f, df, x, tol):
while True:
x1 = f(x) - (f(x)/df(x))
t = abs(x1-x)
if t < tol:
break
x = x1
return x
init = 2
print Newton(f1,df1,init,0.000001)
3 个回答
0
你正在解决的方程是三次方程,所以会有两个x的值使得df(x)=0。除以零或者接近零的值会导致溢出,所以你需要避免这样做。
使用牛顿算法时,有一个实际需要考虑的事情,就是如何处理接近局部最大值或最小值的x值。溢出很可能是因为除以了接近零的东西。你可以通过在x=
这一行之前加一个打印语句来查看x和df(x)的值。为了避免这个问题,你可以在除之前先计算df(x)
,如果它低于某个阈值,就稍微调整一下x的值,再试一次。
1
你的代码里有个错误。应该是这样:
def Newton(f, df, x, tol):
while True:
x1 = x - (f(x)/df(x)) # it was f(x) - (f(x)/df(x))
t = abs(x1-x)
if t < tol:
break
x = x1
return x
4
牛顿法是一种用于寻找方程根的数学方法。
所以这里的公式应该是
x1 = x - (f(x)/df(x))