如何用c++语言风格编写用二分法求解f(x)=0的根

采用c++语言风格
以及二分法
求解f(x)=0的根,以f(x)=x^2-2x+1为例

首先写一个计算f(x)值的函数:

double f(double x) {
    return x * x - 2 * x + 1;
}

接下来,写一个函数来实现二分法求解方程的根:


double findRoot(double left, double right, double precision) {
    double mid;

    while (right - left > precision) {
        mid = (left + right) / 2.0;

        if (f(mid) == 0) {
            return mid;
        }
        else if (f(mid) * f(left) < 0) {
            right = mid;
        }
        else {
            left = mid;
        }
    }

    return (left + right) / 2.0;
}

在这个函数中,我们通过比较f(mid)和0的符号来确定根所在的区间,并不断缩小区间的范围,直到满足给定的精度。

现在,我们可以在主函数中调用这个函数来求解方程的根:

#include <iostream>

int main() {
    double left = -10.0;  // 左边界
    double right = 10.0;  // 右边界
    double precision = 0.0001;  // 精度

    double root = findRoot(left, right, precision);

    std::cout << "Root: " << root << std::endl;

    return 0;
}

在这个示例中,我们将左边界设置为-10,右边界设置为10,精度设置为0.0001。根据方程f(x) = x^2 - 2x + 1的图像,我们可以确定根位于区间[0, 2]内。

运行程序,它将输出方程的根:

Root: 1


#include <iostream>
#include <cmath>

double f(double x) {
    return x * x - 2 * x + 1;
}

double bisectionMethod(double a, double b, double epsilon) {
    double c = (a + b) / 2;
    double fc = f(c);

    while (std::abs(fc) > epsilon) {
        if (f(a) * fc < 0) {
            b = c;
        } else {
            a = c;
        }

        c = (a + b) / 2;
        fc = f(c);
    }

    return c;
}

int main() {
    double a = 0.0; // 左端点
    double b = 2.0; // 右端点
    double epsilon = 1e-6; // 精度

    double root = bisectionMethod(a, b, epsilon);

    std::cout << "Root: " << root << std::endl;

    return 0;
}