二分法实例应用(一)

简介: 二分法实例应用(一):方程求解(POJ 4140)

二分算法实例应用(一)

方程求解 (POJ 4140)

Description

求下面方程的根:f(x) = x^3- 5x^2+ 10x - 80 = 0。

Input

-

Output

精确到小数点后9位。

Sample Input

-

Sample Output

5.705085932



算法思想:

对方程f(x)求导,得f'(x)=3x^2-10x+10。其中f'(x)>0恒成立。

故,f(x)为严格单调增函数。由方程易知f(0)<0,且f(100)>0,所以由零点定理可知,在区间[0,100]内有且仅有一个实根。

由于f(x)在[0,100]内是单调的,所以可以用二分法在区间[0,100]中进行根的满足性探索。



代码逻辑:

  1. 在C语言中,进行浮点数为0判断时,一般考虑判断该数的绝对值是否小于一个极小值ε,通常ε选10^-6。

    代码如下:

    #define EPS 1e-6
  2. 设计求f(x)的值的函数。

    double fun(double x) {
        return pow(x, 3) - 5 * pow(x, 2) + 10 * x - 80;
    }
  3. 采用二分法进行解的探索,

    1. 使用left,right变量来记录根的存在区间的左右端点。x取区间中点。
    2. 若f(x)>0则表明x点为更小的右端点,修改右端点为x;反之,若f(x)≤0则表明x为更大的左端点,修改左端点为x;
    3. 再计算当前区间中点的函数值,返回步骤2进行判断。直至找到一个使f(x)=0的根x。



代码整合:

//
// Created by Ss1Two on 2023/2/7.
//

#include "stdio.h"
#include "math.h"

double EPS = 1e-6;//无穷小值Epsilon->ε=10^-10,用于判断浮点数是否为0

double EquationSolving();//线性方程求解函数声明

double fun(double x);//线性方程计算函数声明

int main(void) {
    printf("%.9f\n", EquationSolving());
    return 0;
}


double fun(double x) {
    return pow(x, 3) - 5 * pow(x, 2) + 10 * x - 80;
}

double EquationSolving() {
    //x->自变量,y->函数值,left->解区间左端点,right->解区间右端点
    double x, left = 0, right = 100, y;

    x = left + (right - left) / 2;
    y = fun(x);

    while (fabs(y) > EPS) {
        if (y > 0) {
            right = x;
        } else {
            left = x;
        }
        x = left + (right - left) / 2;
        y = fun(x);
    }
    return x;
}


Created by Ss1Two on 2023/2/7

目录
相关文章
|
11月前
|
算法 测试技术 C#
C++二分算法:使数组严格递增
C++二分算法:使数组严格递增
|
6月前
|
人工智能 C++
查找题(二分解法c++)
查找题(二分解法c++)
56 0
|
6月前
|
机器学习/深度学习 移动开发
【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数
【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数
|
6月前
|
算法 Java C++
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
42 0
|
6月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
56 0
|
11月前
|
算法 测试技术 C#
C++二分算法:得到山形数组的最少删除次数
C++二分算法:得到山形数组的最少删除次数
|
12月前
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
52 0
算法:分治思想处理快排递归以及快速选择/最小K个数问题
算法:分治思想处理快排递归以及快速选择/最小K个数问题
|
算法 索引
算法:二分查找算法/朴素二分/查找区间左右端点二分
算法:二分查找算法/朴素二分/查找区间左右端点二分
|
算法
数列极差(大根堆的删和贪心算法模板)
数列极差(大根堆的删和贪心算法模板)
65 0