第七章 分治算法-1241:二分法求函数的零点

【题目描述】
有函数:f(x)=x5−15x4+85x3−225x2+274^x−121

已知f(1.5)>0 ,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。

【输入】
(无)

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

【输入样例】
(无)

【输出样例】
(无)
————————————————
思路:这道题的分治主要体现在探求他的取值范围。
已知x=1.5时,f(x)>0,x=2.4时,f(x)<0,且方程的具体解在[1.5,2.4]的范围之间,那么这个函数在定义域[1.5,2.4]的范围内应为单调递减,所以在二分的时候,应注意:当f(x)>0时,不是将中值mid赋给右端的r,而是赋给左端的l,当f(x)<0时相反。这题就是不断地取l,r的中值,进行查找比较,当找到符合使f(x)=0的值时停止,当在一遍查找结束后应将左端加上1e-7来缩小取值范围(或在右端减去),直到找到满足条件的值或l>r时退出循环,输出。

#include<cstdio>
#include<iostream>
#include<cmath>
#define E 1e-7
using namespace std;

double fx(double x) {
	
	 return x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121;
	
}

double absf(double x){
	if(x < 0) return -x;
	return x;
}

int main(){
	
	double l = 1.5 ,r = 2.4;
	while(l + E < r)
	{
		double mid = (l + r) /2.0;
		if(fx(mid) > 0)
		l = mid;
		else
		r = mid;
	}
	if(fx(l == 0))
	 printf("%.6lf\n",l);
	else
	 printf("%.6lf\n",l);
	return 0;
}
发布了295 篇原创文章 · 获赞 2 · 访问量 6249

猜你喜欢

转载自blog.csdn.net/zqhf123/article/details/104920913