当前位置: 首页 > news >正文

C++实现二分法求零点(二分法求零点)

前言

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

题目:

二分法求函数的零点:  有函数:  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。

注意:满足该定理是函数存在零点的充分不必要条件。如果该函数是一个单调函数,那么零点有且仅有一个。
————————————————

小总结:零点其实就是令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

运行结果截图


 

总结

清楚二分法的原理与用法并弄清楚零点的二分求法是关键。看到这里留个小尾巴不过分吧(请假条)

 

相关文章:

  • SECS/GEM半导体协议介绍
  • ARM接口实验-LED灯实验(A7核)
  • 经典卷积和深度卷积的神经网络
  • 【C语言】一篇文章彻底搞懂变量和常量
  • CSS基础12-canvas
  • javascript时钟的开发制作
  • 应用层协议 —— HTTP(二)
  • Qt之QCompleter的简单使用(自动补全、文本框提示、下拉框提示含源码+注释)
  • MyBatis-Plus(二)
  • Linux-常见命令(三)
  • 【国庆活动】Spring Boot 必知必会的核心理念(二)
  • c++:程序流程结构,顺序结构,选择结构if else,三目运算符
  • 使用 Amazon Rekognition API 进行文本检测和 OCR
  • 内核驱动踩坑记录
  • 半导体中的杂质和缺陷能级
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译]Python中的类属性与实例属性的区别
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 78. Subsets
  • Angular6错误 Service: No provider for Renderer2
  • CSS3 变换
  • java多线程
  • java中具有继承关系的类及其对象初始化顺序
  • Laravel5.4 Queues队列学习
  • PermissionScope Swift4 兼容问题
  • php的插入排序,通过双层for循环
  • PHP的类修饰符与访问修饰符
  • Python连接Oracle
  • 前嗅ForeSpider教程:创建模板
  • 人脸识别最新开发经验demo
  • 什么软件可以剪辑音乐?
  • 新手搭建网站的主要流程
  • 湖北分布式智能数据采集方法有哪些?
  • 容器镜像
  • 正则表达式-基础知识Review
  • ​configparser --- 配置文件解析器​
  • ​香农与信息论三大定律
  • #define,static,const,三种常量的区别
  • (2)Java 简介
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (差分)胡桃爱原石
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (小白学Java)Java简介和基本配置
  • (一)Thymeleaf用法——Thymeleaf简介
  • ***通过什么方式***网吧
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net6使用Sejil可视化日志
  • .NET开源快速、强大、免费的电子表格组件