第二章上机实践报告

实践题目名称:二分法求函数的零点

 

问题描述:

题意:有函数: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

输入格式:无

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

 

算法描述:

本题的解决方法可采用二分法,已知 f(1.5)>0, f(2.4)<0, 且函数在此区间有且只有一个零点,则我们可以用二分法不断切割mid的位置从而逐渐减小零点所在的区间范围,在保证右区间大于左区间的前提条件下,直到右区间与左区间的范围小到小于1e-7时,便可输出此值,即为函数零点的位置。

本题采用的分治法,将一开始定义的left取1.5,right取2.4,取mid=(1.5+2.4)/2,然后代入函数f(mid),判定f(mid)大于或小于0,则出现两种可能:

(1)f(mid)>0,则零点的位置在mid的右边,那么mid左边的区间便可删掉不管,只需继续判定mid右边的区间。那么下一步,便是把左区间left值改为mid,即可继续在新的区间里寻找mid继续判定。

(2)f(mid)<0,则零点的位置在mid的左边,那么mid右边的区间便可删掉不管,只需继续判定mid左边的区间。那么下一步,便是把左右区间right值改为mid,即可继续在新的区间里寻找mid继续判定。

采取分治法的好处是让算法的效率提高,如果只是单纯的使用从小到大的顺序依次寻找零点位置,是非常复杂的。注意题目并不是一个确切的数列,1.5到2.4可以分解成无数的数,这样很难找到一个精确到六位小数的数作为零点,计算量太大,而二分法的策略可以避免这种低效率的问题发生,我们只需将一个问题分解成若干个小问题,并解决出小问题,本题最后甚至无需合并子问题,只需不断分解问题直到解决为止即可。

 

算法时间复杂度分析:O(logn),本题给出一个范围,只需进行二分问题求解即可,最多logn次解决问题,其他诸如取中点、f值操作均为O(1),故时间复杂度为O(logn)。

算法空间复杂度分析:O(1),本提并没有进行多余的占用空间操作。

 

心得体会:

对于本次实验的题目,基本上都是可以靠二分法简单高效的解决。而二分法也是我们解决问题的一个很好的思路与想法,在学习二分法后,我们可以运用它,将问题分解简化,并将分解后的子问题求出并合并即可。每个问题可能都会存在一个切入点,我们只需在这个点上切入分解,简化并解决,便可避免傻乎乎停留在思考如何解决大问题的层面上,从而有效的解决原来的问题。

 

分治法的个人体会和思考:

1.分治法一般在有序序列的问题上可以更好发挥它的作用,在有序的序列里分解出无数的小序列求解,本题1.5~2.4也可以看成是一个包含无穷多个数的有序序列;而在无序的序列里,分治法往往较难得到一个良好的解决思路。

2.分而治之的方法一般还是运用在数据较为庞大的问题上,这样可以高效的解决一些大问题。

posted @ 2021-10-05 13:55  zbjzbj  阅读(68)  评论(0编辑  收藏  举报