在做二分与三分法的题时,听闻有牛顿迭代法(感觉很高大上),自己居然捧起书看了一些
由于自己水平很渣,研究的并不深入。本篇未完结......
个人感觉:
1.使用牛顿迭代法,函数可以是任意
2.优点:对其单调性无特殊要求
缺点:若在该函数值处有多个根,往往只能求出一个根
3.与二分三分法比较
二分要求是单调函数
三分要求是凸性函数
牛顿迭代对单调性无要求
如:求 y=2x^3-15x^2-36x+7,y=37时的根
c代码:
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> double f(double x) //所求函数 { return 2*pow(x,3)-15*pow(x,2)-36*x+7-37; //把等式右边移到左边(最后一个数) } double df(double x) //所求函数的一阶导数 { return 6*pow(x,2)-30*x-36; } double iterate(double x) //牛顿迭代 { return x-f(x)/df(x); } int main() { double x0=1,x; //x0是初值,可以随便赋,两个原则: 1.别选0 2.其一阶导数不为0 int k=0; while(k<1000) //控制条件1:k是最大迭代次数,防止下面出现精度无法精确导致死循环的情况(共两个控制条件) { x=iterate(x0); if(fabs(x-x0)>1e-3) //控制条件2:这个是用来控制精度的(小数点后三位) x0=x; else break; } if(k<1000) printf("根是:%.2lf\n",x); else printf("error\n"); return 0; }