VC++计算精解【6】

文章目录

  • 二分法(Bisection Method)
    • 数学原理
    • c++
  • 参考文献

二分法(Bisection Method)

数学原理

  • 如果一个函数 f ( x ) f(x) f(x) 在闭区间 [ a , b ] [a, b] [a,b] 上连续,且满足 f ( a ) ⋅ f ( b ) < 0 f(a) \cdot f(b) < 0 f(a)f(b)<0(即 f ( a ) f(a) f(a) f ( b ) f(b) f(b) 异号),那么在开区间 ( a , b ) (a, b) (a,b) 中至少存在一个 c c c 使得:
    f ( c ) = 0 f(c) = 0 f(c)=0
  • 二分法通过反复缩小区间 [ a , b ] [a, b] [a,b] 来逼近根。
    • 条件
      • f ( x ) f(x) f(x) 在区间 [ a , b ] [a, b] [a,b] 上连续
      • f ( a ) ⋅ f ( b ) < 0 f(a) \cdot f(b) < 0 f(a)f(b)<0
    • 中点
      • 计算中点
        c = a + b 2 c = \frac{a + b}{2} c=2a+b
    • f ( c ) = 0 f(c) = 0 f(c)=0 ∣ b − a ∣ < 预设的误差范围 |b - a| < \text{预设的误差范围} ba<预设的误差范围
      • c c c 即为近似解。
      • 否则继续迭代。
  1. 缩小区间
    根据 f ( c ) f(c) f(c) 的符号,选择包含根的半区间:

    • 如果 f ( a ) ⋅ f ( c ) < 0 f(a) \cdot f(c) < 0 f(a)f(c)<0,则根位于 [ a , c ] [a, c] [a,c],更新区间为 [ a , c ] [a, c] [a,c]
    • 如果 f ( c ) ⋅ f ( b ) < 0 f(c) \cdot f(b) < 0 f(c)f(b)<0,则根位于 [ c , b ] [c, b] [c,b],更新区间为 [ c , b ] [c, b] [c,b]
  2. 重复迭代
    按上述步骤反复迭代,直到满足收敛条件(例如区间长度足够小或 f ( c ) f(c) f(c) 足够接近 0)。


c++

#include 
#include 

using namespace std;


// 函数定义
double f(double x) {
    return 3*pow(x,3) -7*pow(x,2) +11; 
}

// 二分法函数
double bisection(double a, double b, double tol, function<double(double)> func) {
    double c;
    if (func(a) * func(b) >= 0) {
        cerr << "f(a)和f(b)必须符号相反!" << endl;
        return NAN;
    }

     c = a; // 中点
    while ((b - a) >= tol) {
        // 计算中点
        c = (a + b) / 2;

        // 检查是否是解
        if (abs(func(c)) <= tol)
            break;

        // 判断解在左区间还是右区间
        if (func(c) * func(a) < 0)
            b = c;
        else
            a = c;
    }
    return c;
}

int main() {
    double a = -5, b = 5; // 初始区间 [a, b]
    double tol = 1e-6;   // 误差容忍度

    double root = bisection( a, b, tol, f);
    if (!isnan(root)) {
        cout << "根是: " << root << endl;
    }
    return 0;
}

参考文献

  1. chatgpt

你可能感兴趣的:(VC++2022计算精解,c++,开发语言)