二分法——方程求解

题目描述

求下面方程的根:f(x)=x3−5x2+10x−80=0

精确到小数点后 9 位。

代码实现:
cs 复制代码
#include <stdio.h>
#include <math.h>

// 定义函数 f(x)
double f(double x) {
    return x*x*x - 5*x*x + 10*x - 80;
}

int main() {
    double left, right, mid;
    
    // 寻找一个包含根的区间
    // 观察:f(0) = -80 < 0, f(10) = 1000 - 500 + 100 - 80 = 520 > 0
    left = 0;
    right = 10;
    
    // 确保区间两端函数值异号
    if (f(left) * f(right) >= 0) {
        printf("初始区间不包含根\n");
        return 1;
    }
    
    // 二分法迭代,直到精度达到 1e-10(比要求高一点保证 1e-9 正确)
    while ((right - left) > 1e-10) {
        mid = (left + right) / 2;
        if (f(mid) == 0) {
            break;
        } else if (f(mid) * f(left) < 0) {
            right = mid;
        } else {
            left = mid;
        }
    }
    
    // 输出结果,保留 9 位小数
    printf("%.9lf\n", mid);
    
    return 0;
}

上述二分法求连续函数在区间a,b内的根:

介值定理的应用:

如果函数 f(x) 在区间 a,b 上连续,且 f(a)⋅f(b)<0(即两端点函数值异号),则区间内至少存在一个根。

如果f(mid) * f(left) < 0说明mid和left之间有一个根,这时就将right=mid,再求一个新的更小区间的mid再进行比较。如果f(mid) * f(left) > 0说明mid和left之间没有根,那根就存在于mid和right之间,所以将left=mid再进行右半边的小区间划分,再进行根的求解。

相关推荐
BadBadBad__AK2 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌14 小时前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局14 小时前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象14 小时前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局14 小时前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局14 小时前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
统计实现局14 小时前
为什么 Cholesky 求逆比 Gauss-Jordan 快一倍——行列式溢出防护详
算法
To_OC1 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵1 天前
[Python] 扩展欧几里得算法
python·数学·算法