- 论坛徽章:
- 0
|
http://zhidao.baidu.com/link?url ... -db2hQjs3yVKVrG2-V_
二分法求-10 到 10 全部的根。这个算法,和书上最简单的算法(http://baike.baidu.com/link?url= ... UJPbwZHfvB2cV89HakH)不一样。百思不得其解。求指导。- #include <math.h>
- void FindRoot(void)
- {
- double dbLeftX = -10.0;
- double dbRightX = 10.0;
- double dbResultY = 0.0;
- double dbTmp = 0.0;
- double dbMidleX =0.0;
- //当二分点Y的值不为0不是根(即,二分点X不满足方程)
- //当区间无限小时完成计算(下面的语句表示当区间不是无限小时继续计算)
- while ( abs(dbRightX-dbLeftX) > 0.1e-6 )
- {
- //二分区间
- dbMidleX = ( dbLeftX + dbRightX ) / 2.0;
- //算二分点Y的值
- dbResultY = 2 * pow(dbMidleX,3) - 4 * pow(dbMidleX,2) + 3 * dbMidleX - 6;
- //如果计算的Y值为0时,找到一个根
- if ( abs(dbResultY) < 0.1e-6 )
- {
- printf("Finde a root in [-10,10] , value = [%lf].\n",dbMidleX);
- }
- //判断方程的根落于刚才二分区间的哪个区间,并生成新的区间.
- if ( dbResultY < 0.0 )
- {
- dbTmp = 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6;
- if ( dbTmp < 0.0 )
- {
- dbLeftX = dbMidleX;
- }
- else
- {
- dbRightX = dbMidleX;
- }
- }
- else
- {
- dbTmp = 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6;
- if ( dbTmp > 0.0 )
- {
- dbLeftX = dbMidleX;
- }
- else
- {
- dbRightX = dbMidleX;
- }
- }
- }
- //区间无限小,如果区间两端计算的Y值一个为正一个为负则区间中点也是一个根
- if( 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6 < 0 &&
- 2 * pow(dbRightX,3) - 4 * pow(dbRightX,2) + 3 * dbRightX - 6 >0 )
- {
- printf("Finde a root in [-10,10] , value = [%lf].\n",dbMidleX);
- }
- }
复制代码 特别是生成新区间的方法和最后的那个if。
这个方法为什么能找出所有的根,和最简单的二分法有什么不一样。。
求指导。谢谢先了 |
|