首页 > 编程语言 >C++实现二分法求零点

C++实现二分法求零点

时间:2022-10-02 01:33:35浏览次数:56  
标签:return 函数 err double 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

运行结果截图

​编辑


 

总结

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

标签:return,函数,err,double,C++,二分法,零点
From: https://www.cnblogs.com/guang123/p/16748150.html

相关文章

  • c++ vector
    创建vectorvector的几个别名:向量、动态数组头文件:#include<vector>记得加上std命名空间,不然会报错usingnamespacestd;创建vectorvector<int>A;//一维动态数组......
  • C++智能指针
    C++智能指针需要头文件<memory>不需要手动释放指针不是所有指针都能封装成智能指针,很多时候原始指针更加方便。std::unique_ptr任何时刻都只能有一个指针管理内存......
  • C++ 编程中常用的英文单词(首字母是A、B、C开头)
    学习编程不一定需要英语水平很高,能记住认识一些常用的英文单词也可以,有看不明白的文档资料也可以使用翻译工具,编写代码时大部分好用的IDE都是有代码提示的。本文主要介绍C+......
  • C++ 编程中常用的英文单词(首字母是D、E、F开头)
    学习编程不一定需要英语水平很高,能记住认识一些常用的英文单词也可以,有看不明白的文档资料也可以使用翻译工具,编写代码时大部分好用的IDE都是有代码提示的。本文主要介绍C+......
  • 对c++的一些思考
    能用初始化列表就用能写explicit就写能用c++11自带的跨平台函数、对象就用、但也要分情况,如果想完全知道自己在干什么就用系统API能自己写的就不要让编译器......
  • C++ 彩票器
    #include<iostream>#include<ctime>#include<cstdlib>usingnamespacestd;intmain(intargc,char**argv){//1.获取一下你买的彩票号码intnumber=0;......
  • 贤鱼的刷题日常-【c++】P7909 [CSP-J 2021] 分糖果
    ✅创作者:贤鱼⏰预计时间:15分钟@​​TOC​​题目题目背景红太阳幼儿园的小朋友们开始分糖果啦!题目描述红太阳幼儿园有n个小朋友,你是其中之一。保证n≥2。有一天你在幼儿园......
  • C++ 第46课八卦图读取
    #include<bits/stdc++.h>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;stringmeiju(stringX,stringZ){ stringx,z; intid=251,data=15,cis......
  • C++_Windows Socket 学习记录_01
    主要实现服务器-服务器传输消息Server.cpp#include<stdio.h>#include<stdlib.h>#include<WinSock2.h>#include<iostream>#pragmacomment(lib,"ws2_32.lib")us......
  • VSCode + WSL + clangd +CMake + CMake Tools搭建C++开发环境
    前言开始安装前先了解以下概念:gcc,llvm,clang区别与联系:详解三大编译器:gcc、llvm和clangclangd是什么?Whatisclangd?与LLVM每日谈之二十五Clangd和LSP简而言之cl......