算法第二章上机实践报告

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

问题描述:有函数f(x)=x5−15x4+85x3−225x2+274x−121 已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。

输出格式:

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

代码

#include <iostream>
#include <math.h>
using namespace std;
double v(double x){
	return pow(x,5)-15*pow(x,4)+85*pow(x,3)-225*x*x+274*x-121;
}
int main(){
	double left=1.5,right=2.4;
	while(right-left>=1e-8){
		double mid=(left+right)/2;
		if(v(mid)*v(left)<=0){
			right=mid;
		}
		else{
			left=mid;
		}
	}
	printf("%.6f\n",left);
	return 0;
}

算法描述

利用二分法的思想,把left和right作为两个端点,并求出mid值;利用零点存在定理(左端点*右端点 < 0 即存在零点)分为两种情况;

  • mid * left < 0 即端点在mid和left的区间之内,于是把mid赋给right 即可
  • mid * left > 0 即端点在mid和fight的区间之内,于是把mid赋给left 即可

以此循环上述步骤,判断条件为left-right < 1e-8(区间范围)即可;

算法时间及空间复杂度分析

时间复杂度分析:利用主定理,对于规模为n的问题,将其变成一个规模为n/2的子问题;f(n) = O(1);因此T(n) = O(logn);

空间复杂度分析:问题只用了最初设置的三个变量空间 left right mid 因此该问题的空间复杂度为O(1);

心得体会

本次实验课程加深了我对分治法的运用,让我充分了解到如何去分析问题,分解问题来使问题简单化,并且分析完问题后可思考并结合已有算法进行处理会使得解题过程更加轻松。

分治法的个人体会和思考

分治法将问题分解为多个更小规模的子问题,但并非分治法都能得到效果,因此,在分解完问题后应该通过主定理分析最后的时间复杂度和空间复杂度进行取舍。但分治法运用得当,也能充分彰显计算机对我们计算能力的弥补如小数点精确,寻找某一特定的值等问题规模较大时,分治法或许会给我们带来很大的帮助。

posted @ 2021-10-06 18:36  Varié  阅读(25)  评论(0编辑  收藏  举报