跳到主要内容

割线法

一、直观理解:用割线代替切线​

割线法(secant method)与牛顿法目标相同,但不用解析导数,而用最近两点的差商近似 f′f':

xk+1=xk−f(xk)xk−xk−1f(xk)−f(xk−1)x_{k+1}=x_k-f(x_k)\frac{x_k-x_{k-1}}{f(x_k)-f(x_{k-1})}

几何上,过 (xk−1,f(xk−1))(x_{k-1},f(x_{k-1})) 与 (xk,f(xk))(x_k,f(x_k)) 的割线与横轴交点成为新近似。它保留了超线性收敛的速度,又避免手写导数,是许多黑盒求根程序的核心组件之一。

二、适用场景与优缺点​

类型说明
适用场景ff 可计算但 f′f' 难求或昂贵;一维求根;希望比二分更快。
核心优点无需导数;收敛阶约 1.6181.618(黄金比),快于线性;实现简单。
局限与缺点需要两个初值;无括号时可能失去全局保证;接近重根或 ff 值相近时不稳;可能发散。

三、核心原理​

差商

f′(xk)≈f(xk)−f(xk−1)xk−xk−1f'(x_k)\approx\frac{f(x_k)-f(x_{k-1})}{x_k-x_{k-1}}

代入牛顿公式即得割线迭代。收敛阶 φ=(1+5)/2\varphi=(1+\sqrt5)/2。

与相关方法​

  • 试位法(regula falsi):在变号括号内用割线,更稳但可能一侧端点停滞;
  • MATLAB fzero:结合二分、割线与逆二次插值。

四、实践要点​

  1. 两初值不要让 ff 几乎相等;
  2. 监控分母与步长;
  3. 可与二分混合保证括号;
  4. 达到最大迭代仍不收敛要换初值。

五、MATLAB 示例​

%% 割线法: f(x)=e^{-x}-x
f = @(x) exp(-x) - x;
x0 = 0; x1 = 1;
tol = 1e-12;
histx = [x0; x1];

for k = 1:50
f0 = f(x0); f1 = f(x1);
if abs(f1 - f0) < 1e-16
error("差商分母过小");
end
x2 = x1 - f1 * (x1 - x0) / (f1 - f0);
histx(end+1,1) = x2; %#ok<AGROW>
if abs(x2 - x1) < tol && abs(f(x2)) < tol
break;
end
x0 = x1; x1 = x2;
end

fprintf("割线法根 = %.12f, 迭代=%d, f=%.3e\n", x1, k, f(x1));
fprintf("牛顿对照(数值导)可用 fzero = %.12f\n", fzero(f, 0.5));

figure;
semilogy(abs(f(histx)), "-o");
xlabel("k"); ylabel("|f(x_k)|");
title("割线法收敛"); grid on;

与二分比较迭代次数:

f = @(x) x.^3 - 2;
% 二分
a=0;b=2; nb=0;
while (b-a)/2 > 1e-10
m=0.5*(a+b); nb=nb+1;
if f(a)*f(m)<=0, b=m; else, a=m; end
end
% 割线
x0=0;x1=2; ns=0;
for k=1:100
x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0)); ns=ns+1;
if abs(x2-x1)<1e-10, break; end
x0=x1; x1=x2;
end
fprintf("达到约 1e-10: 二分 %d 步, 割线 %d 步\n", nb, ns);

六、如何解释结果​

报告两个初值、迭代史、∣f∣|f| 与方法选择理由(为何不用牛顿/二分)。若与 fzero 一致,可增强可信度。

七、常见误区​

1. 当全局可靠算法​

没有括号保护时可能跑飞。

2. 初值间隔极大且函数非单调​

割线可能跳到无关区域。

3. 与“弦截法”名词混用但不懂括号​

不同教材对 secant/regula falsi 命名不一,写清公式最重要。

4. 不处理 f(xk)≈f(xk−1)f(x_k)\approx f(x_{k-1})​

导致巨大步长。

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

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

1. 问题对齐​

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

2. 符号与单位​

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

3. 关键公式回顾​

用差商替代解析导数,收敛阶约 1.6181.618。需要两个初值,且缺少括号时可能不稳定。

4. 计算与实现要点​

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

5. 补充 MATLAB 片段​

f=@(x)cos(x)-x; x0=0;x1=1; for k=1:30, x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0)); if abs(x2-x1)<1e-12, break; end; x0=x1;x1=x2; end; disp(x1);

6. 结果报告模板​

建议至少报告:两初值、迭代次数、残差、与二分/牛顿的对照。

7. 何时不该使用​

初值使 f(xk)≈f(xk−1)f(x_k)\approx f(x_{k-1}) 导致步长爆炸却无处理。

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

八、小结​

割线法用差商近似牛顿法中的导数,在无需解析导数的一维求根中兼顾速度与简便。它比二分快,但稳健性较弱;实践中常与括号策略或库函数 fzero 结合使用。