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

关于二分法的小程序,大虾帮帮忙。,第1张

两个错误。

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=0i<counti++)

{

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)

}

}

}

设计类,就是说不用写代码咯。声明个类,静态方法solve接受三个浮点数参数作为方程的3个系数,然后求根公式算一下,返回个数组,若数组为空,表示无解~

// 因为是double,精度上还是会有问题的。。

public static double[] solveEquation(double a, double b, double c)

{

double delta = b * b - 4 * a * c

if (delta <0) {

return new double[0]

} else if (delta == 0) {

double[] solution = new double[1]

solution[0] = -b / 2 / a

return solution

} else {

double sqrtDelta = System.Math.Sqrt(delta)

double[] solutions = new double[2]

double a2 = a * 2

solutions[0] = (-b - sqrtDelta) / a2

solutions[1] = (-b + sqrtDelta) / a2

return solutions

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11179147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存