112.求解非线性方程

举报
C语言与CPP编程 发表于 2022/05/06 00:41:47 2022/05/06
【摘要】 #include "math.h"#include "stdio.h" int BinSearchRoot(a,b,h,eps,x,m) /*用二法计算非线性方程的实根*/int m;/*参数意义:a 要求的根的下界b 要求的根的上界,即:所求的根落在区间 [a,b]之内h 递进的步长eps 精度x 根的值m...

  
  1. #include "math.h"
  2. #include "stdio.h"
  3. int BinSearchRoot(a,b,h,eps,x,m) /*用二法计算非线性方程的实根*/
  4. int m;
  5. /*参数意义:
  6. a 要求的根的下界
  7. b 要求的根的上界,即:所求的根落在区间 [a,b]之内
  8. h 递进的步长
  9. eps 精度
  10. x 根的值
  11. m 预计的根的个数*/
  12. double a,b,h,eps,x[];
  13. {
  14. extern double Equation(); /*要求解的非线性方程*/
  15. int n,js;
  16. double z,y,z1,y1,z0,y0;
  17. n=0; z=a; y=Equation(z);
  18. while ((z<=b+h/2.0)&&(n!=m)) /*对给定步长的子区间进行搜索*/
  19. {
  20. if (fabs(y)<eps) /*当前的判定点是方程的根*/
  21. {
  22. n=n+1;
  23. x[n-1]=z;
  24. z=z+h/2.0;
  25. y=Equation(z);
  26. }
  27. else /*当前点不是方程的根*/
  28. {
  29. z1=z+h;
  30. y1=Equation(z1);
  31. if (fabs(y1)<eps) /*下一个点是方程的根*/
  32. {
  33. n=n+1;
  34. x[n-1]=z1;
  35. z=z1+h/2.0;
  36. y=Equation(z);
  37. }
  38. else if (y*y1>0.0) /*该区间内无根*/
  39. { y=y1; z=z1;}
  40. else /*该区间内有根*/
  41. {
  42. js=0;/*标志,0表示未找到根,1表示已经确定了根*/
  43. while (js==0)
  44. {
  45. if (fabs(z1-z)<eps) /*区间的长度小于给定的精度,可以当作已经找到了根*/
  46. {
  47. n=n+1;
  48. x[n-1]=(z1+z)/2.0; /*把区间的中位值作为根*/
  49. z=z1+h/2.0; /*把寻找的位置放到下一个区间内*/
  50. y=Equation(z);
  51. js=1; /*在当前区间内已经找到了根*/
  52. }
  53. else /*区间比给定的精度大,则进行二分*/
  54. {
  55. z0=(z1+z)/2.0; /*区间二分*/
  56. y0=Equation(z0);
  57. if (fabs(y0)<eps) /*z0位置为根*/
  58. {
  59. x[n]=z0;
  60. n=n+1;
  61. js=1;
  62. z=z0+h/2.0;
  63. y=Equation(z);
  64. }
  65. else if ((y*y0)<0.0) /*[z,z0]内有根*/
  66. { z1=z0; y1=y0;}
  67. else { z=z0; y=y0;}
  68. }
  69. }
  70. }
  71. }
  72. }
  73. return(n); /*返回根的个数*/
  74. }
  75. main()
  76. {
  77. int i,n;
  78. static int m=6;
  79. static double x[6];
  80. clrscr();
  81. puts("This is a program to solve Nonlinear function\n by Binary Divisive Procedure.");
  82. puts("\n The Nonlinear function is:");
  83. puts("\n f(x)=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0\n");
  84. n=BinSearchRoot(-2.0,5.0,0.2,0.000001,x,m);
  85. puts("\n >> Solve successfully!\n >> The results are:");
  86. printf(" >> The function has %d roots, they are:\n",n);/*输出根的个数*/
  87. for (i=0; i<=n-1; i++)
  88. printf(" >> x(%d)=%13.7e\n",i,x[i]);
  89. printf("\n Press any key to quit...\n");
  90. getch();
  91. }
  92. double Equation(x)
  93. double x;
  94. {
  95. double z;
  96. z=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0;
  97. return(z);
  98. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124576388

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。