root.c

来自「数值分析算法描述与习题解答」· C语言 代码 · 共 36 行

C
36
字号

/*思想:二分法属于数学问题,但为了说清楚问题就再说一下原理。*/
/*先取二元方程f(x)的两个初略解x1和x2,若f(x1)与f(x2)的符号相*/
/*反,则方程f(x)=0在[x1,x2]区间至少有一个根;若f(x)在[x1,x2]*/
/*区间单调,则至少有一个实根;所以取x3=(x1+x2)/2,并在x1和x2中*/
/*舍去和f(x3)同号者,那么解就在x3和另外那个没有舍去的初略解组*/
/*成的区间里;如此反复取舍,直到xn与xn-1之差满足要求时,那么*/
/*xn便是方程f(x)的近似根。*/
    #include "stdio.h"
    #include "math.h"
    double  root(a,b,eps,f)
    double  a,b,eps,(*f)();
    { double  f0,f1,c;
      f0=(*f)(a);
      while (fabs(a-b)>=eps)
        { c=(a+b)/2; f1=(*f)(c);
          if (f1==0)  return(c);/*x就是根,不在迭代*/
          if (f0*f1>0)  a=c;/*覆盖a,即舍去同号者*/
          else  b=c;
        }
      c=(a+b)/2;
      return(c);
    }
main()
    { double a,b,eps,f();
      a=1; b=2; eps=0.000001;
      printf("x=%7.3f\n",root(a,b,eps,f));
    }

    double  f(x)
    double x;
    { double y;
      y=x+log(x)-2.2;
      return(y);
    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?