牛顿迭代法
2015-06-04 16:36
302 查看
牛顿迭代法求平方根
引申
从推导来看,其实牛顿迭代法不仅可以用来求平方根,还可以求立方根,甚至更复杂的运算。
求n的平方根,先假设一猜测值X0 = 1,然后根据以下公式求出 X1,再将 X1代入公式右边,继续求出 X2…通过有效次迭代后即可求出n的平方根, Xk+1 先让我们来验证下这个巧妙的方法准确性,来算下2的平方根 (Computed by Mathomatic) 1-> x_new = ( x_old + y/x_old )/2 y (x_old + -----) x_old #1: x_new = --------------- 2 1-> calculate x_old 1 Enter y: 2 Enter initial x_old: 1 x_new = 1.5 1-> calculate x_old 2 Enter y: 2 Enter initial x_old: 1 x_new = 1.4166666666667 1-> calculate x_old 3 Enter y: 2 Enter initial x_old: 1 x_new = 1.4142156862745 1-> calculate x_old 10 Enter y: 2 Enter initial x_old: 1 Convergence reached after 6 iterations. x_new = 1.4142135623731 ... 可见,随着迭代次数的增加,运算值会愈发接近真实值。很神奇的算法,可是怎么来的呢? 查了下wikipedia和wolfram,原来算法的名字叫Newton’s Iteration (牛顿迭代法)。 下面是极其boring的数理介绍,不喜欢数学的言下之意也就是绝大部分人可以略过了。 简单推导假设f(x)是关于 X的函数: 求出 f(x)的一阶导,即斜率: 简化等式得到: 然后利用得到的最终式进行迭代运算直至求到一个比较精确的满意值,为什么可以用迭代法呢?理由是中值定理(Intermediate Value Theorem): 如果 f函数在闭区间 [a,b]内连续,必存在一点 x使得 f(x) = c, c是函数 f在闭区间 [a,b]内的一点 我们先猜测一 X初始值,例如1,当然地球人都知道除了1本身之外任何数的平方根都不会是1。然后代入初始值,通过迭代运算不断推进,逐步靠近精确值,直到得到我们主观认为比较满意的值为止。例如要求768的平方根,因为 252 = 625,而 302 = 900,我们可先代入一猜测值26,然后迭代运算,得到较精确值:27.7128。 回到我们最开始的那个求2次方根的公式,令 x2 = n,假设一关于 X的函数 f(x)为: f(X) = X2 - n 求 f(X)的一阶导为: f'(X) = 2X 代入前面求到的最终式中: Xk+1 = Xk - (Xk2 - n)/2Xk 化简即得到我们最初提到的那个求平方根的神奇公式了: 用泰勒公式推导在The Art and Science of C一书中有用到泰勒公式求平方根的算法,其实牛顿迭代法也可以看作是泰勒公式(TaylorSeries)的简化,先回顾下泰勒公式: 仅保留等式右边前两项: 令 f(X0+ε) = 0,得到: 再令 X1 = X0 + ε0,得到 ε1…依此类推可知: 转化为: |
从推导来看,其实牛顿迭代法不仅可以用来求平方根,还可以求立方根,甚至更复杂的运算。
相关文章推荐
- HDU 3938 离线并查集+二分
- POJ2528线段树段更新逆序异或(广告牌)
- SQL Server用户登录失败
- 第七届SACC2015带你飞
- Spark+Cassandra优化
- 中兴阅读:你的移动阅读解决专家,助纸媒们一臂之力
- 14.1 将计算机加入域
- MFC DLL PreTranslateMessage 导致的快捷键不响应的问题?
- POJ2406简单KMP
- poj2418map或者字典树
- SpringMVC 学习笔记(六) 数据绑定和JSR校验
- 004-流程控制和类型转换
- ccs平台 28335mcu 关于变量重复定义的解决方案
- CrashMonkey4Android
- Android报Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0 .解决办法
- 用户画像的一些相关信息链接
- [picture]saber
- oracle 11g sql developer安装后无法使用
- 树形列表成员- DevExpress.XtraTreeList.TreeList
- Linux下为PHP添加MongoDB扩展