C++ 二分法

2024 年 8 月 28 日 | 3 分钟阅读

数值分析的一个重要部分是定位连续函数在**_预定范围_**内的根的过程。在这种情况下,**_二分法_**提供了一种识别根的简单方法,有时也被称为**_区间减半法、二分查找法_**或**_对分法_**。它不是最快的方法,但其可靠性和简单性使其成为数值计算的有用工具。

当处理**_连续函数_**在**_区间 [a, b]_** 中,且端点处的函数值**_f(a)_** 和**_f(b)_** 符号相反时,**_二分法_**特别有用。中间值定理保证了此范围内至少存在一个根。二分法利用不断将区间二等分并在中点评估函数来收敛到所需的根。

C++ 中二分法的实现

C++ 实现二分法分为以下几个步骤

1. 首先创建要寻找**_根的目标函数_**。我们将以方程**_f(x) = x3 - 2x2 + 3_** 为例。

2. 选择一个**_起始区间 [a, b]_**,其中端点处的函数值符号相反。这是该过程能够正常工作的基本要求。

3. **_二分法_**的核心概念是迭代地缩小区间。建立一个循环,只要区间**_宽度 (b - a)_** 足够宽(本例中为**_01_**),就继续执行。在循环内部:

  • 使用公式**_c = (a + b) / 2_** 确定当前**_区间的中点_**。
  • 计算**_函数_**在 c 处的值。
  • 根据中点处的函数值,会出现三种情况:
  • 如果**_func(c)_** 等于**_0_**,则**_c_**已经是根,过程可以结束。
  • 如果**_func(c)_** 和**_func(a)_** 符号相反,将**_b_**更新为**_c_**以有效缩小区间。
  • 如果**_func(c)_** 和**_func(b)_** 符号相反,将**_a_**更新为**_c_**。
  • 直到区间宽度足够窄,循环会不断调整区间。现在,**_c_** 的值接近表示根。

4. 最后,循环中**_c_** 的值表示函数的近似根。

示例

这里提供了**_二分法_**的完整 C++ 实现

输出

The value of root is = -0.998535

说明

  • 程序将**_初始区间_**指定为**_a = -10_** 和**_b = 20_**。
  • 二分法通过迭代地细化区间来确定**_当前区间 (a, b)_** 的**_中点 c_**。
  • **_(A + B) / 2_** 用于计算**_c_** 的值。
  • 在**_中点_**处,程序检查函数**_func(c)_** 的值:
  • 如果**_func(c)_** 等于**_0_**,则循环结束,因为**_c_** 是根。
  • 如果**_func(c) * func(a) = 0_**,那么将**_b_** 更改为**_c_** 将缩短区间,因为**_func(c)_** 和**_func(a)_** 符号相反。
  • 如果上述条件都不**_真_**,则通过将**_a_** 更新为**_c_** 来缩短区间,因为**_func(c)_** 和**_func(b)_** 符号相反。
  • 重复循环,直到区间宽度**_(b - a)_** 降至**_01_** 以下。
  • 在此示例中,近似根 c 的值约为**_-0.998535_**。之后,程序会将其打印出来。

结论

总而言之,**_二分法_**是一种可靠的方法,用于近似计算指定区间内连续函数的根。尽管它不是目前最快的方法,但其简单性和鲁棒性使其成为数值分析的有用工具。该方法通过迭代地将区间减半和评估函数值,有效地减小了根的搜索空间。所提供的**_C++ 实现_**的示例输出显示了它在定位根方面的有效性。尽管有更复杂的算法可用,但**_二分法_**的简单性和多功能性使其在数值问题解决技术库中保持了一席之地。