割线法模拟器 返回
数值方法模拟器

割线法模拟器 — 无导数的求根

以 f(x)=x³−2x−5 为例,实时可视化割线法 x_{n+1}=x_n−f(x_n)·(x_n−x_{n−1})/(f(x_n)−f(x_{n−1})) 的收敛过程:割线步进与对数误差曲线,无需导数,两个初值与容差均可调。

参数
初值 x_01.00
初值 x_13.00
最大迭代次数30
容差 1e^−n6
计算结果
收敛的根
迭代次数
最终 |f(x)|
收敛状态
函数曲线与割线(f(x)=x³−2x−5)
误差 |f(x_n)| 的收敛曲线(log10)
理论与主要公式

$$x_{n+1} = x_n - f(x_n)\,\frac{x_n - x_{n-1}}{f(x_n) - f(x_{n-1})}$$

割线法迭代公式。把牛顿-拉夫森法中的导数 f'(x) 替换为有限差分商所得。

$$f(x) = x^{3} - 2x - 5$$

测试函数(牛顿当年的原例题)。实根 x ≈ 2.094551482。

$$|e_{n+1}| \approx C\,|e_{n}|^{\varphi}, \quad \varphi = \frac{1+\sqrt{5}}{2} \approx 1.618$$

超线性收敛(收敛阶为黄金比 φ)。略慢于牛顿法的二阶,但无需评估导数。

$$|f(x_n)| < \varepsilon \quad \text{或} \quad |x_{n+1} - x_n| < \varepsilon$$

收敛判据。容差 ε = 1e^−n,n 为容差滑块的值。

什么是割线法

用过去两个迭代点 (x_{n−1}, f(x_{n−1})) 与 (x_n, f(x_n)) 连成的"割线"与 x 轴的交点作为下一估计的迭代算法。它就是牛顿-拉夫森法去掉导数后的版本,是最简单的"无导数求根法"。

