二分法求函数的零点(二分不适合不变号零点的情况)

二分法的定义:

对于在区间【a,b】上连续不断且f(a)*f(b)<0的函数,y=f(x),通过不把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐渐逼近零点,进而得到零点近似值的方法。

有函数:

f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121

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

无。

Output

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

Sample

Inputcopy

Outputcopy

不提供

思路:

  1. 确定区间范围【a,b】和精确度(r)。double a=1.5,double b=2.4,double r=0.0000001;

  1. 根据题意以及二分查找的特点可以知道,f(a)*f(b)<0,假若零点为ans,如果|ans|

  1. 最先判断当前这个数是否是零点,如果|f(a)|小于r就返回a,如果|f(b)|小于精确度就返回b

  1. 当|f(a-b)|>r,就应该将区间一分为二,不断逼近零点,则有以下三种情况

  1. 中点:mid=(a+b)/2

  1. 当f(a)*f(mid)<0,令b=mid,此时零点所在区间为【a,mid】;当f(b)*f(mid)<0,令a=mid,此时零点所在区间【mid,b】;当|f(mid)|

注意

  1. abs()是对整数取绝对值,在c中头文件#inlcude,fabs()是对浮点数取绝对值,头文件在c中#include

  1. abs()和fabs()在c++中的头文件是#include

代码

#include
#include
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;
}
double zeropoint(double a,double b,double r)
{
    double mid;
    if(fabs(f(a))r)
    {
        mid=(a+b)/2;
        if(f(a)*f(mid)<0)
            b=mid;
        if(f(b)*f(mid)<0)
            a=mid;
        if(fabs(f(mid))

你可能感兴趣的:(ACM实验室---周赛训练题,算法,青少年编程,开发语言,c++,c语言)