C++实现二分法求零点

目录

前言

题目:

一、零点是什么?

二、二分法求零点

1.二分法

2.完整代码

总结



前言

首先,我们要清楚我们是干嘛的;其次,知道原理;最后,才能明白自己要怎么办。明确:用二分法求函数。

题目:

二分法求函数的零点:  有函数:  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] 有且只有一个根,请用二分法求出该根。

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


注意:要弄清二分法和零点是啥。

一、零点是什么?

1.零点及零点存在性定理
1.1零点定义,对于函数y = f ( x ) ,使得f ( x ) = 0 的实数x叫做函数f ( x ) 的零点。换句话说,函数y = f ( x )的零点就是方程f ( x ) = 0 f的实数根,也就是函数y = f ( x )的图像与x轴的交点。

1.2零点存在性定理,如果函数f = f ( x ) f=f(x)f=f(x)在区间[ a , b ] [a,b][a,b]上的图像是连续的曲线,并且有f ( a ) ⋅ f ( b ) < 0 ,我们就说函数y = f ( x )在开区间( a , b )内有零点,即存在c ∈ ( a , b ) 使得f ( c ) = 0。

注意:满足该定理是函数存在零点的充分不必要条件。如果该函数是一个单调函数,那么零点有且仅有一个。
————————————————
版权声明:本文为CSDN博主「我什么都布吉岛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39258979/article/details/122565270

小总结:零点其实就是令f(x)=0求得的x的值,故零点不是点而是一个数值。

二、二分法求零点

1.二分法

就是求2个点的中点的值

比如f(x)中f(a)>0,f(b)<0

那就求f((a+b)/2)的值

如果f((a+b)/2)>0把f((a+b)/2)赋值给f(a),f(b)不变,继续重复上面的过程。

如果f((a+b)/2)<0把f((a+b)/2)赋值给f(b),f(a)不变,继续重复上面的过程。

直到|f(a)-f(b)|小于你给定的一个很小的数,就可以得到近似解了。

对于函数y=f(x)(x∈R),我们把方程f(x)=0的实数根x叫作函数y=f(x)(x∈R)的零点(the zero of the function)。即函数的零点就是使函数值为0的自变量的值。函数的零点不是一个点,而是一个实数。

小总结:二分法实际就是取半求值与两边比对逐渐逼近零点。

2.完整代码

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <math.h>//可以调用数学运算函数,fabs()求精度
using namespace std;
#include <iostream>
//构造所求的函数
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 findZero(double a, double b, double err)//a,b为已知所给区间的端点,即零点(该方程等于零的根)在【a,b】中;err为所要求得的f(x)值的精度,此时x是要求的近似零点
{
    double t = 0.0;//t初始化
    //区间两端的函数值的精度小于所给的精度就直接返回两端的值即为近似零点
    if (fabs(f(a)) < err)
        return a;
    if (fabs(f(b)) < err)
        return b;
    //区间大小的精度大于所给精度时
    while (fabs(a - b) > err)
    {
        t = (a + b) / 2;
        if (f(a) * f(t) < 0)
        {
            b = t;
        }
        else
        {
            a = t;
        }
        if (fabs(f(t)) < err)
        {
            return t;
        }
    }
    return t;
}


void test01()
{
    
    cout << findZero(1.5, 2.4, 0.000001) << endl;
}

int main(void)
{
    test01();
    system("pause");
    return 0;
}y

运行结果截图


 

总结

清楚二分法的原理与用法并弄清楚零点的二分求法是关键。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值