🙋
牛顿法和割线法看公式几乎一样,到底什么时候该用哪个?
🎓
本质相同——割线法就是把牛顿法的 f'(x_n) 换成由过去两个评估值构造的斜率 (f(x_n)−f(x_{n−1}))/(x_n−x_{n−1})。所以当 f'(x) 难以解析得到(实验数据插值、复杂数值积分等)或代价昂贵时,割线法非常适合。收敛是超线性的,阶为 φ≈1.618(黄金比),比牛顿法的二阶慢一点,但每次迭代只算 1 次 f(牛顿法要算 f 与 f' 两次),按函数调用次数折算,两者旗鼓相当。
🙋
把 x_0=1, x_1=3 时七步就收敛了,但换成 x_0=−2, x_1=−1 就飞到奇怪的方向。为什么?
🎓
观察得很准。多项式 f(x)=x³−2x−5 只有一个实根 x≈2.0946。两个初值都取负值时 f(x_0)、f(x_1) 都是负的,割线斜向上很陡,与 x 轴的交点会远远落在正方向——典型的过冲。这就是局部收敛的代价。比较稳的做法是让 f(x_0)·f(x_1)<0(两个初值夹住根);更保险地,使用 Brent 法(scipy.optimize.brentq)把二分法的安全性与割线法的速度结合起来。
🙋
把容差降到 1e^−12,迭代次数会爆炸吗?你说割线法比牛顿法慢嘛。
🎓
出乎意料地便宜。超线性阶 φ≈1.618 已经很强:从 1e^−6 到 1e^−12 通常只多 2〜3 次迭代(牛顿法多 1〜2 次)。在 CAE 里,割线法的多维表亲——准牛顿法(Broyden、BFGS、L-BFGS)——正是 Abaqus、ANSYS 在非线性 FEA 里避免每一步都重新装配切线刚度矩阵的关键。

物理模型与主要公式

割线法把牛顿-拉夫森法 x_{n+1}=x_n−f(x_n)/f'(x_n) 中的导数,用过去两个迭代点的有限差分斜率近似。

$$f'(x_n) \approx \frac{f(x_n) - f(x_{n-1})}{x_n - x_{n-1}}$$

代入并整理,得到割线法的更新公式:

$$x_{n+1} = x_n - f(x_n)\,\frac{x_n - x_{n-1}}{f(x_n) - f(x_{n-1})}$$

几何上,过 (x_{n−1}, f(x_{n−1})) 与 (x_n, f(x_n)) 的直线(割线)与 x 轴的交点即为 x_{n+1}。

收敛速率(误差 e_n = x_n − x*):

$$|e_{n+1}| \approx \left|\frac{f''(x^{*})}{2f'(x^{*})}\right|\,|e_{n}|\,|e_{n-1}|, \quad \text{阶} = \varphi = \frac{1+\sqrt{5}}{2} \approx 1.618$$

"黄金比"自然地出现——这就是超线性收敛(快于线性、慢于二阶)的标志。

实际应用

准牛顿优化(CAE):多维 F(x)=0 或 grad f(x)=0 问题中,组装 Jacobian 或 Hessian 代价昂贵。Broyden 法(求根)与 BFGS / L-BFGS(优化)从历次更新中渐近近似 J⁻¹ 或 H⁻¹,正是 1 维割线法的多维推广。

Brent 法(通用一维求根):scipy.optimize.brentq、MATLAB 的 fzero、Boost 的 brent_find_minima 默认都使用 Brent 法,把二分法的稳健性与割线法、逆二次插值的速度结合在一起。

非线性 FEA 中的修正牛顿法:Abaqus、ANSYS 在多个荷载步内复用同一切线刚度 K=∂R/∂u,以分摊 LU 分解的代价;此时平衡迭代在内部表现为类似割线法的更新。BFGS 修正在隐式非线性求解器中也被广泛使用。

金融工程中的隐含波动率:从市场价格反求 Black-Scholes 的波动率 σ 时,为了避免解析计算 ∂C/∂σ(Vega),常用割线法迭代。许多交易系统每秒会重复执行这一循环数千次。

常见误解与注意事项

最大的误区是"割线法只是牛顿法的劣化版"。虽然收敛阶为 1.618 vs 2,但按"每次函数评估"折算,割线法的有效收敛率约为 φ≈1.618,牛顿法约为 √2≈1.414(在 f 与 f' 分别评估的情况下)——所以从墙钟时间看,割线法甚至更快。如果 f' 的评估成本与 f 相当,割线法理由充足。

第二,"两个初值必须夹住根"是错的。割线法不要求 f(x_0)·f(x_1)<0。但若不夹根,割线很容易跨过根飞出去。把模拟器设成 x_0=−2, x_1=−1 就能看到:两个 f 值都为负,割线斜向上,下一步立刻冲到右边很远。安全做法是先用二分法夹根,再切到割线法——这就是 Brent 法的思想。

第三,留意分母 f(x_n)−f(x_{n−1}) 的零除。当连续两点的函数值几乎相同时,分母趋于 0,更新量爆炸。鲁棒实现会在 |f(x_n)−f(x_{n−1})| 低于某阈值(如 1e−14)时终止迭代,或从新点重启。CAE 中的准牛顿法在 Jacobian 近似失效时也内置类似的"重启"机制。

常见问题

割线法把牛顿法 x_{n+1}=x_n−f(x_n)/f'(x_n) 中的解析导数 f'(x_n) 替换为由过去两个迭代点构造的有限差分商 (f(x_n)−f(x_{n−1}))/(x_n−x_{n−1}),无需解析或数值微分,仅用函数评估即可推进。收敛是超线性的,阶为 φ≈1.618,略慢于牛顿法的二阶,但每次迭代只需 1 次 f,所以按函数调用折算两者效率相当。
二分法要求初始区间满足 f(a)·f(b)<0,线性收敛(误差每次减半),慢但绝对安全。割线法需要两个初值但不要求夹根,超线性收敛(阶 φ≈1.618),快但不保证收敛。Brent 法把两者结合起来兼顾稳健与速度——scipy.optimize.brentq 内部正是用 Brent 法实现的。
可以。多维推广就是 Broyden 法,使用秩一更新从历次迭代中近似 F(x)=0 的 Jacobian J。优化问题(grad f(x)=0)有对应的 BFGS、L-BFGS 法,近似 Hessian H。两者都是 scipy.optimize.minimize 的常用算法,也是深度学习二阶优化器的核心。
当分母绝对值降到接近机器精度(约 2.2e−16)时,标准做法是终止迭代并报告失败,或者从两个新点重启,或者切换到二分法。本模拟器在 |f(x_n)−f(x_{n−1})| < 1e−14 时停止迭代。