牛顿迭代法
牛顿迭代法用于求函数的零点。
问题
考虑求一个函数的一个零点。
如果函数是一次函数 ,则显然有零点 。
如果函数是一次函数
如果函数是二次函数呢?好像也不难,用求根公式即可。
现在问题来了:人类已经证明,五次以上的方程没有求根公式。如果拿到的方程极为奇怪,又该如何处理?
牛顿迭代法提出了解决方案。
方法
牛顿迭代法分三步进行: 1. 瞎猜一个值
2. 求出 时函数的切线,即求
3. 令 为切线的零点,返回步骤2。
2. 求出
3. 令
以维基百科的图理解:
上图中蓝线是原函数,红线是切线。
上面的三个步骤可以简化为一个递推:
用途
正常向的用途,就是老老实实求零点。
但是还有一些东西可以用牛顿迭代做,例如求 。
显然很难求,所以令 ,令 。
显然很难求,所以令
显然 。然后就可以牛顿迭代出解了。
程序
例:求 的一个零点。
求导得: 。
故可以:
迭代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); }
正确性
不会证
(能用就行?
评论
发表评论