| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4234 人关注过本帖
标题:二分求根问题
只看楼主 加入收藏
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 9楼 书生牛犊
谢谢,已经解决,不过fun是什么意思
2016-10-23 00:00
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 6楼 炎天
已解决,谢谢
2016-10-23 00:00
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
PS:错解,不可采信(为便于连贯理解整篇帖子,所以我就不删了)

。。。给上完整可运行的程序,你先试试结果对不对,然后我们来讨论代码。
程序代码:
#include<stdio.h>
#include<math.h>
double fun(double x){return 2*x*x*x-4*x*x+3*x-6;}//就是C语言的一般函数。用于计算f(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;
}
1.我写的那个int fun(int x){...}是C语言的函数,如果你还没学到函数这一章,OK,我们可以麻烦一点,修改所有调用fun()的地方。
程序代码:
#include<stdio.h>
#include<math.h>
int main(){
double x1=-10,x2=10,y;
double y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
double y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
while(fabs(y1)>0.0001 && fabs(y2>0.0001)){//二分求根的关键是y的值趋近0.啥时候满足条件啥时候跳出循环,如果顺利,可能一次循环都不必做
y=2*((x1+x2)/2)*((x1+x2)/2)*((x1+x2)/2)-4*((x1+x2)/2)*((x1+x2)/2)+3*((x1+x2)/2)-6;
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-23 10:43编辑过]


φ(゜▽゜*)♪
2016-10-23 00:08
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 13楼 书生牛犊

测试了你的代码 运行结果是1.250000 并不是正确答案;

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


早知做人那么辛苦!  当初不应该下凡
2016-10-23 02:09
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
#include<stdio.h>  
#include<math.h>  
 int main()
 {  
     double x,y,s;
     double x1=-10;
     double x2=10;
     double y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
     double y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
     do
     {
         x=(x1+x2)*0.5;  //用x来保存区间中间点的x值
         y=2*x*x*x-4*x*x+3*x-6; //计算区间中间点的函数值(y)
         s=y*y1; //s为中间点的函数值与起始端函数值的乘积,若小于零函数的解在起始端与中间点之间,若不小于零函数的解在中间点与结束端之间
         if(s<0){
             x2=x; //确定新的起始端
             y2=y; //新的起始端的函数值
         }
         else{
             x1=x; //新的起始端
             y1=y;  //新的起始端的函数值
         }
         
     }
     while(fabs(x1-x2)>=0.0001); //判断精度
     printf("%lf",(x1+x2)/2); //输出中间值
     return 0;
 }

上面代码 只能求出一个解。

早知做人那么辛苦!  当初不应该下凡
2016-10-23 02:30
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 13楼 书生牛犊
抱歉,我的代码在循环时x1x2弄反了,是我自己不细心,麻烦了
2016-10-23 08:21
zheng87266
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2016-10-22
收藏
得分:0 
回复 15楼 炎天
抱歉,我的代码在循环时x1x2弄反了,是我自己不细心,麻烦了,求出一个解就行,这个题和另一个题是配套的,那个题只求一个解,这个也是
2016-10-23 08:22
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 15楼 炎天
嗯,是我错了。


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


φ(゜▽゜*)♪
2016-10-23 10:15
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:5 
回复 17楼 zheng87266
这是一个递增函数,应该只有一个解吧
2016-10-23 11:22
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
y2好像没有调用,我已经把y1y2整合成y来处理了,你这题思路让我兜了很大圈子,最后干脆自己重做一次。原谅我改的东西比较多,自己看看,但结果应该没错。
还有,求这方程需要求导判断该区间是否为单调区间才能求解。完整的程序需要判断这是否为单调区间并且判断根的个数包括判断实根的个数。
在此我已经验证过该方程只有一个实根。
下面此程序是省略判断单调区间以及根的个数的程序,希望对你有所帮助

#include<stdio.h>  
#include<math.h>  
int main()
{  
    double x1,x2,x,y;
    x1=10;
    x2=-10;
    x=(x1+x2)*0.5;
    do
    {
         y=2*x*x*x-4*x*x+3*x-6;
         if (y>=0)
         {
             x1=x;//方程的根在左侧
             x=(x2+x1)*0.5;//应用二分法
             printf("a%f %f %f\n",x1,x2,y);//变量调试用,a为执行该语句标记
         }
         if (y<=0)
         {
             x2=x;//方程的根在右侧
             x=(x1+x2)*0.5;//应用二分法
             printf("b%f %f %f\n",x1,x2,y);//变量调试用,b为执行该语句的标记
         }
    }while(fabs(x1-x2)>0.0001);
    printf("%.4f\n",x2);
    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-10-23 11:51
快速回复:二分求根问题
数据加载中...
 
   



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

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