二分法——方程求解

题目描述

求下面方程的根: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再进行右半边的小区间划分,再进行根的求解。

相关推荐
ZiLing几秒前
2026 ROS 2 Lyrical 工程实例(一):从零搭建 AMR 激光 SLAM——Gazebo、slam_toolbox 与 Nav2 全链路跑通
算法
巴糖几秒前
为什么你的大模型总在胡说八道?—— top_k /top_p/temperature 调参实战手册
算法
rou6 分钟前
LeetCode410.分割数组的最大值
算法
垆边人似月.7 分钟前
华为题:字符串中最长连续数字串
开发语言·c++·算法
_不会dp不改名_9 分钟前
leetcode_3273 数位平方和的最大值
算法·leetcode·职场和发展
vivo互联网技术10 分钟前
SSR-Merge:把 LoRA 合并从"参数算术"变成"信号路由" | ICML 2026
人工智能·算法·计算机视觉
罗湖老棍子11 分钟前
座位安排(洛谷-P2071)
c++·算法·图论·匈牙利算法·二分图匹配
巴糖17 分钟前
挑礼物这件事,暴露了你做选择时最大的问题
算法
用户73416810354819 分钟前
控制与监测特征的联合表征:复杂动力装备变工况故障诊断的发展方向
算法
垆边人似月.24 分钟前
华为题:无重复字符的最长子串变种
算法