牛顿迭代法求平方根

迭代是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程,为实现这一过程所使用的方法统称为迭代法(Iterative Method)。

 一般可以做如下定义:对于给定的线性方程组x=Bx+f(这里的x、B、f同为矩阵,任意线性方程组都可以变换成此形式),用公式x(k+1)=Bx(k)+f(括号中为上标,代表迭代k次得到的x,初始时k=0)逐步带入求近似解的方法称为迭代法(或称一阶定常迭代法)。如果k趋向无穷大时limt(k)存在,记为x*,称此迭代法收敛。显然x*就是此方程组的解,否则称为迭代法发散。

  跟迭代法相对应的是直接法(或者称为一次解法),即一次性的快速解决问题,例如通过开方解决方程x +3= 4。一般如果可能,直接解法总是优先考虑的。但当遇到复杂问题时,特别是在未知量很多,方程为非线性时,我们无法找到直接解法(例如五次以及更高次的代数方程没有解析解,参见阿贝耳定理),这时候或许可以通过迭代法寻求方程(组)的近似解。

  最常见的迭代法是牛顿法。其他还包括最速下降法、共轭迭代法、变尺度迭代法、最小二乘法、线性规划、非线性规划、单纯型法、惩罚函数法、斜率投影法、遗传算法、模拟退火等等。 

利用迭代算法解决问题,需要做好以下三个方面的工作:

确定迭代变量

  在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

建立迭代关系式

  所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以顺推或倒推的方法来完成。

对迭代过程进行控制

  在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

用迭代法求平方根

  已知求平方根的迭代公式为:x n+1 = (x+ a / xn) / 2,要求前后两次求出的差的绝对值小于10-5

算法如下:

  ① 设定一个x的初值x0 ; (在如下程序中取x0=a/2, 通过迭代公式求出x1,可以肯定与真正的平方根相比,误差很大。)
  ② 迭代关系式: 用公式x n+1 = (x+ a / xn) / 2求出x的下一个值 x1 ;
  ③ 迭代终止条件:如此继续下去,直到前后两次求出的x值(x n+1和xn)满足以下关系:|x n+1-xn|<10-5 .

c语言实现:

 1 #define ABS(VAL) (((VAL)>0)?(VAL):(-(VAL)))   
 2 //用牛顿迭代法求浮点数的平方根   
 3 double mysqrt(float x) {   
 4     double g0,g1;   
 5     if(x==0)   
 6         return 0;   
 7     g0=x/2;   
 8     g1=(g0+x/g0)/2;   
 9     while(ABS(g1-g0)>0.01)   
10     {   
11         g0=g1;   
12         g1=(g0+(x/g0))/2;   
13     }   
14     return g1;   
15 }  

内容引自:http://baike.baidu.com/view/649495.htm

 

代码引自:http://yarin.blog.51cto.com/1130898/379989

证明查看:http://brianyang1106.blog.163.com/blog/static/13760289220101251211355/

posted @ 2012-09-25 21:01  大兔子_快跑  阅读(5374)  评论(1编辑  收藏  举报