雪中拥抱你

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、实验题目

7-2 二分法求函数的零点

  • 有函数:f(x)=x5−15x4+85x3−225x2+274x−121 已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。 提示:判断函数是否为0,使用表达式 fabs(f(x)) < 1e-7
  • 输入格式:

    输出格式:x

    该方程在区间[1.5,2.4]中的根,要求四舍五入到小数点后6位

 

二、算法描述

要确定根的位置,我们可以根据高中学习的零点定理,f(x1)*f(x2)<0,则根存在。根据此原理,我们可以通过不断地二分循环缩小两边的范围以达到小数点后六位的精度(此为判断循环结束的条件)。如果在精度范围内f(mid)大于等于0,则所寻找的x还在mid的右边,所以要令左边界left=mid,从而进一步缩小范围;如果在精度范围内f(mid)小于0,则所寻找的x还在mid的左边,所以要令右边界right=mid,同样的进行缩小范围,直到达到精度要求为止。

 

三、我的代码

#include<iostream>
#include <iomanip>
using namespace std;
double f(double x){
return x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121;
}
int main()
{
double l=1.5,r=2.4;
double mid;
while(r-l>=0.00000001){                                                          //本行的判断条件可以换成题目中的1e-7,刚开始的时候没搞懂题目条件的用处,经过询问老师之后得出这个答案
mid=(l+r)/2;
if(f(l)*f(mid)<=0) {
r=mid;
}
else l=mid;
}
cout<<setiosflags(ios::fixed)<<setprecision(6)<<l<<endl;            //用到去小数点后x位的函数
return 0;
}

 

算法复杂度o(logn)

 

四、心得体会

题目思路比较清晰,但是其中有很多小细节需要注意,比如判断条件,输出精度要求等。通过这道题加深了我对二分的分治思想的理解,对于分治法将大问题拆解成小问题来解决的思维路线有了更清晰的认识。

posted on 2021-10-08 03:54  雪中拥抱你  阅读(51)  评论(0编辑  收藏  举报