【问题标题】:Fixed point theory and the isGoodEnough function不动点理论和 isGoodEnough 函数
【发布时间】:2015-09-22 11:05:25
【问题描述】:

在 Coursera 课程 Functional Programming Principles in Scala 中,讲师谈到了 Fixed Point 并编写了一些简单的实现。

def isCloseEnough(x: Double, y: Double) = 
    math.abs((x - y) / x) / x < tolerance

def fixedPoint(f: Double => Double)(guess: Double) = {

    def iterate(guess: Double): Double = {
        val next = f(guess)
        if (isCloseEnough(guess, next)) next
        else iterate(next)
    }
    iterate(guess)
}   

这样的实现将允许以下函数f(x) = 1 + x 有一个不动点。

但是,这不应该永远发生。 就像在这个函数图中:

这就是维基百科所说的:

并非所有函数都有固定点:例如,如果 f 是一个函数 在实数上定义为 f(x) = x + 1,则它没有固定的 点,因为对于任何实数,x 永远不会等于 x + 1。

这里的重点在于isCloseEnough,我不明白为什么要这样写。

我来这里是为了了解isCloseEnough 以及它为何以这种方式实施 就是这样。

【问题讨论】:

    标签: scala computer-science fixed-point-iteration


    【解决方案1】:

    算法并不完美,它显然应该取决于您选择的容差。如果我们检查isCloseEnough

    def isCloseEnough(x: Double, y: Double) = 
        math.abs((x - y) / x) / x < tolerance
    

    真的很像:

    | x - y | / x^2 < tolerance
    

    除了由于某种原因它没有取x的外除的绝对值,这在x为负时完全破坏了算法。

    这个想法是,我们通过找到一个与f(x)任意接近x 来找到一个固定点,即xf(x) 之间的差异很小如我们所愿(低于某些公差)。如果我们可以快速找到固定点,这很好用:

    scala> fixedPoint(math.sqrt)(2)
    res2: Double = 1.0000846162726942
    

    这里,固定点是x = 1,其中math.sqrt(1) = 1。我用tolerance = 0.0001。如果我使用更小的东西,我显然会更接近固定点1

    但现在说我有:

    def f(x: Double): Double = x + 1
    
    scala> fixedPoint(f)(1)
    res4: Double = 102.0
    

    它找到一个大约为102.0 的不动点。显然,这是错误的,但这是因为 xf(x) 之间的差异总是 1 对于这个函数,并且随着 x 变大,1 / x^2 变小并且小到低于tolerance。如果我把tolerance 变小,我会找到一个更大的不动点。

    val tolerance = 0.000000001
    
    scala> fixedPoint(f)(1)
    res5: Double = 31624.0
    

    这显然也是错误的。但关键是,对于一个固定点,我应该能够使tolerance 任意小,并且仍然得到一致的结果。有了这个函数,很明显对于任何固定的tolerance,最终1 / x^2都会比它小。 但是,对于任何x,我总是可以选择一个足够小的tolerance,这样1 / x^2 总是会落在它之外,所以没有固定点。

    这几乎不是数学证明,但关键是该算法在某些标准上存在缺陷。

    【讨论】:

    • 我已经离开数学领域很长时间了,我正在阅读您的答案并试图理解它..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2019-07-16
    相关资源
    最近更新 更多