二分法模拟器 返回
数值分析模拟器

二分法 模拟器 — 区间夹逼根搜索

以 f(x)=x³−2x−5 为例,通过中点 c=(a+b)/2 逐次缩小区间来实现二分法的根搜索。实时可视化收敛过程,可自由调整初始区间 a, b、容差、迭代次数。

参数设置
初始区间左端 a1.00
初始区间右端 b3.00
最大迭代次数30
容差 1e^−n6

暂停时,拖动滑块即可即时更新结果。

计算结果
迭代次数 n
中点 c
f(c)
区间宽度 (b−a)
函数与区间 [a, b](f(x)=x³−2x−5)
区间宽度 (b−a) 的收敛(log10)
理论与主要公式

$$c_n = \frac{a_n + b_n}{2}, \quad [a_{n+1}, b_{n+1}] = \begin{cases} [a_n, c_n] & f(a_n)\,f(c_n) \lt 0 \\ [c_n, b_n] & \text{otherwise} \end{cases}$$

二分法更新规则。根据中点 c_n 的符号选择含根半区间,逐次缩小区间。

$$f(x) = x^{3} - 2x - 5, \quad f(a_0)\cdot f(b_0) \lt 0$$

测试函数(Newton 原题)及前提条件。实根约为 x ≈ 2.094551482。

$$|b_n - a_n| \lt \varepsilon, \qquad N \approx \log_2\!\left(\frac{b_0 - a_0}{\varepsilon}\right)$$

收敛判定及所需迭代次数。对容差 ε=1e^−n,有 N ≈ log₂((b₀−a₀)/ε)。线性收敛(误差每次迭代减半)。

什么是二分法

针对连续函数 f(x),在 f(a)·f(b)<0(区间两端符号相反)的前提下,通过中点逐次缩小区间来夹逼根的数值求解方法。\"绝不发散\"是其最大优势,也是最古老、最稳健的根搜索算法之一。

🙋
这和牛顿法有什么区别?我听说牛顿法更快啊。
🎓
确实,牛顿法速度快得多——\"二次收敛\",误差每次迭代约平方倍递减。反观二分法是\"线性收敛\",每次迭代区间宽度只减半。要把精度从 1e-2 提高到 1e-6,需要约 log₂(2/1e−6)≈21次迭代。那二分法的用处呢?答案是——绝对不发散。牛顿法初值稍有不慎就可能飞出无穷远,但二分法只要 f(a)·f(b)<0 就必定收敛。实务做法是先用二分法圈定根的位置,区间足够小后再交给牛顿法快速精化,这种混合策略叫\"混合法\"。Brent法就是把这种思路集成到一个函数里的经典代表。
🙋
如果区间两端变成同号会怎样?
🎓
二分法的前提就坍塌了。模拟器里如果设 a=1, b=2,算一下:f(1)=−6, f(2)=−1,都是负数。这时会出现\"同号错误\"提示。中间值定理只能保证\"区间内有奇数个根\",同号就无法保证。为了避免这种情况,实现时通常在调用二分法前检查 f(a)·f(b)<0,或事先草绘函数图像来目视定位根的大致位置。这是铁则。
🙋
容差改成 1e−12 反复次数会翻倍吗?
🎓
基本是翻倍。线性收敛的特点,从 1e−6 改到 1e−12 需要额外 log₂(10⁶)≈20次迭代。相比之下,牛顿法可能只多算1~2次。所以容差很严格时,成本差异很大。话说回来,二分法算到区间宽 1e−15 都还够稳定(机器精度约 2.2e−16),工业应用通常是用二分法到 1e−4~1e−6,再切牛顿法或割线法做精化。

物理模型与主要公式

二分法将连续函数的中间值定理(IVT: Intermediate Value Theorem)直接转化为算法。当 f(a)·f(b)<0 时,区间 (a, b) 内必有至少一个根。

$$c_n = \frac{a_n + b_n}{2}$$

计算中点,通过其符号选择含根的半区间:

$$[a_{n+1}, b_{n+1}] = \begin{cases} [a_n, c_n] & f(a_n)\,f(c_n) \lt 0 \\ [c_n, b_n] & f(a_n)\,f(c_n) \gt 0 \end{cases}$$

误差上界(线性收敛):

$$|c_n - x^{*}| \le \frac{b_0 - a_0}{2^{n+1}}$$

达到容差 ε 所需的迭代次数:

