| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2178 人关注过本帖
标题:用二分法求根:陷入了死循环(已解决)
只看楼主 加入收藏
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
结帖率:83.33%
收藏
 问题点数:0 回复次数:7 
用二分法求根:陷入了死循环(已解决)
用二分法求根:陷入了死循环
#include<iostream>
using namespace std;
int main()
{
    double fabs(double  ,double);
    double f(double );
       double x2,x1,x;
    do{
             cout<<"请输入x1和x2的值:";
            cin>>x1>>x2;
            cout<<"x1="<<x1<<"  x2="<<x2;
    }while(f(x1)*f(x2)>0);

    do{
        x=(x1+x2)/2;
        if(f(x)*f(x1)>0) x2=x;
        else x1=x;
    }while(fabs(f(x),0)>=1e-5);

    cout<<"结果为:"<<x;
    return 0;
}

double f(double x)
{      return(((x+-5)*x+16)*x+-80);}

double fabs(double a,double b)
{    return (a-b>0?a-b:b-a);}

[[it] 本帖最后由 yqiong 于 2008-3-21 15:41 编辑 [/it]]
搜索更多相关主题的帖子: double 二分法 cout fabs 
2008-03-20 17:18
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
二分法有一个严格的限制就是要在一个单调区间上,如果你输入的数不在一个单调区间就会出现死循环,你这个题中明显有一个答案是5,所以我输入4,6就行了,其它的,自己再找

雁无留踪之意,水无取影之心
2008-03-20 18:09
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
[bo]以下是引用 [un]PcrazyC[/un] 在 2008-3-20 18:09 的发言:[/bo]

二分法有一个严格的限制就是要在一个单调区间上,如果你输入的数不在一个单调区间就会出现死循环,你这个题中明显有一个答案是5,所以我输入4,6就行了,其它的,自己再找 ...


答案是5,但我输入2 6时怎么也陷入死循环了呀?
2008-03-20 22:50
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
收藏
得分:0 
LZ,输入2,6是f(2)<0,f(6)>0,而且f((2+6)/2)<0,则f(2)*f(4) 负负得正
我改了两个while判断语句
#include<iostream>
using namespace std;
int main()
{
    double fabs(double  ,double);
    double f(double );
    double x2,x1,x;
    do{
       cout<<"请输入x1和x2的值:";
       cin>>x1>>x2;
       cout<<"x1="<<x1<<"  x2="<<x2;
    }while(f(x1)>0&&f(x2)>0);/////////////////////////////////////////

    do{
        x=(x1+x2)/2;
        if(f(x)>0&&f(x1)>0) ////////////////////////////////////
            x2=x;
        else x1=x;
    }while(fabs(f(x),0)>=1e-5);

    cout<<"结果为:"<<x<<endl;
    return 0;
}

double f(double x)
{      
    cout<<"x:"<<x<<"  ";
    cout<<"f(x)"<<(((x-5)*x+16)*x-80)<<endl;
    return(((x-5)*x+16)*x-80);
}

double fabs(double a,double b)
{    return (a>b?(a-b):(b-a));}

兵法的精要在于韬晦自己
2008-03-21 14:43
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
do{
       cout<<"请输入x1和x2的值:";
       cin>>x1>>x2;
       cout<<"x1="<<x1<<"  x2="<<x2;
    }while(f(x1)>0&&f(x2)>0)//不明白。只有当异号时才能确保在x1和x2间有一值使函数值为0呀!
    do{
        x=(x1+x2)/2;
        if(f(x)>0&&f(x1)>0)  x2=x;
        else x1=x;
    }while(fabs(f(x),0)>=1e-5);

运行时输入2 6确实能正确输出答案5,但改输入3 6又出问题了呢!
2008-03-21 15:33
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
do{
        x=(x1+x2)/2;
        if(f(x)*f(x1)>0) x1=x;     
       else x2=x;  //找到原因了,就错在这!
  }while(fabs(f(x),0)>=1e-5);
2008-03-21 15:40
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
double fabs(double  ,double);
    double f(double );
放在主函数外和 放在里面有什么区别
2008-03-21 19:55
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
没区别吧,放在里面的是旧版的。两种形式C都支持
2008-03-24 12:10
快速回复:用二分法求根:陷入了死循环(已解决)
数据加载中...
 
   



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

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