牛顿迭代法(求函数的根)

时间:2023-01-07 20:09:18

在做二分与三分法的题时,听闻有牛顿迭代法(感觉很高大上),自己居然捧起书看了一些

由于自己水平很渣,研究的并不深入。本篇未完结......


个人感觉:

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;
}