当使用区间 [a, b]中的连续函数时,其中端点f(a)和f(b)处的函数值具有相反的符号,二分法特别有用。中间值定理保证该范围内至少存在一个根。二分法利用不断二分区间并在中间评估函数以收敛到所需的根。
Bisection 方法在 C++ 中的实现:
二分法的 C++ 实现分为以下步骤:
1.首先创建要查找其根的目标函数。我们将使用方程f(x) = x3 - 2x2 + 3作为示例。
double func(double x) |
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 的值已经接近根值。
这里提供了分段法的完整 C++ 实现:
#include<iostream> |
解释:
- 程序指定初始区间为 a = -10 和 b = 20。
- 当前区间 (a, b) 的中点 c 是通过迭代细化区间的 "二分法 "确定的。
* / 2 用于计算 c 的值。 - 在中点,程序会检查函数 func(c) 的值:
- 由于 c 是根值,如果 func(c) 等于 0,循环就结束。
- 如果 func(c) * func(a)= 0,那么将 b 改为 c 将缩短时间间隔,因为 func(c) 和 func(a) 的符号相反。
- 如果上述条件都不成立,那么将 a 改为 c 会缩短时间间隔,因为 func(c) 和 func(b) 的符号相反。
- 直到区间宽度 (b - a) 降到 01 以下,重复循环。
- 在本例中,近似根 c 的值约为 -0.998535。之后,程序会将其打印出来。
结论
总之,二分法是在指定区间内大致逼近连续函数根的一种可靠方法。虽然它不是目前最快的方法,但它的简单性和弹性使其成为数值分析的有用工具。该方法通过迭代减半区间和评估函数值,有效地缩小了根的搜索空间。所提供的 C++ 实现的输出示例显示了该方法在定位根方面的有效性。尽管有更复杂的算法可供选择,但二分法的简单性和多功能性使其在数值问题解决技术中始终占据一席之地。