通过MCP连接 →

输入计算

请以 x 作为变量。可用函数:sin、cos、tan、asin、acos、atan、exp、ln、log、sqrt、abs。常数:pi、e。运算符:+ - * / ^。
Choose a, b so that f(a)·f(b) ≤ 0 (the root must be bracketed).

数学公式

广告

结果

x (root) where f(x) ≈ 0
0.7390851332151449
f(x) = 0 的近似解
根处的 f(x) 值 -0.0000000000000263
实际迭代次数 50
方法 二分法(区间对半)

什么是二分法?

二分法是求连续函数 \(f(x)\) 根(即满足 \(f(x) = 0\) 的 \(x\) 值)最古老、最可靠的方法之一。它先选定一个使函数符号发生改变的区间 \([a, b]\),然后不断把区间对半切分,每次保留仍然"夹住"根的那一半。由于每一步都保持着符号变化,只要 \(f\) 连续且 \(f(a)\) 与 \(f(b)\) 异号,这种方法就必定收敛。本计算器适用于任意无量纲实函数,三角运算采用弧度制。

在点 a 与 b 之间穿过 x 轴的连续曲线,并标出中点
二分法在 \(f(a)\) 与 \(f(b)\) 异号的区间内框定根。

如何使用本计算器

f(x) 输入框中以 \(x\) 为变量填写函数(例如 x-cos(x)x^2-2exp(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)\) 符号相反,则根必定位于它们之间。

  1. 验证括号区间。 确认 \(f(a)\cdot f(b)<0\)。如果乘积为正,则区间不保证包含根 — 选择不同的 \([a,b]\)。
  2. 计算中点。 \(m=\dfrac{a+b}{2}\)。
  3. 计算函数值。 求得 \(f(m)\)。如果 \(f(m)=0\)(或在容差范围内),则 \(m\) 是根并停止。
  4. 按符号替换端点。 如果 \(f(a)\cdot f(m)<0\),根在 \([a,m]\) 内,设 \(b\leftarrow m\)。否则根在 \([m,b]\) 内,设 \(a\leftarrow m\)。
  5. 重复步骤 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\),使其分别位于根的两侧。

它能一次找到多个根吗?不能——它只返回区间内的一个根,也无法识别曲线只与坐标轴相切而不穿过的情形。

为什么它比牛顿法慢?二分法是线性收敛,每步约多得到一位二进制数字,而牛顿法是平方收敛。二分法常用来先求得一个稳妥的初始点,再交给收敛更快的方法进一步精化。

最后更新: