二分法——方程求解

题目描述

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

相关推荐
其实防守也摸鱼23 分钟前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt1 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one4 小时前
递归算法(一)
java·开发语言·算法
风影同志783246 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG6 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者7 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者7 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品
youshi66687 小时前
PID——算法改进
算法
一只不想敲代码的程序猿9 小时前
如何更高效地拆解问题?
算法
微尘hjx10 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort