zoukankan      html  css  js  c++  java
  • 利用牛顿迭代法求平方根

    数理介绍,不喜欢数学的言下之意也就是绝大部分人可以略过了。

    简单推导

    假设f(x)是关于X的函数:

    An illustration of one iteration of Newton's method

    求出f(x)的一阶导,即斜率:

    f'(x_{n}) = frac{ mathrm{rise} }{ mathrm{run} } = frac{ mathrm{Delta y} }{ mathrm{Delta x} } = frac{ f( x_{n} ) - 0 }{ x_{n} - x_{n+1} } = frac{0 - f(x_{n})}{(x_{n+1} - x_{n})}\,!

    简化等式得到:

     x_(n+1)=x_n-(f(x_n))/(f^'(x_n))

    然后利用得到的最终式进行迭代运算直至求到一个比较精确的满意值,为什么可以用迭代法呢?理由是中值定理(Intermediate Value Theorem):

    如果f函数在闭区间[a,b]内连续,必存在一点x使得f(x) = cc是函数f在闭区间[a,b]内的一点

    我们先猜测一X初始值,例如1,当然地球人都知道除了1本身之外任何数的平方根都不会是1。然后代入初始值,通过迭代运算不断推进,逐步靠近精确值,直到得到我们主观认为比较满意的值为止。例如要求768的平方根,因为252 = 625,而302 = 900,我们可先代入一猜测值26,然后迭代运算,得到较精确值:27.7128。

    回到我们最开始的那个”莫名其妙”的公式,我们要求的是N的平方根,令x2 = n,假设一关于X的函数f(x)为:

    f(X) = X2 - n

    f(X)的一阶导为:

    f'(X) = 2X

    代入前面求到的最终式中:

    Xk+1 = Xk - (Xk2 - n)/2Xk

    化简即得到我们最初提到的那个求平方根的神奇公式了:

     x_(k+1)=1/2(x_k+n/(x_k))

    用泰勒公式推导

    我之前介绍过在The Art and Science of C一书中有用到泰勒公式求平方根的算法,其实牛顿迭代法也可以看作是泰勒公式(Taylor Series)的简化,先回顾下泰勒公式:

    f(x_0+epsilon)=f(x_0)+f^'(x_0)epsilon+1/2f^('')(x_0)epsilon^2+....

    仅保留等式右边前两项:

    f(x_0+epsilon) approx f(x_0)+f^'(x_0)epsilon.

    f(X0+ε) = 0,得到:

    epsilon_0=-(f(x_0))/(f^'(x_0))

    再令X1 = X0 + ε0,得到ε1…依此类推可知:

    epsilon_n=-(f(x_n))/(f^'(x_n))

    转化为:

     x_(n+1)=x_n-(f(x_n))/(f^'(x_n))

    引申

    从推导来看,其实牛顿迭代法不仅可以用来求平方根,还可以求立方根,甚至更复杂的运算。

    同样,我们还可以利用C语言来实现下那个最简单的求平方根的公式(尽管我们可以直接用sqrt()完成)

    #include <stdio.h>
    #include <math.h>
    #define N 768
    main() {
    float x=1;
    int i;
    for (i=1;i<=1000;i++) {  // recursion times : 1000
    x = (x + N/x)/2;
    }
    printf("The square root of %d is %f
    ",N,x);
    }

    原文地址:http://www.blogjava.net/tinysun/archive/2009/05/01/242126.html
  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/CoolRandy/p/3231235.html
Copyright © 2011-2022 走看看