$$N \ge \log_{2}\!\left(\frac{b_0 - a_0}{\varepsilon}\right)$$

即每次迭代有效数字增加 log₁₀(2) ≈ 0.301 位。与牛顿法的\"位数倍增\"相比较慢,但优点是无初值敏感性。

实际应用

非线性求解器的安全网(CAE):Abaqus、ANSYS 等非线性结构分析当牛顿-拉夫逊迭代发散时,会退而求其次用类似二分法的区间缩小方案。弧长法(Riks方法)求解分析弧长时,也常用二分法来解平衡路径的垂直约束方程。

状态方程反演(CFD 流体力学):气体、液体的密度→压力一般有显函数,但压力→密度往往没有解析反函数。在 SUPG/PISO/SIMPLE 的各子步都需用二分法或 Brent 法来反演。

接触分析时步控制:显式 FEM 中,若节点在某时步穿透接触面,用二分法精确搜索穿透量为零的接触时刻 t*(常与罚函数法配合)。

优化线性搜索:梯度法、牛顿法各迭代步确定步长 α 时,需用二分法满足 Wolfe 条件(常与黄金分割法、Armijo 回退法搭配)。

常见误解与注意事项

最常见的误解是\"线性收敛慢,二分法没用\"。确实从迭代次数看不利,但每次迭代仅需计算 f(x) 一次,计算量极轻。而牛顿法每次需算 f 和 f',在 CAE 等高维问题中,雅可比矩阵(刚度矩阵)组装成本压倒性巨大。按单次迭代耗时比较,二分法有时反而更便宜。

第二个误解是\"中间值定理保证唯一根\"。其实它只保证\"奇数个根\"。可能有3个根。二分法每次迭代把奇数分成1或3,最终定位到某一个根,初始区间的选择决定了最后收敛到哪个根。试试模拟器,设 a=−2, b=3(宽区间),逐步缩小看哪个根被夹住。

最后一个陷阱是\"f 不连续的情况\"。中间值定理只对连续函数成立。如果 f 在某点不连续且该点符号反转,二分法会\"假冒收敛\",看似有根其实没有。例如 1/x 在 x=0 不连续但不存根。实现时需检查函数连续性,或事先了解函数特性。

常见问题

常用停止条件有三种:(1) 区间宽度 |b−a| < 2ε(位置精度),(2) |f(c)| < ε(残差精度),(3) 达最大迭代数。工业应用多用 (1) 和 (3) 的组合,本模拟器也采用区间宽度与最大迭代数的双重停止。残差条件在根附近斜率很小时容易提前退出,需谨慎。
割线法(Secant method)不用中点而用 f(a), f(b) 连线与 x 轴交点作试探点,达超线性收敛(阶数 φ≈1.618),比二分法快。但不是区间夹逼,存发散风险。Brent法融合二分法、割线法、逆二次插值,自动切换,兼具稳健与速度,是标准库的常客(SciPy的brentq、MATLAB的fzero核心)。
简单二分法限于一维。多维情况有\"区间分析\"和\"Krawczyk算子\"作二分法的高维版本,但应用有限。CAE中多维非线性求解实际上只有牛顿-拉夫逊法(用雅可比矩阵)一条路,二分法思想的推广应用很少。
事先粗采样函数(10~100个点)来找符号反转位置,在其附近作初始区间。这叫\"网格搜索+二分法\"。物理约束(如温度≥绝对零度)往往天然给出区间范围。本模拟器的三次函数,取足够宽的区间 [−5, 10] 必包实根。

使用指南

  1. 用滑块 slA、slB 设置初始区间 [a,b]。检查 f(a) 和 f(b) 的符号是否相反
  2. 用 slTolExp 指定容差。1e−6 表示精确到小数第6位
  3. 设置最大迭代次数 slMaxIter,点击执行按钮启动二分法。收敛过程实时可视化
  4. 每步计算中点 c=(a+b)/2,根据 f(c) 的符号更新 a, b。区间宽度小于容差时停止

具体计算示例

本工具的方程 f(x)=x³−2x−5=0,设初始区间 [1.0, 3.0]、容差 1e−6。f(1)=−6<0、f(3)=16>0 符号相反,满足前提。第1次迭代:中点 c=2.0,f(2)=−1<0,更新 a=2.0;之后不断将区间二分缩小,约21次迭代后收敛到根 x≈2.094552,最终区间宽约 9.5×10⁻⁷,满足容差条件

工业应用注意事项