数值作业:二分法求方程的根之C语言实现代码

骑猪看日落 2022-06-17 08:12 328阅读 0赞

二分法是求方程近似解的一种简单直观的方法,设函数f(x)在[a,b]上连续,且f(a)*f(b)<0,则表明f(x)在[a,b]上至少有一个零点,这是微积分中的介值定理(不得不吐槽一下大学微分方程老师讲课跟个煞笔一样,反正我是重来没听的).然后通过二分区间,缩小区间范围,当小到一定的精确度的时候,这个x就是我们所求的近似根了.
个人对算法的分析:1首先输入我们的函数f(x),这里定义为一元三次方程;2,输入求根区间[a,b]和误差控制量eps(在C语言中1e-10代表1*10的负10次方),用到了fabs()求绝对值的数学库函数.输入步骤完毕.3,判断f(a)*f(b)<0是否为真.为真代表有零点,就可以用二分法不断地缩小空间,得出近似解x了.没有零点就尴尬了,二分法只能计算方程的实根,这里也可以看出二分法的局限性.
下面给出一个题目:用二分法求f(x)=x*x*x-7.7*x*x+19.2*x-15.3在区间[1,2]之间的根.
下面给出自己写的代码,如下:

  1. /********************************************
  2. > File Name: Binary.c
  3. > Author:chendiyang
  4. > School:WUST_CST_1501班
  5. > Myblog:www.chendsir.com
  6. > Mail:1441353519@qq.com
  7. > Created Time: 2017年04月18日 星期二 23时55分13秒
  8. **************************************************/
  9. #include <stdio.h>
  10. #include <math.h>
  11. const double eps = 1e-6; //定义我们计算的精度
  12. double a,b,c,d; //假定我们输入的函数是一元三次方程组,a*x*x*x+b*x*x+c*x+d=0
  13. double f(double x) //定义我们的函数
  14. {
  15. return a*x*x*x+b*x*x+c*x+d;
  16. }
  17. int main()
  18. {
  19. double m,n;//求根区间[m,n]
  20. double i,j,sum;
  21. printf("请输入一元三次方程组的系数:a,b,c,d:");
  22. scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  23. printf("\n请输入求根区间[m,n]:");
  24. scanf("%lf%lf",&m,&n);
  25. if(f(m)*f(n)<0)
  26. {
  27. while(fabs(m-n)>eps)
  28. {
  29. i=(m+n)/2.0;
  30. sum=f(i);
  31. printf("[%lf %lf]\n",m,n);
  32. if(fabs(sum)<eps)
  33. {
  34. break;
  35. //printf("\n该方程组的近似根为:x2*=%lf\n",i);
  36. //return 1;
  37. }
  38. else if(f(i)*f(m)<0)
  39. {
  40. n=i; //修正区间,将[m,n]换成[m,i],这里的i是中点
  41. }
  42. else if(f(i)*f(n)<0)
  43. {
  44. m=i;//修正区间,将[m,n]换成[i,n],这里的i是中点
  45. }
  46. }
  47. }
  48. else ; //如有其他求根方法,可以加上
  49. printf("%lf %lf",m,n);
  50. j=(m+n)/2;
  51. printf("\n该方程组的近似根为:x*=%lf\n",j);
  52. }

   这道题目就是不停的缩小区间,从而得出近似解,
   运算结果然而二分法最坑的地方不是它只能计算实根这个问题,最坑的是它当函数f(x)存在几个零点实,它只能计算出一个零点!!这个针对有些算法题目就不好办了.牛顿迭代法和弦切法可以解决它的不足,当然也有它们的局限,every coin has two sides,事物都有两面性,算法也不例外...

发表评论

表情:
评论列表 (有 0 条评论,328人围观)

还没有评论,来说两句吧...

相关阅读

    相关 二分法方程

    二分法的原理其实还是零点定理的应用。 首先必须要有一个初试区间,而且区间端点的函数值异号,由零点定理可以知道在次区间内至少存在一个零点。然后取区间的中间值,这样就把一个区间

    相关 二分法问题

    一类问题:定义在\[L,R\]上的单调函数f(x),求方程f(x)=0的根。 1).计算√2的近似值 注意:由于根号√2是无理数,因此只能获得它的近似值,不妨精