c语言二分法解算复杂函数值

在网上看到一个帖子,要求如下:

方法如下:

cpp 复制代码
/**
 * 由于这个方程无法通过代数方法直接求解,我们可以使用数值方法(如二分法)
 * 来近似求解变量n的值。下面将详细介绍如何使用C语言实现这一过程。其他部分结果是可求的
 */
#include <stdio.h>
#include <math.h>

// 将公式定义为一个函数,直接抄过来,没有进行化简
double f(double n, double theta, double delta_m) {
    if (n < 1.0) {
        return INFINITY;  // 表示无效
    }
    double left  = 2e-3 * (1 / (sqrt(1 - pow(sin(theta)/1.5, 2))) - 1) * 3;
    double right = 2e-2 * (1 / (sqrt(1 - sin(theta) * sin(theta) / n / n)) - 1) * n;
    return left + right - delta_m * 632.8e-9;
}

int main() {
    double lower = 1.50;    // 初始下界
    double upper = 10.0;   // 初始上界
    double mid;
    double tolerance = 1e-10; // 容忍度
    int max_iterations = 100000000;
    int iterations = 0;

    // 检查初始区间是否满足f(lower)*f(upper) < 0
    double theta = 0.52359877559;
    double delta_m = 2264.7666815607;
    double f_lower = f(lower, theta, delta_m);
    double f_upper = f(upper, theta, delta_m);

    if (f_lower * f_upper > 0) {
        printf("无法在初始区间找到根。请尝试其他区间。\n");
        return 1;
    }

    // 二分法迭代
    while ((upper - lower) / 2.0 > tolerance && iterations < max_iterations) {
        mid = (lower + upper) / 2.0;
        double f_mid = f(mid, theta, delta_m);

        if (fabs(f_mid) < tolerance) {
            break; // 找到足够精确的解
        }

        // 判断哪一半包含根
        if (f_lower * f_mid < 0) {
            upper = mid;
            f_upper = f_mid;
        } else {
            lower = mid;
            f_lower = f_mid;
        }

        iterations++;
    }

    if (iterations == max_iterations) {
        printf("达到最大迭代次数,未能找到足够精确的解。\n");
    } else {
        printf("方程的近似解为 n = %.6f\n", (lower + upper) / 2.0);
    }

    return 0;
}
相关推荐
CoderYanger6 分钟前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
kiracrimson19 分钟前
选择排序与快速排序:一次选极值,一次分区间
算法·排序算法
xuxigifxfh26 分钟前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo730 分钟前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具
LONGZETECH30 分钟前
新能源技术实训难题破解:纯电动汽车五大核心系统三维仿真解决方案
大数据·c语言·人工智能·安全·汽车
tachibana232 分钟前
Golang 中数组和切片的区别?
开发语言·后端·golang·数组·切片
All for pursuit.39 分钟前
【动态规划-8】152.乘积最大子数组
数据结构·c++·算法·leetcode·动态规划
信奥卷王41 分钟前
[GESP202512 六级] 路径覆盖
数据结构·算法
Lazionr1 小时前
手撕 unordered_set 和 unordered_map,剖析哈希表底层实现
c++·算法
智购科技无人售货机工厂店1 小时前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse