什么是二分法?
二分法是求连续函数 \(f(x)\) 根(即满足 \(f(x) = 0\) 的 \(x\) 值)最古老、最可靠的方法之一。它先选定一个使函数符号发生改变的区间 \([a, b]\),然后不断把区间对半切分,每次保留仍然"夹住"根的那一半。由于每一步都保持着符号变化,只要 \(f\) 连续且 \(f(a)\) 与 \(f(b)\) 异号,这种方法就必定收敛。本计算器适用于任意无量纲实函数,三角运算采用弧度制。
如何使用本计算器
在 f(x) 输入框中以 \(x\) 为变量填写函数(例如 x-cos(x)、x^2-2 或 exp(x)-3)。设置下端点 a 和上端点 b,使根落在两者之间——也就是 \(f(a)\cdot f(b)\) 必须小于或等于零。再选择最大迭代次数 n 以及希望显示的位数。工具会返回近似根、该处的函数值(应接近零)以及实际所需的迭代次数。
计算公式
每一步的估计值取区间中点 $$x_n = \frac{a_n + b_n}{2}$$ 如果 \(|f(x_n)|\) 小于容差,就接受 \(x_n\)。否则算法保留仍存在符号变化的那一半:若 \(f(a_n)\cdot f(x_n) > 0\),说明根在右侧(令 \(a = x_n\)),否则根在左侧(令 \(b = x_n\))。区间宽度按 \(\frac{b-a}{2^n}\) 不断缩小,因此收敛是线性的——大约每迭代一步就多得到一位正确的二进制数字。
实例演示
对于 \(f(x) = x - \cos(x)\),区间取 \([-10, 10]\):\(f(-10) \approx -10.84\)(负值),\(f(10) \approx 10.84\)(正值),所以根被夹在区间内。反复对半后收敛到 \(x \approx 0.7390851332151607\),即著名的"Dottie 数",它满足 \(x = \cos x\),此时 \(f(x)\) 实际上等于零。
如何手工执行二分法
二分法通过重复将已知包含根的区间对半来求解 \(f(x)=0\) 的根。它基于中间值定理:如果 \(f\) 在 \([a,b]\) 上连续且 \(f(a)\) 和 \(f(b)\) 符号相反,则根必定位于它们之间。
- 验证括号区间。 确认 \(f(a)\cdot f(b)<0\)。如果乘积为正,则区间不保证包含根 — 选择不同的 \([a,b]\)。
- 计算中点。 \(m=\dfrac{a+b}{2}\)。
- 计算函数值。 求得 \(f(m)\)。如果 \(f(m)=0\)(或在容差范围内),则 \(m\) 是根并停止。
- 按符号替换端点。 如果 \(f(a)\cdot f(m)<0\),根在 \([a,m]\) 内,设 \(b\leftarrow m\)。否则根在 \([m,b]\) 内,设 \(a\leftarrow m\)。
- 重复步骤 2–4 直到 \(|b-a|<\text{tol}\) 或 \(|f(m)|<\text{tol}\),或达到最大迭代次数。
示例: \(f(x)=x^{3}-x-2\) 在 \([1,2]\) 上。检验:\(f(1)=-2\),\(f(2)=4\),乘积 \(<0\) — 括号区间有效。
| 迭代 | a | b | m=(a+b)/2 | f(m) | 新区间 |
|---|---|---|---|---|---|
| 1 | 1.0000 | 2.0000 | 1.5000 | −0.125 | [1.5, 2] |
| 2 | 1.5000 | 2.0000 | 1.7500 | 1.6094 | [1.5, 1.75] |
| 3 | 1.5000 | 1.7500 | 1.6250 | 0.6660 | [1.5, 1.625] |
| 4 | 1.5000 | 1.6250 | 1.5625 | 0.2522 | [1.5, 1.5625] |
| 5 | 1.5000 | 1.5625 | 1.5313 | 0.0591 | [1.5, 1.5313] |
| 6 | 1.5000 | 1.5313 | 1.5156 | −0.0340 | [1.5156, 1.5313] |
经过更多迭代后,区间逼近真实根 1.521380,这也是三次方程 \(x^{3}-x-2=0\) 的唯一实根,可通过1.521380直接求解器找到。
迭代次数与容差和括号宽度
每个二分步骤将区间对半,所以经过 \(n\) 次迭代后括号宽度为 \((b-a)/2^{\,n}\)。要达到根位置的容差 \(\text{tol}\),需要大约
$$n \approx \log_2\!\left(\frac{b-a}{\text{tol}}\right).$$计数仅随精度的对数增长,因此即使非常严格的容差也只需相对较少的步数。下表显示多种组合的四舍五入迭代次数。
| 初始宽度 \(b-a\) | 目标容差 | \(\log_2((b-a)/\text{tol})\) | 需要迭代 |
|---|---|---|---|
| 1 | \(10^{-3}\) | 9.97 | 10 |
| 1 | \(10^{-6}\) | 19.93 | 20 |
| 1 | \(10^{-10}\) | 33.22 | 34 |
| 10 | \(10^{-6}\) | 23.25 | 24 |
| 20 | \(10^{-6}\) | 24.25 | 25 |
| 100 | \(10^{-8}\) | 33.22 | 34 |
| 0.5 | \(10^{-12}\) | 38.86 | 39 |
例如,宽度为 20 的括号细化至 \(10^{-6}\) 需要 \(\lceil\log_2(20/10^{-6})\rceil=\lceil 24.25\rceil=\) 25 次迭代,宽度为 1 的括号至 \(10^{-10}\) 需要 \(\lceil 33.22\rceil=\) 34 次。减半初始宽度恰好节省一次迭代;精度平方(额外一位小数)成本约 3.3 次迭代。
关键术语
- 根。 函数为零的值 \(x^{*}\),其中 \(f(x^{*})=0\);也称为零点或方程的解。
- 括号/区间 \([a,b]\)。 一对被认为包围根的端点。对于二分法,它必须满足符号变化条件。
- 符号变化。 条件 \(f(a)\cdot f(b)<0\),表示 \(f\) 在两个端点处取相反的符号。对于连续的 \(f\),这保证至少有一个根在其间(中间值定理)。
- 中点。 当前区间的中心,\(m=(a+b)/2\);每步测试此点并舍弃不能包含根的一半。
- 容差。 停止迭代的精度目标,应用于区间宽度 \(|b-a|\) 或残差 \(|f(m)|\)。
- 收敛(线性)。 二分法收敛线性:误差在每步大致减半(误差 \(\le (b-a)/2^{n}\)),给出稳定但不加速的进展 — 每次迭代大约增加一位正确的二进制数字。
- 迭代。 一个完整循环:计算中点、计算函数值和更新端点。迭代次数受最大迭代设置限制。
常见问题
为什么会出现"无符号变化"的错误?二分法要求 \(f(a)\) 与 \(f(b)\) 异号。请调整 \(a\) 和 \(b\),使其分别位于根的两侧。
它能一次找到多个根吗?不能——它只返回区间内的一个根,也无法识别曲线只与坐标轴相切而不穿过的情形。
为什么它比牛顿法慢?二分法是线性收敛,每步约多得到一位二进制数字,而牛顿法是平方收敛。二分法常用来先求得一个稳妥的初始点,再交给收敛更快的方法进一步精化。