关于二分法的小程序,大虾帮帮忙。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于二分法的小程序,大虾帮帮忙。相关的知识,希望对你有一定的参考价值。
我想让用户输入一个区间比如-10~10,然后我根据这个区间中根的个数将区间划分成count个,并分别把各个区间的左右边界保存到bot[]和top[]数组中,然后用二分法对各个区间的值求解并输出。程序如下,哪儿错了
#include "math.h"
#include "stdio.h"
float polynomial(float x)
//多项式函数,用于给定多项式形式
float 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[]数组中,返回包含根的区间个数
float y1,y2;
int x1,x2;
int count=0;
x1=bot1;
x2=bot1+1;
while(x2<=top1)
y1=polynomial((float)x1);
y2=polynomial((float)x2);
while(y1*y2>0&&x2<=top1)
x2++;
y2=polynomial((float)x2);
bot[count]=x1;
top[count]=x2;
count++;
x1=x2;
x2=x1+1;
return count;
//find函数
float bin_root(int bot,int top)
//函数功能,二分法求根
float y,y1,y2;
float 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;
float 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++)
root=bin_root(bot[i],top[i]);
printf("函数在子区间[%d,%d]内的根为:%.4f\n",bot[i],top[i],root);
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);
参考技术A 没时间帮你看,发一个二分算法给你参考一下:
/********************************************************************
* @作者 :
* @功能 :二分算法
*
* @输入 :head_data:待查内存首个序号,
* array_len :待查区域长度
* data_len:待查区域中一个单元数据大小,
* match_data:需要查询的匹配数据
*
*@输出 :(void*) 输出找到数据的位置,如果为0则表示
* 没有匹配到数据
********************************************************************/
void* my_dichotomy_algorithm( Bsize_t *head_data, Bsize_t array_len,
Bsize_t data_len, Bsize_t match_data )
Bsize_t *cur_pos ;
Bsize_t sum_len = array_len;
while ( 1 )
cur_pos = ( Bsize_t* )(( Bsize_t* )head_data + ( array_len / 2 ) * data_len ) ;
if ( *cur_pos == match_data )
return ( void* )cur_pos;
if (( !array_len ) || !( array_len / 2 ) )
break;
if (( *cur_pos < match_data ) )
head_data = cur_pos;
array_len = sum_len - array_len / 2;
sum_len = array_len;
else
array_len = array_len / 2;
sum_len = array_len;
return 0;
参考技术B 有难度,建议找专业网站~~顶下~顺便,收分呵呵
jquery easyui datagrid 的分页,为啥总是显示所有的数据啊,哪位大虾帮忙看看啊,下面是代码
$('#test').datagrid(
title: 'My DataGrid',
iconCls: 'icon-save',
width: 700,
height: 350,
nowrap: false,
url: "Ajax_Access",
striped: true,
collapsible: false,
singleSelect: true,
pagination: true, //分页控件
loadMsg: '正在加载数据...',
sortName: 'id',
sortOrder: 'desc',
remoteSort: false,
idField: 'id',
frozenColumns: [[
pageSize: 20,
pageList: [10, 20, 30, 40, 50],
后台需要返回total:的值
以上是关于关于二分法的小程序,大虾帮帮忙。的主要内容,如果未能解决你的问题,请参考以下文章
C/C++/C#请人帮忙测试读串口的小程序,C#/wpf做的windows桌面小程序