| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4268 人关注过本帖
标题:二分求根问题
只看楼主 加入收藏
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:23 
二分求根问题
#include<stdio.h>  
#include<math.h>  
int main()
{  
    double x1,x2,x,y1,y2,y;
    x1=10;
    x2=-10;
    y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
    y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
    do
    {
        x=(x1+x2)*0.5;
        y=2*x*x*x-4*x*x+3*x-6;
        if(y>=0)
            x2=x,
            x1=x1;
        if(y<0)
            x1=x,x2=x2;
    }
    while(fabs(x1-x2)<=0.0001);
    printf("%f",x2);
    return 0;
}
这样输出之后结果是-10,求大神指点,我想知道的是我为什么错,只要纠正就好,谢谢各位大神
搜索更多相关主题的帖子: include double return 
2016-10-22 23:12
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
你有没有演算过你的代码,我算了下 经过一轮循环后,循环就会跳出.
x=0
y=-6
y<0
fabs(x1-x2)=10
输出x2

[此贴子已经被作者于2016-10-22 23:23编辑过]


早知做人那么辛苦!  当初不应该下凡
2016-10-22 23:22
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 2楼 炎天
它不应该是x=0,y=-6,y<0,x1=x=0,x2=x2=10,x2-x1=10>0.0001然后接着循环吗?我把while后的“<”改为“>”也不对,求指点
2016-10-22 23:26
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 3楼 zheng87266
x2=x2=-10
你的代码 编译运行可以的
不过当你输入的是相反数时会出错 ,输入的是不同的数是可以运算出正确结果的
所以稍微改了一下你的代码 当输入的是相反数是直接输出0
#include<stdio.h>  
#include<math.h>  
int main()
{  
     double x1,x2,x,y1,y2,y;
     x1=-4;
     x2=4;
     y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
     y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
     
     if(x1==(-1)*x2)
     {
         printf("%d",0);
     }
     
     else
     {
       do
       {   
          x=(x1+x2)*0.5;
          y=2*x*x*x-4*x*x+3*x-6;
          if(y>=0)
             x2=x;
             x1=x1;
          if(y<0)
             x1=x,x2=x2;
        } while(fabs(x1-x2)<=0.0001);
     
        printf("%f",x2);
     }
     
    return 0;
}

早知做人那么辛苦!  当初不应该下凡
2016-10-22 23:33
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 3楼 zheng87266
可这样我还是不知道我错在哪啊,而且按您的代码输出结果为何是0
2016-10-22 23:37
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 5楼 zheng87266
不好意思,一开始不知道什么是二分法求根,抱歉 所以4楼的回复你别看了,

早知做人那么辛苦!  当初不应该下凡
2016-10-22 23:39
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 6楼 炎天
奥,麻烦了
2016-10-22 23:40
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
在论坛上本来就是互相帮助的嘛,没帮你解决问题 我都还不好意思了

[此贴子已经被作者于2016-10-22 23:50编辑过]


早知做人那么辛苦!  当初不应该下凡
2016-10-22 23:43
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:5 

 do{...              //做...
   } while(fabs(x1-x2)<=0.0001);//当()满足条件时回跳继续
所以我想说你的这个while循环判断条件错了。
应该是 do{...}while(fabs(x1-x2)>0.0001);

另外,你计算的y1,y2为什么后面都没用呢?

你的错,错在了逻辑上。给你我的想法,看看能否理解
程序代码:
double fun(double x){...//函数实体}
int main(){
double x1=-10,x2=10,y;
double y1=fun(x1);
double y2=fun(x2);
while(fabs(y1)>0.0001 && fabs(y2>0.0001)){//二分求根的关键是y的值趋近0.啥时候满足条件啥时候跳出循环,如果顺利,可能一次循环都不必做
y=fun((x1+x2)/2);
if(fabs(y1)>fabs(y2)){x1=(x1+x2)/2;y1=y;}else{x2=(x1+x2)/2;y2=y;}
};
if(fabs(y1)<=0.0001)printf("%f",x1);else printf("%f",x2);
return 0;
}






[此贴子已经被作者于2016-10-22 23:53编辑过]


φ(゜▽゜*)♪
2016-10-22 23:51
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 9楼 书生牛犊
把小于号改为大于号也不对,而且之后不需要y1y2吧,这俩应该可以删,fun是什么意思?
2016-10-22 23:55
快速回复:二分求根问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037927 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved