1

我正在尝试在 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)
4

3 回答 3

4

牛顿法是

牛顿法

所以x1 = f(x) - (f(x)/df(x))

应该

x1 = x - (f(x)/df(x))

于 2014-05-11T12:25:55.663 回答
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
于 2014-05-11T12:40:11.403 回答
0

您正在求解的方程是三次方程,因此 x 有两个值,其中 df(x)=0。除以零或接近零的值会导致溢出,因此您需要避免这样做。

牛顿算法的一个实际考虑是如何处理接近局部最大值或最小值的 x 值。溢出可能是由除以接近零的值引起的。您可以通过在您的行之前添加一个打印语句来显示这一点x=——打印 x 和 df(x)。为避免此问题,您可以df(x)在除法之前进行计算,如果低于某个阈值,则将 x 的值向上或向下小幅度调整,然后重试。

于 2014-05-11T12:43:11.133 回答