1241:二分法求函数的零点
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3263 通过数: 1974
【题目描述】
有函数:f(x)=x5−15x4+85x3−225x2+274x−121f(x)=x5−15x4+85x3−225x2+274x−121
已知f(1.5)>0,f(2.4)<0f(1.5)>0,f(2.4)<0 且方程f(x)=0f(x)=0 在区间[1.5,2.41.5,2.4] 有且只有一个根,请用二分法求出该根。
【输入】
(无)
【输出】
该方程在区间[1.5,2.41.5,2.4]中的根。要求四舍五入到小数点后66位。
源代码
#include<iostream> #include<cstdio> #include<algorithm> #include<math.h> 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(void) { double i=1.5; double j=2.4; double xx; while(i+0.000001<j) { xx=(i+j)/2.0; if(f(xx)>0) { i=xx; } if(f(xx)<0) { j=xx; } if(f(xx)==0) { printf("%.6lf",xx); return 0; } } if(f(i)==0) { printf("%.6lf",i); return 0; } else { printf("%.6lf",j); return 0; } }
这道题的分治主要体现在探求他的取值范围。
已知x=1.5时,f(x)>0,x=2.4时,f(x)<0,且方程的具体解在[1.5,2.4]的范围之间,那么这个函数在定义域[1.5,2.4]的范围内应为单调递减,所以在二分的时候,
应注意:当f(x)>0时,不是将中值mid赋给右端的j,而是赋给左端的i,(在这里WA了好几次,QWQ),当f(x)<0时相反。
这道题就是不断地取i,j的中值,进行查找比较,当找到符合使f(x)=0的值时停止,当在一遍查找结束后应将左端加上1e-6来缩小取值范围(或在右端减去),直
到找到满足条件的值或i>j时退出循环,输出。