导航:首页 > 源码编译 > 二分法出现算法死循环的可能

二分法出现算法死循环的可能

发布时间:2022-09-08 21:08:07

㈠ 用二分法求方程的根 下面的程序段有问题吗

有很大问题啊。第一,除了判断fabs(f(c))>0.002,还要判断f(a)或f(b)的值是否满足要求,当然这个可以通过变通而省略的。第二,用while(fabs(f(c))>0.002),有可能出现死循环的。

㈡ 请问一下python程序代码错在哪里了,谢谢。是通过二分法求方程根的函数

代码有两个地方有问题
1:19行的return缩进有问题,19行的return不应该出现在一个非方法的地方
2:代码有可能出现死循环,在我输入a:10,b:10,c:10,d:10的时候出现死循环,请检查代码逻辑

我已经调整好了

deff(x):
s=(a*x)**3+(b*x)**2+(c*x)+d
returns

a=int(input("a"))
b=int(input("b"))
c=int(input("c"))
d=int(input("d"))

mid=0
foriinrange(-100,100,1):
x1=int(i)
x2=int(i+1)
iff(x1)*f(x2)<0:
lo,hi=x1,x2
whilehi-lo>0.01:
mid=(lo+hi)/2
iff(lo)*f(mid)<0:
hi=mid
else:
lo=mid
else:
pass

printmid

㈢ 二分法程序,哪里有错谢谢

查找的循环条件错了
for(j=1;l==s;j++)意思是当l等于s时才继续循环,明显不符合逻辑啊。
你可以搜一下标准的二分查找程序,里面一般是用
while(s<=l)或者for(;s<=l;)

㈣ C语言 二分法求方程近似解 ,运行没反应,不知哪里有问题,求指教

只有一个错误。f2 = f3;这句话,你赋值的是一个值,而不是一个表达式。需要改成f2 = (2*m*(m-2)+3)*m-6; 同理f1=f3也不对。
而且,感觉你这算法也不对。求不出来值,是不是2分法跨度太大查不到。可以用弦截法。
float f(float x)
{
float y;
y=(2*x*(x-2)+3)*x-6;
return y;
}
float xpoint(float x1,float x2)
{
float y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return y;
} 增加这样两个函数
m=xpoint(a,b);替换 二分法m=(a+b)/2。 就有结果了
对了 还有问题。
do
{
m = xpoint(a,b);
f3 = (2*m*(m-2)+3)*m-6;
if (f1*f2 < 0)
{
a =m;
f1 = (2*m*(m-2)+3)*m-6;
// cout<<f1<<endl;
}
else
{
b =m;
f2 = (2*m*(m-2)+3)*m-6;
//cout<<f2<<endl;
}
} while (fabs(f3)>=1e-5);
底下的循环,也就是赋值缩小区间的过程,你写反了。f1*f2 < 0,这时a=m。f1*f2 >0,这时b=m。

㈤ 大家看看简单的二分法,怎么死循环了

如果我没理解错的话,你fun函数中的这句话
return 1.0*pow(x,2) + 0.0*x - 5.0;
不就是x*x-5.0么,这么简单就不要再搞个函数了吧。。。。
所谓的fun(x1)*fun(x2)>0不就是说x1和x2的平方都大于5或者都小于5?
再来说你的二分,我觉得你就是要找个平方等于5的数是么?你的判断:
fun(x1)*fun(mid)<0实际上就是说x1和mid这两个数一个平方大于5另一个平方小于5(当然了,是x1小于,mid大于),这个时候你把x1赋予一个大于5的值mid,那么现在x1、x2以及后来再有的mid都大于5了,你的fun函数怎么可能收敛?
另外一种情况(两个数都大于或者都小于),你把x2置为mid,那么现在x1和x2或者都大于5或者都小于5,于是还是不收敛。

㈥ 关于二分法的小程序,大虾帮帮忙。

两个错误。
1、你把精确度设为1e-6。注意,float的有效数字只有6位,所以算到小数点后6位时,x1,x2,x的值很有可能就一样了,那么x,x1,x2的值将不将变化,而且肯定会大于1e-6,导致死循环。
解决方法是把所有数据改成double型。
2、仔细分析一下你的find函数吧,它求得的最后一个根区间有很大可能并不包含一个有效根。
比如我输入-10 10,那么,第一个根区间会是-10,-2,那么第2个区间就成了-2,11,第2个区间并不包含根。
解决方法是在调用bin_root前,判断一下polynomial(bot[i])*polynomial(top[i])<0

