• 二分练习题5 二分法求函数的零点 题解


    有函数:(f(x) = x^3 + 6.375 imes x^2 + 3 imes x - 26)
    已知 (f(1.0) lt 0, f(2.0) gt 0) 且方程 (f(x) = 0) 在区间 ([1.0, 2.0]) 有且只有一个根,请用二分法求出该根。

    输入格式

    无。

    输出格式

    输出该方程在区间 ([1.0, 2.0]) 中的根。要求四舍五入到小数点后 (3) 位。

    样例输入

    无。

    样例输出

    不提供。

    题目分析

    本题涉及算法:二分。
    我们之前都使用的是整数的二分,而这道题目使用的是实数之间的二分,所以在细节处理中和整数的二分稍有区别,但是万变不离其宗,我们只需要知道了这道题目的二分思想,那么解决这道题目就会变的很轻松。
    题目已经告诉我们 (f(1.0) lt 0 , f(2,0) gt 0) ,而我们的函数图像是连续的,所以在区间 ([1.0 , 2.0]) 之间一定存在一个可行的解 (x_0) 满足 (f(x_0) = 0) ,然后我们就可以二分了。
    我们一开始令 (L = 1.0) ,令 (R = 2.0) (注意这里的 (L)(R) 都是实数)。
    然后我们循环到 (R - L lt 10^{-5}) 在这种情况下我们能够保证循环结束时的 (L)(R) 保留三位小数的结果是相同的。
    然后我们每次取 (mid = (L+R)/2) ,会有两种情况:

    • 情况1:(f(mid) gt 0) ,这种情况下说明答案在 区间 ([mid, R]) 中,所以我们令 (L = mid)
    • 情况2:(f(mid) le 0) ,其实在 (f(mid) = 0) 时我们是直接可以退出循环了,但是为了和情况1进行相同的处理,我们令 (R= mid)

    这样循环处理,我们能保证循环结束时 (L)(R) 的前 (4) 位小数相差不超过 (10^{-5}),那么这个时候选择 (L) 或者 (R) 并保留两位有效数组的结果就是我们的答案。

    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    double f(double x) {
        return x*x*x + 6.375*x*x + 3.0*x - 26.0;
    }
    int main() {
        double L = 1.0, R = 2.0;
        while (R - L >= 1e-5) { // 1e-4是科学计数法,表示1乘10的-4次方
            double mid = (L + R) / 2.0;
            if (f(mid) > 0.0) R = mid;
            else L = mid;
        }
        printf("%.3lf
    ", R); // 因为R-L<=1e-4,所以这个时候输出L和R都一样
        return 0;
    }
    
  • 相关阅读:
    zabbix中文配置指南(转)-服务器监控
    Native Fullscreen JavaScript API (plus jQuery plugin)
    浅谈 HTML5 的 DOM Storage 机制 (转)
    How to Customize Server Header using NginX headers-more module
    编译安装nginx并修改版本头信息—参考实例
    nginx 去掉服务器版本和名称和nginx_status 状态说明
    修改NGINX版本名称为任意WEB SERVER
    php加速缓存Xcache的安装与配置
    nginx-rrd监控nginx访问数
    Egret3D初步笔记二 (Unity导出场景使用)
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11450628.html
Copyright © 2020-2023  润新知