牛顿迭代法

牛顿迭代法用于求函数的零点。

问题

考虑求一个函数的一个零点。
如果函数是一次函数f(x)=kx+b,则显然有零点(bk,0)
如果函数是二次函数呢?好像也不难,用求根公式即可。
现在问题来了:人类已经证明,五次以上的方程没有求根公式。如果拿到的方程极为奇怪,又该如何处理?
牛顿迭代法提出了解决方案。

方法

牛顿迭代法分三步进行: 1. 瞎猜一个值p
2. 求出x=p时函数的切线,即求f(p)
3. 令p切线的零点,返回步骤2。
维基百科的图理解: 
59eb6654682d2.png (230×230)
上图中蓝线是原函数,红线是切线
上面的三个步骤可以简化为一个递推:xn+1=xnf(xn)f(xn)

用途

正常向的用途,就是老老实实求零点。
但是还有一些东西可以用牛顿迭代做,例如求am
显然很难求,所以令x=am,令f(x)=xm=a
显然f(x)=mxm1。然后就可以牛顿迭代出解了。

程序

例:求f(x)=x2+2x+1的一个零点。
求导得:f(x)=2x+2
故可以:
x=xf(x)f2(x)迭代lambda次。这里lambda取100。
#define f(x)   (x*x+2*x+1)     //原函数
#define f2(x)  (x*2+2)         //导函数
#define lambda (100)           //迭代次数

void Newton()
{
    double x=233;
    int i=0;

    for(i=0;i<lambda;i++)
        x=x-f(x)/f2(x);        //牛顿迭代法

    printf("%.8lf\n",x);
}

正确性

不会证
(能用就行?

评论

此博客中的热门博文

将博客部署到星际文件系统(IPFS)

高中地理必修一知识点总结

一场CF的台前幕后(下)