【题目描述】
有函数: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;
}