码迷,mamicode.com
首页 > 其他好文 > 详细

牛顿迭代法求解平方根

时间:2017-07-14 23:53:57      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:sqrt   toc   牛顿法   使用   复杂   分享   实现   相对   ace   

牛顿迭代法求解平方根

 

目录(?)[+]

 

 

 

一个实例

//java实现的sqrt类和方法
public class sqrt {
    public static double sqrt(double n)
    {
        if (n<0) return Double.NaN;
        double err = 1e-15;
        double t = n;
        while (Math.abs(t - n/t) > err*t)
            t = (n/t + t)/2;
        return t;
    }
    public static void main(String[] args)
    {
        sqrt a  = new sqrt();
        System.out.println(a.sqrt(2));
    }
}
//2的平方根的求解结果
>>1.414213562373095
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

迭代简介

迭代,是一种数值方法,具体指从一个初始值,一步步地通过迭代过程,逐步逼近真实值的方法。 
与之相对的是直接法,也就是通过构建解析解,一步求出问题的方法。

通常情况下,我们总是喜欢一步得到问题的结果,因此直接法总是优先考虑的。 
但是,当遇到复杂的问题时,特别在未知量很多,方程非线性时,无法得到直接解法(例如五次方程并没有解析解)。 
这时候,我们需要使用迭代算法,一步步逼近,得到问题的答案。

迭代算法,通常需要考虑如下问题: 
- 确定迭代变量 
- 确定迭代关系式 
- 确定迭代终止条件

牛顿迭代法

牛顿迭代法简介

牛顿迭代法,求解如下问题的根x

 

f(x)=0

 

求解方法如下:

 

xn+1=xn?f(xn)f(xn)

 

方法中,迭代变量是根x,迭代关系式如上,迭代终止条件是|f(xn)?0|<error

牛顿迭代法需要满足的条件是: 
f(x)是连续的,并且待求的零点x是孤立的。 
那么,在零点x周围存在一个区域,只要初始值x0位于这个邻域内,那么牛顿法必然收敛。 
并且,如果f(x)不为0,那么牛顿法将具有平方收敛的特性,也就是,每迭代一次,其结果的有效倍数将增加一倍。

简单推导

技术分享

由 

f(xn)=dydx=f(xn)xn?xn+1

 

有 

xn+1=xn?f(xn)f(xn)

 

对于平方根问题,假设f(x)=x2?n,代入上式,有 

xn+1=12(xn+nxn)

 

其图像含义是:通过对接近零点的领域点做切线,不断逼近零点,最终十分靠近零点。

泰勒公式推导

上面的式子,同样,可以用泰勒公式推导出来。 

f(xn+?)=f(xn)+f(xn)?+12f′′(x)?2+...

只取等号右边的前两项,有 
?=f(xn+?)?f(xn)f(xn)

两边同时加上xn,有 
xn+1=xn+?=xn+f(xn+?)?f(xn)f(xn)=xn+f(xn+1)?f(xn)f(xn)

最终,f(xn+1=0),假设f(x)=x2?n,上式同样可以化成 
xn+1=12(xn+nxn)

 

本质上,牛顿迭代法就是利用了泰勒公式的前两项和,是泰勒公式的简化。

延伸与应用

同样的,牛顿迭代法同样可以求n次方根,对于f(x)=xm?n 
有 

xn+1=xn?xnm(1?axn?m)

牛顿迭代法求解平方根

标签:sqrt   toc   牛顿法   使用   复杂   分享   实现   相对   ace   

原文地址:http://www.cnblogs.com/developer-ios/p/7173012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!