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

时间:2023-01-07 20:14:11

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

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


个人感觉:

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