二分法——方程求解

题目描述

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

相关推荐
jidaowansui15 分钟前
P11375 [GESP202412 六级] 树上游走
数据结构·算法
hai3152475431 小时前
FlashAttention C语言(C++)实现(展示版)
c语言·开发语言·c++·人工智能·算法
林爷万福1 小时前
光谱数据预处理:基线校正、平滑去噪实战
人工智能·算法
8Qi82 小时前
LeetCode 1049:最后一块石头的重量 II —— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
wubba lubba dub dub7502 小时前
第四十九周学习周报
人工智能·算法·机器学习
Java_2017_csdn2 小时前
ComplexKeysShardingAlgorithm 小结
java·大数据·算法
海梨花2 小时前
快手面试高频算法题
java·算法·面试
lqqjuly2 小时前
超分辨率算法深度解析(Super-Resolution Algorithms)
算法
嵌入式老牛4 小时前
液晶段码(米/日字格)识别—倾斜校正
opencv·算法·仿射变换
luj_17684 小时前
残熵算法:风险缓冲与效率优化的融合
c语言·开发语言·网络·经验分享·算法