Fork me on GitHub
迭代法

牛顿迭代法

1. 迭代公式建立

clip_image002clip_image004点的Taylor展开如下:

clip_image006

一阶泰勒多项式:clip_image008

clip_image010近似于clip_image012

解出x记为clip_image014,则clip_image016

2. 牛顿迭代法的几何解析

clip_image002[4]处做曲线的切线,切线方程为:

clip_image004[4]

clip_image006[4]得切线与x轴的交点坐标为clip_image008[4],这就是牛顿迭代法的迭代公式。因此,牛顿法又称“切线法”。

clip_image010

Newton迭代法的特点是:

1. 对初值clip_image002[6]的选取要求较高。一般的,Newton迭代法只有局部收敛性,当初值clip_image002[7]在收敛区间里时,收敛速度很快(平方收敛)。但初值clip_image002[8]离方程根x*较远时,不能保证Newton迭代法收敛。

clip_image003

2. Newton迭代法求单根时,收敛速度很快(平方收敛)。但如果方程根clip_image005是重根,则收敛速度较慢,且重数越高速度越慢。但当clip_image005[1]是m重根时,用下面的迭代格式:

clip_image007

则至少能保持平方收敛。

3.应用:用有Newton迭代法求clip_image002[12]

求解:设clip_image002[14],则clip_image004[6]

clip_image006[6]

clip_image008[6]

程序实现:

复制代码
#define ABS(VAL) (((VAL)>0)?(VAL):(-(VAL)))   
//用牛顿迭代法求浮点数的平方根   
double mysqrt(float x) {   
    double g0,g1;   
    if(x==0) 
        return 0;   
    g0=x/2;   //初值
    g1=(g0+x/g0)/2;   
    while(ABS(g1-g0)>0.01) //终止条件  
    {   
        g0=g1;   
        g1=(g0+(x/g0))/2;   //迭代规则
    }   
    return g1;   
}
复制代码

复制代码
double sqr(double n) {
    double k=1.0;
    while(abs(k*k-n)>1e-9) {
        k=(k+n/k)/2;
    }
    return k;
}
复制代码

附加:

1. Newton下山法

由于当初值clip_image002[16]离方程根clip_image004[8]较远时,不能保证Newton迭代法收敛,但一旦clip_image006[8]进入收敛区间,则收敛速度很快。为使clip_image006[9]尽快进入收敛区间,常采用Newton下山法:

clip_image008[8] clip_image010[4]称为下山因子

具体做法如下:

1. 选取初值clip_image002[17] 
2. 取下山因子clip_image012[4](可修改) 
3. 计算clip_image008[9] 
4. 计算clip_image014[4]并比较clip_image016[4]clip_image018的大小: 
clip_image020,则 
         1) 当clip_image022时,取clip_image024,结束; 
         2) 当clip_image026时,将clip_image028作为新的clip_image006[10]值继续计算; 
clip_image030,则取clip_image032,返回3。

2. 弦截法(方程常用的求解方法)

将Newton切线法中的切线斜率clip_image002[20]用弦的斜率替换:

clip_image004[10]

clip_image006

 
 
分类: 小杂碎
posted on 2013-09-22 12:47  HackerVirus  阅读(596)  评论(0编辑  收藏  举报