跳到主要内容

二分法

一、直观理解:在变号区间里反复对半查找​

二分法(bisection)用于求解一维连续函数的根 f(x)=0f(x)=0。若在区间 [a,b][a,b] 上 f(a)f(b)<0f(a)f(b)<0,由介值定理至少存在一个根。每次取中点 mm,根据 f(m)f(m) 的符号舍弃不含根的一半,直到区间足够短。

它像在字典里对半翻页找词:慢而稳,不要求导数,对病态函数也往往可靠。

二、适用场景与优缺点​

类型说明
适用场景能找到变号括号区间;只需一维根;强调可靠性胜过速度;作为牛顿法失败时的兜底。
核心优点全局收敛(在连续+变号条件下);实现极简;误差上界明确:每步区间减半。
局限与缺点只要一维;需先找括号;收敛线性偏慢;偶根/不变号的根可能抓不到;多根时只保证找到其中一个。

三、核心原理与误差​

迭代:

m=a+b2,{b←m,f(a)f(m)≤0a←m,otherwisem=\frac{a+b}{2},\quad \begin{cases} b\leftarrow m,& f(a)f(m)\le 0\\ a\leftarrow m,& \text{otherwise} \end{cases}

kk 步后区间长度 (b0−a0)/2k(b_0-a_0)/2^k,故

∣xk−x∗∣≤b0−a02k+1|x_k-x^*|\le \frac{b_0-a_0}{2^{k+1}}

达到精度 ε\varepsilon 约需 k≈log⁡2((b0−a0)/ε)k\approx\log_2((b_0-a_0)/\varepsilon) 次迭代。

四、实践要点​

  1. 先画图或扫描找变号;
  2. 处理 f(m)=0f(m)=0 直接返回;
  3. 注意浮点下 f(a)f(b)f(a)f(b) 可能下溢,可用符号比较;
  4. 与 fzero 对照(MATLAB 的 fzero 更复杂,含 secant 等)。

五、MATLAB 示例​

%% 二分法求 f(x)=x^3-x-1=0 在 [1,2]
f = @(x) x.^3 - x - 1;
a = 1; b = 2;
tol = 1e-10;
maxIt = 100;
hist = [];

assert(f(a)*f(b) < 0, "端点必须变号");

for k = 1:maxIt
m = 0.5*(a+b);
hist(end+1,:) = [a b m f(m)]; %#ok<AGROW>
if abs(f(m)) < tol || (b-a)/2 < tol
root = m; break;
end
if f(a)*f(m) < 0
b = m;
else
a = m;
end
end

fprintf("根 ≈ %.12f, f(root) = %.3e, 迭代 = %d\n", root, f(root), k);
fprintf("fzero 对照 = %.12f\n", fzero(f, [1 2]));

figure;
semilogy(abs(hist(:,4)), "-o");
xlabel("迭代"); ylabel("|f(m)|");
title("二分法函数值下降"); grid on;

六、如何解释结果​

报告括号区间、容差、迭代次数、根与 f(root)f(\mathrm{root})。说明是否可能还有其他根,以及区间选择依据。

七、常见误区​

1. 端点不变号仍二分​

算法前提不成立。

2. 把慢当成失败​

线性收敛在工程容差下通常足够。

3. 不检查 ff 在区间内是否连续​

间断点会造成假变号。

4. 多根问题只报一个根当全部​

应结合图形扫描。

附:建模流程中的落地清单(二分法)​

在竞赛或课程论文中,仅写出定义式往往不够。建议按下列顺序组织材料,既能保证可复现,也便于评委快速抓住贡献。

1. 问题对齐​

先用两三句话说明:题目中的哪个子问题对应本方法,输入是什么,输出要支持什么决策。避免“因为常见所以使用”。若存在更简单的替代方法,应说明为何不够用。

2. 符号与单位​

列出核心符号表,强调单位一致。许多错误并非算法失败,而是日/年、米/千米、概率/百分比混用。对无量纲参数,说明取值来源(估计、文献、情景设定)。

3. 关键公式回顾​

介值定理保证变号区间内存在根;误差上界每步减半,属于线性收敛但极稳健。

4. 计算与实现要点​

  • 固定随机种子(若涉及随机);
  • 记录中间量以便手算核对小例子;
  • 用极限情形或解析特例做冒烟测试;
  • 保存主要输入输出到表格,便于敏感性分析复用。

5. 补充 MATLAB 片段​

f=@(x)x^3-2; a=0;b=2; while (b-a)>1e-10, m=(a+b)/2; if f(a)*f(m)<=0,b=m;else,a=m;end, end; fprintf('%.12f\n', (a+b)/2);

6. 结果报告模板​

建议至少报告:括号区间、迭代次数、根、函数值残差、是否可能存在其他根。

7. 何时不该使用​

端点不变号硬套二分;或把偶重根(不变号)的失败归咎于程序。

完成以上清单后,再进入“小结”中的一句话金句,通常论文的方法段与验证段就会扎实许多。

附:结果解读示例与常见审稿问题​

结果解读示例​

假设已经得到主要数值输出。写作时应把数字翻译回题目语言,例如:

  • “在基准参数下指标为 A;当关键参数变化 ±10% 时,指标波动约 B%,方案排序未变。”
  • “算法在 R 次独立重复中有 S 次收敛到同一结构解,说明结论对初始化不敏感。”
  • “与简化基线相比,本方法在验证集误差降低 Δ,但计算时间增加,权衡后仍采用。”

如果只有表格没有句子,评委很难判断你是否真正理解结果。

参数与数据的最小敏感性​

即使篇幅有限,也建议给出一个小表:选取 1–3 个最关键参数,各取偏低/基准/偏高三档,报告输出变化。这比大段空泛的“模型具有较强鲁棒性”更有说服力。

可复现信息​

在附录或正文脚注中记录:软件版本、随机种子、关键容差、数据截取时间范围。另一人按文档应能得到同量级结果。

审稿式自问​

  1. 方法假设在题目数据上是否可检查?
  2. 若最敏感参数估计错误 20%,结论是否翻盘?
  3. 是否存在更简单方法达到相近效果?
  4. 图表是否都能用一句话概括?
  5. 局限是否写得具体,而不是套话?

把上述自问的答案写进论文,方法章节会明显更“像完成了建模”,而不是“像完成了公式摘录”。

八、小结​

二分法在变号区间上通过对分可靠地逼近一维根,误差界限清晰,是最稳健的基线求根法。速度不是它的强项,但在建模中“先保证找得到”往往比“快”更重要。