牛顿法:使用python构建高阶程序

时间:2014-11-14 00:52:10

标签: python newtons-method

我正在学习计算机程序的结构和解释。

in pg。如图73所示,它使用牛顿法作为构造高阶程序的例子。

这是我的代码:

def deriv(g):
    dx = 0.00001
    return lambda x: (g(x + dx) - g(x)) / dx


def newton_transform(g):
    return lambda x: x - g(x) / deriv(g)(x)


def fixed_point(f, guess):
    def close_enough(a, b):
        tolerance = 0.00001
        return abs(a - b) < tolerance

    def a_try(guess):
        next = f(guess)
        if close_enough(guess, next):
            return next
        else:
            return a_try(next)

    return a_try(guess)


def newton_method(g, guess):
    return fixed_point(newton_transform(g), guess)


def sqrt(x):
    return newton_method(lambda y: x / y, 1.0)

print sqrt(2)

代码会崩溃并给我ZeroDivisionError。我知道它是如何崩溃的,但我不明白为什么它会像它一样。

在我的&#34; a_try&#34;功能,每一个&#34; next&#34;是&#34;猜测&#34;的加倍值。当我打印出来&#34;猜测&#34;和&#34; next&#34;每次迭代,我的下一个猜测只是保持加倍。所以整数溢出到最后。

为什么呢?我的代码出了什么问题?我的逻辑出了什么问题? 谢谢你的时间。请帮忙。

1 个答案:

答案 0 :(得分:1)

使用牛顿的方法来查找sqrt(2) - 即y**2 == 2 - 首先编写g(y) = y**2 - 2,然后使用newton_transform对其进行迭代,直到它收敛为止

您的derivnewton_transform没问题,您的fixed_point实际上会迭代newton_transform直到它收敛 - 或直到您达到递归限制,或直到您下溢浮动操作。在你的情况下,它是最后一个。

为什么呢?好吧,看看你的g(y):它是2/y。我不知道你从哪里得到的,但是g / g'只是-y,所以牛顿变换是y - -y,显然不会收敛。

但如果您插入y**2 - 2,那么g/g'上的转换将会收敛(至少对于大多数值而言)。

所以:

def sqrt(x):
    return newton_method(lambda y: y**2-x, 1.0)