二分法——方程求解

题目描述

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

相关推荐
蝈理塘(/_\)大怨种1 小时前
快速排序的三路划分和自省排序
数据结构·算法
qq_296553272 小时前
矩阵转置的两种实现方式:从暴力法到原地算法
数据结构·线性代数·算法·青少年编程·矩阵
2zcode2 小时前
滚压表面强化过程中变形诱导位错演化与梯度晶粒细化机理的数值模拟研究
人工智能·python·算法
渣渣苏2 小时前
硬核拆解 HNSW:亿级向量如何实现毫秒级召回?(下篇:实战调参与工程优化)
人工智能·算法·agent·向量数据库·hnsw·智能体
Felven2 小时前
A. Candies for Nephews
算法
白藏y2 小时前
【算法】常见基础算法
算法
shylyly_2 小时前
内存函数的使用和实现
数据结构·算法