免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1835 | 回复: 4
打印 上一主题 下一主题

[算法] 二分法求一个区间全部的根。没看懂求指教。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-31 22:02 |只看该作者 |倒序浏览
http://zhidao.baidu.com/link?url ... -db2hQjs3yVKVrG2-V_

二分法求-10 到 10 全部的根。这个算法,和书上最简单的算法(http://baike.baidu.com/link?url= ... UJPbwZHfvB2cV89HakH)不一样。百思不得其解。求指导。
  1. #include <math.h>

  2. void FindRoot(void)
  3. {
  4. double dbLeftX = -10.0;
  5. double dbRightX = 10.0;
  6. double dbResultY = 0.0;
  7. double dbTmp = 0.0;
  8. double dbMidleX =0.0;

  9. //当二分点Y的值不为0不是根(即,二分点X不满足方程)
  10. //当区间无限小时完成计算(下面的语句表示当区间不是无限小时继续计算)
  11. while ( abs(dbRightX-dbLeftX) > 0.1e-6 )
  12. {
  13. //二分区间
  14. dbMidleX = ( dbLeftX + dbRightX ) / 2.0;
  15. //算二分点Y的值
  16. dbResultY = 2 * pow(dbMidleX,3) - 4 * pow(dbMidleX,2) + 3 * dbMidleX - 6;

  17. //如果计算的Y值为0时,找到一个根
  18. if ( abs(dbResultY) < 0.1e-6 )
  19. {
  20. printf("Finde a root in [-10,10] , value = [%lf].\n",dbMidleX);
  21. }

  22. //判断方程的根落于刚才二分区间的哪个区间,并生成新的区间.
  23. if ( dbResultY < 0.0 )
  24. {
  25. dbTmp = 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6;
  26. if ( dbTmp < 0.0 )
  27. {
  28. dbLeftX = dbMidleX;
  29. }
  30. else
  31. {
  32. dbRightX = dbMidleX;
  33. }
  34. }
  35. else
  36. {
  37. dbTmp = 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6;
  38. if ( dbTmp > 0.0 )
  39. {
  40. dbLeftX = dbMidleX;
  41. }
  42. else
  43. {
  44. dbRightX = dbMidleX;
  45. }
  46. }
  47. }

  48. //区间无限小,如果区间两端计算的Y值一个为正一个为负则区间中点也是一个根
  49. if( 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6 < 0 &&
  50. 2 * pow(dbRightX,3) - 4 * pow(dbRightX,2) + 3 * dbRightX - 6 >0 )
  51. {
  52. printf("Finde a root in [-10,10] , value = [%lf].\n",dbMidleX);
  53. }
  54. }
复制代码
特别是生成新区间的方法和最后的那个if。
这个方法为什么能找出所有的根,和最简单的二分法有什么不一样。。
求指导。谢谢先了

论坛徽章:
0
2 [报告]
发表于 2014-04-02 15:04 |只看该作者
没人理我啊,自己顶一下。

论坛徽章:
0
3 [报告]
发表于 2014-04-03 14:25 |只看该作者
看懂了,这个算法貌似是错误的。

论坛徽章:
2
申猴
日期:2014-04-17 14:37:17CU十四周年纪念徽章
日期:2018-06-23 16:03:03
4 [报告]
发表于 2014-04-03 14:26 |只看该作者
用2分之前你要知道函数的大致图像 y=x^3 的图像 和 你说的函数图像类似。
看我这个图就应该明白了吧。
a,b 中间值 m 根据f(m)的值调整新区间
f(m) 与 f(a) 同号:新区间 b,m
f(m) 与 f(b) 同号:新区间 a,m
上面函数和普通2分没有任何区别

1FH9hYIj.jpg (15.44 KB, 下载次数: 31)

1FH9hYIj.jpg

论坛徽章:
0
5 [报告]
发表于 2014-04-04 10:13 |只看该作者
回复 4# tklist


    谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP