【问题标题】:Newton Method: building higher order procedure using python牛顿法:使用python构建高阶过程
【发布时间】:2015-01-11 07:51:51
【问题描述】:

我正在研究计算机程序的结构和解释。

在第 页。 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。我知道它是如何崩溃的,但我不明白它为什么会这样。

在我的“a_try”函数中,每个“next”都是“guess”的两倍。当我打印出每次迭代的“猜测”和“下一个”时,我的下一个猜测只会不断翻倍。所以整数溢出到底。​​p>

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

【问题讨论】:

  • 整数在 Python 中不会溢出。他们只是不断成长。 (好吧,最终你会得到一个MemoryError,但它们不会翻转到 0。)所以,你对问题的描述不可能是正确的。但是,您显然要转换到某个地方(希望足够早)或 sqrt(2) 必须是 1,所以这并不真正相关。
  • 也许在顶部添加from __future__ import division
  • 我对这应该如何工作感到困惑。任何地方都没有发生平方,所以,即使它收敛了,它如何收敛到平方根? (您的 derivnewton_transform 函数看起来不错,我只是不明白您要在这里转换的内容。)如果没有看到您正在移植的 Scheme 代码,很难猜出缺少什么
  • 其实,这就是问题的全部……等一下。

标签: python newtons-method


【解决方案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)

【讨论】:

  • 是的。这就是答案。我理解牛顿的方法是错误的。非常感谢 !!!!!!逻辑错误比编程错误更难识别......
  • @LucasShen:我很高兴你能理解,因为我很难解释数学,我打算建议如果你不明白,你应该去其他地方(也许Math.sx)有人可以把它说得更好。 :)
  • 哈哈哈,这也是个好资源。但仅供参考,根据我之前的错误,我的 g(y) = x/y,所以我的牛顿变换将得到一个 lambda y: 2*y。这就是我的猜测无法收敛的原因......并且每次迭代都会加倍。
猜你喜欢
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多