洛谷:P1024:一元三次方程求解


洛谷:P1024:一元三次方程求解

Table of Contents

题目

P1024:一元三次方程求解

分析

这道题目对数学知识的要求不高,只要了解一点:

对于任何连续的函数,如果\(f(x_1)\times f(x_2)\lt 0\),那么在这个区间中一定存在\(f(x)=0\)的一个根。

再仔细看题目:

约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1

那么可以保证的是,在一个跨度为1的区间里,最多只有一个根。

那么我们可以将整个可能的区间分成若干个跨度为1的区间,然后用上述的数学知识来判断是否存在根。这个判断过程就是典型的二分法。

        if (f(left, a, b, c, d) * f(right, a, b, c, d) > 0)
        {
            continue;  // 如果没有根,跳过该区间
        }

        // 在当前小区间内使用二分法找到一个根
        double mid;
        while (right - left > 1e-6)
        {  // 精度控制到 1e-6
            mid = (left + right) / 2;
            if (f(left, a, b, c, d) * f(mid, a, b, c, d) <= 0)
            {
                right = mid;  // 根在 [left, mid]
            }
            else
            {
                left = mid;  // 根在 [mid, right]
            }
        }
        // 找到一个根,存储并继续查找下一个根
        roots[root_count++] = (left + right) / 2;

答案

Solution

思考

针对浮点数的比较,我再强调一下:由于浮点数的“不精确性”,永远不要试图比较两个浮点数完全相等,而是应该用程序中的方式:\(|a-b|\lt eps\)就可以了,而这里的\(eps\)是一个根据题目精度要求而定的一个所谓“无穷小量”。

上一篇 下一篇