另外,你的find函数在生成最后一个根区间时,会出现x2比top1大1的情况。你自己改改吧。

我的代码如下:
#include "math.h"
#include "stdio.h"
double polynomial(double x)
{//多项式函数,用于给定多项式形式
double y;
y=((3*x+6)*x-1)*x+2;
return y;
}//polynomial函数

int find(int *bot,int *top,int bot1,int top1)
{//根据多项式函数fun自动搜索求根区间,并把各个区间的上限和下限分别保存到top[]和bot[]数组中,返回包含根的区间个数
double y1,y2;
int x1,x2;
int count=0;
x1=bot1;
x2=bot1+1;
while(x2<=top1)
{
y1=polynomial((double)x1);
y2=polynomial((double)x2);
while(y1*y2>0&&x2<=top1)
{
x2++;
y2=polynomial((double)x2);
}
bot[count]=x1;
top[count]=x2;
count++;
x1=x2;
x2=x1+1;
}
return count;

}//find函数

double bin_root(int bot,int top)
{//函数功能,二分法求根
double y,y1,y2;
double x1=bot,x2=top,x;
x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);
while(fabs(y)>=1e-6)
{
if(y*y1<0)
{
x2=x;
}
else
{
x1=x;
}
x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);
}
return x;
}//二分法求根bin_root函数

void main()
{
int count,bot[10],top[10];
int bot1,top1;//由用户输入求根区间,程序自动找到该区间中存在的根的个数
int i;
double root;
printf("请输入求根区间:\n");
scanf("%d%d",&bot1,&top1);
count=find(bot,top,bot1,top1);
if(count==0)printf("函数在您输入的区间内无根:\n");
for(i=0;i<count;i++)
{
if(polynomial(bot[i])*polynomial(top[i])<0)
{
root=bin_root(bot[i],top[i]);
printf("函数在子区间[%d,%d]内的根为:%.4f\n",bot[i],top[i],root);
}
}
}

㈦ C语言编程,二分法求解函数,陷入死循环。请大神帮忙看看错在哪里

你的r是多少?
那些常量是多少?

Mae=d_a;
d_b=(d_a+d_b)/2;
d_difference=d_c;
printf("d_b=%f\n",d_b);
这段代码只被执行了一次

㈧ 二分法查找数组中的数,这是什么原因

你问题在于。mid要重置啊,当你的start和end变化之后要重置。要不然每一次运行之后会重复上一次的动作。比如mid=5,key<a[5],不改变mid的话就每一次都执行end=5-1=4,这样就死循环了。
解决办法:
在while中加入:mid=(start+end)/2

㈨ 二分法陷入死循环~

修改如下,不要在C程序中使用C++的元素,否则在ACM等测试系统上无法编译!

//---------------------------------------------------------------------------
#include<stdio.h>

int s[1000002];
int main()
{
int n,m,i,j,x,y,z,mid;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&s[i]);}

scanf("%d",&m);
for(j=1;j<=m;j++){
scanf("%d",&z);
x=0;y=n-1;
while(x<=y){
mid=(x+y)/2;
if(s[mid]>z)
y=mid-1;
else if(s[mid]<z)
x=mid+1;
else if(s[mid]==z){
printf("yes\n");
break;
}
else
printf("no\n");
}

}}
return 0;
}

//---------------------------------------------------------------------------

阅读全文

与二分法出现算法死循环的可能相关的资料

热点内容
卡尔曼滤波算法书籍 浏览:768
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:843
安卓怎么下载60秒生存 浏览:802
外向式文件夹 浏览:235
dospdf 浏览:430
怎么修改腾讯云服务器ip 浏览:387
pdftoeps 浏览:493
为什么鸿蒙那么像安卓 浏览:735
安卓手机怎么拍自媒体视频 浏览:185
单片机各个中断的初始化 浏览:723
python怎么集合元素 浏览:480
python逐条解读 浏览:832
基于单片机的湿度控制 浏览:498
ios如何使用安卓的帐号 浏览:882
程序员公园采访 浏览:811
程序员实战教程要多长时间 浏览:974
企业数据加密技巧 浏览:134
租云服务器开发 浏览:813
程序员告白妈妈不同意 浏览:335
攻城掠地怎么查看服务器 浏览:600