实验报告 方程求根——二分法
班级: 学号: 姓名: 百事尢可乐
一、目的和要求
1)通过对二分法的编程练习,掌握方程求根的二分法的算法;
2)通过对二分法的上机运算,进一步体会二分法的特点。
二、实习内容
1)二分法的编程实现。
2)进行有根区间和误差限的比较和讨论。
三、算法
流程图:
1)准备:计算f(x)在有根区间[a, b]端点处的值 f(a), f(b)。
2)二分:计算f(x)在区间中点c=
3)判断 a b 处的函数值f(c)。 2
•若f(c)与f(a)异号,则根位于区间[a, c]内,以c 代替b ;
•若f(c)与f(a)同号,则根位于区间[c, b]内,以c 代替a ;
四、实验步骤
1)完成二分法的程序设计及录入;
2)完成程序的编译和链接,并进行修改;
3)用书上的例子对程序进行验证,并进行修改;
4)对比估算次数与实际二分次数;
5)输入不同的区间初值a, b,查看二分次数的变化;
6)输入不同的误差限,查看二分次数的变化;
7)完成实验报告。
五、实验结果
1. 经编译、链接及例子验证结果正确的源程序:
#include
#include
#define delta 1e-6
int main(void)
{
int i=0;
float a,b,c,fa,fb,fc,fab,ESP;
printf("输入ESP:");
scanf("%f",&ESP);
printf("输入a,b :");
scanf("%f,%f", &a, &b);
fa=a*a*a+a*a-3*a-3;
fb=b*b*b+b*b-3*b-3;
fab=(fa)*(fb);
if(fab>0)
printf("无根");
else
{
while(1)
{
c=(a+b)/2.0;i++;
fc=c*c*c+c*c-3*c-3;
if((fa)*(fc)
{
b = c;
fb = fc;
}
else
{
a = c;
fa = fc;
}
if(fabs(fc)
{
printf("最后答案%f\n",c);break;
}
}
printf("二分次数%d\n",i);
}
return(0);
}
2. 实例验证结果:
1)方程:f(x)=x3+x2-3x-3=0
2)输入初始参数:a=1, b=2, EPS=5e-6
3)结果输出:
最后答案1.732052
二分次数18
3. 改变a, b的值为:a=0, b=2, EPS不变,仍为5e-6,其结果为:
最后答案1.732052
二分次数19
4. 改变EPS 的值为:EPS=5e-4, a, b不变,仍为a=1, b=2,其结果为:
最后答案1.731934
二分次数11
六、分析和讨论
1. 估算次数与实际二分次数的分析和讨论
当输入a1,b=2,esp=5e-6时,估计二分7次即可到达精度,实际二分18次。
2. 输入不同的区间初值a, b,二分次数的变化情况
当a ,b 的值相差越大,二分次数越大。
3. 输入不同的误差限EPS ,二分次数的变化情况
ESP 越小,所需的二分次数越多。
七、心得
①调试过程中遇到的问题和解决对策;②经验体会等。
在编写代码过程中大小关系混淆,导致二分向反方向进行,得出错误结果,经逐步排查,解决问题。同时对二分法也有了更深的了解。
实验报告 方程求根——二分法
班级: 学号: 姓名: 百事尢可乐
一、目的和要求
1)通过对二分法的编程练习,掌握方程求根的二分法的算法;
2)通过对二分法的上机运算,进一步体会二分法的特点。
二、实习内容
1)二分法的编程实现。
2)进行有根区间和误差限的比较和讨论。
三、算法
流程图:
1)准备:计算f(x)在有根区间[a, b]端点处的值 f(a), f(b)。
2)二分:计算f(x)在区间中点c=
3)判断 a b 处的函数值f(c)。 2
•若f(c)与f(a)异号,则根位于区间[a, c]内,以c 代替b ;
•若f(c)与f(a)同号,则根位于区间[c, b]内,以c 代替a ;
四、实验步骤
1)完成二分法的程序设计及录入;
2)完成程序的编译和链接,并进行修改;
3)用书上的例子对程序进行验证,并进行修改;
4)对比估算次数与实际二分次数;
5)输入不同的区间初值a, b,查看二分次数的变化;
6)输入不同的误差限,查看二分次数的变化;
7)完成实验报告。
五、实验结果
1. 经编译、链接及例子验证结果正确的源程序:
#include
#include
#define delta 1e-6
int main(void)
{
int i=0;
float a,b,c,fa,fb,fc,fab,ESP;
printf("输入ESP:");
scanf("%f",&ESP);
printf("输入a,b :");
scanf("%f,%f", &a, &b);
fa=a*a*a+a*a-3*a-3;
fb=b*b*b+b*b-3*b-3;
fab=(fa)*(fb);
if(fab>0)
printf("无根");
else
{
while(1)
{
c=(a+b)/2.0;i++;
fc=c*c*c+c*c-3*c-3;
if((fa)*(fc)
{
b = c;
fb = fc;
}
else
{
a = c;
fa = fc;
}
if(fabs(fc)
{
printf("最后答案%f\n",c);break;
}
}
printf("二分次数%d\n",i);
}
return(0);
}
2. 实例验证结果:
1)方程:f(x)=x3+x2-3x-3=0
2)输入初始参数:a=1, b=2, EPS=5e-6
3)结果输出:
最后答案1.732052
二分次数18
3. 改变a, b的值为:a=0, b=2, EPS不变,仍为5e-6,其结果为:
最后答案1.732052
二分次数19
4. 改变EPS 的值为:EPS=5e-4, a, b不变,仍为a=1, b=2,其结果为:
最后答案1.731934
二分次数11
六、分析和讨论
1. 估算次数与实际二分次数的分析和讨论
当输入a1,b=2,esp=5e-6时,估计二分7次即可到达精度,实际二分18次。
2. 输入不同的区间初值a, b,二分次数的变化情况
当a ,b 的值相差越大,二分次数越大。
3. 输入不同的误差限EPS ,二分次数的变化情况
ESP 越小,所需的二分次数越多。
七、心得
①调试过程中遇到的问题和解决对策;②经验体会等。
在编写代码过程中大小关系混淆,导致二分向反方向进行,得出错误结果,经逐步排查,解决问题。同时对二分法也有了更深的了解。