割线法模拟器 返回
数值分析模拟器

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

以 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)| \lt \varepsilon \quad \text{或} \quad |x_{n+1} - x_n| \lt \varepsilon$$

收敛判定。ε(容差)为 1e^−n(n 是容差滑块值)。

什么是割线法

一种求解方程 f(x)=0 根的数值解法,用过去两点 (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' 的函数(比如数值积分的结果、实验数据的插值函数)也能用割线法。一方面,收敛是"超线性",阶数是 φ≈1.618(黄金比)。牛顿法是二阶,理论上比割线法快。但实际上,每次迭代割线法只计算一次 f(牛顿法要计算 f 和 f',相当于两次),按计算量算的话,两个方法其实差不多。
🙋
模拟器里设 x_0=1, x_1=3,迭代7次就找到根了。如果改成 x_0=−2, x_1=−1 呢?
🎓
好问题。f(x)=x³−2x−5 只有一个实根 x≈2.0946,在右半边。如果从左边(x<0)出发,割线指向右上方,可能跳过根,或者在别的地方乱转。这就是"割线法是局部收敛"的问题。实现上,一个安全的做法是选初始两点让它们夹住根,也就是 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)就是把"从过去信息推测雅可比"的想法扩展到多维,ANSYS、Abaqus 的非线性结构分析就靠它来避免每步都重新组装刚度矩阵。

物理模型与主要公式

割线法是从牛顿-拉夫逊法 x_{n+1}=x_n−f(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 轴的交点是下一个估计值。

收敛阶(误差 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 或 ∇f(x)=0 时,每次组装雅可比或海森矩阵代价太高。Broyden 法(求根用)和 BFGS、L-BFGS(优化用)都是从过去的更新渐近近似 J⁻¹ 或 H⁻¹。这就是一维割线法的自然多维推广。

Brent 法(通用求根):scipy.optimize.brentq、MATLAB 的 fzero、Boost 库的 brent_find_minima 等现代通用求根函数默认都用 Brent 法。它结合了二分法的确定性和割线法、逆二次插值的快速性,输入夹住根的区间就保证收敛。

非线性结构分析(改进牛顿法):Abaqus、ANSYS 的非线性有限元分析中,刚度矩阵 K=∂R/∂u 的组装和 LU 分解是计算瓶颈。"改进牛顿法"会把 K 在好几个时间步内重复使用,内部动作接近割线法。BFGS 修正法也广泛使用。

金融工程·隐含波动率:从 Black-Scholes 公式反推市场价格对应的波动率 σ 时,想避免解析计算 ∂C/∂σ(Vega),割线法就是首选。许多交易系统内部每秒要运行几千次这样的循环。

常见误区与注意点

最常见的误解是 "割线法是牛顿法的低配版"。确实收敛阶 1.618 vs 2,割线法更慢。但考虑每次迭代的函数计算次数,割线法的实际收敛速率 ≈ φ ≈ 1.618,牛顿法(f 和 f' 分别计算)≈ √2 ≈ 1.414,反而割线法更快!如果 f 的计算代价等于甚至超过 f',选割线法完全有理由。

其次是 "两个初始点一定要夹住根" 的草率结论。割线法不要求 f(x_0)·f(x_1)<0(根被夹住)。但不夹的话,割线很容易指向根之外的地方,产生不稳定的行为。试试模拟器里设 x_0=−2, x_1=−1(都在左边),都是 f<0,割线从下方指向右上,立刻就会跳到远处。安全的做法是二分法先夹住,再用割线法,这就是 Brent 法。

最后是 分母 f(x_n)−f(x_{n−1}) 的零除问题。如果连续两点的 f 值几乎相等,分母接近0,更新量会爆炸。实现上要检查分母绝对值是否小于阈值(如 1e−14),小于就停止迭代,或者重置两点。CAE 的准牛顿法也有类似的"重启"机制,防止雅可比近似退化。

常见问题

割线法是牛顿法 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})。不需要解析导数或数值微分,只靠 f 的求值。收敛是超线性(阶数 φ≈1.618),比牛顿法(二阶)略慢。但计算量上,每次迭代割线法只算一次 f,牛顿法要算 f 和 f',两相比较其实割线法不一定慢。
二分法需要 f(a)·f(b)<0 的区间 [a,b],保证收敛,收敛是线性的(阶数1,误差每次折半)。割线法需要两个初始点,但不要求夹住根,收敛是超线性(阶数 φ≈1.618),更快。缺点是有发散风险。把两者结合起来就是 Brent 法(scipy.optimize.brentq 内部算法),既确保收敛,又保证速度。
可以。一维割线法的多维扩展叫"Broyden 法",用来求解 F(x)=0,雅可比矩阵 J 从过去的更新渐近近似。在优化问题(∇f(x)=0)上,近似海森矩阵 H 的 BFGS、L-BFGS 法是同样的思路,广泛用在 Adam 优化器和 SciPy 的 minimize 函数中。
分母的绝对值接近机器精度(约 2.2e−16)的阈值时,标准实现会停止迭代,返回"收敛失败"。或者把两个点重新设置到别的位置再试,或者切换到二分法作为后备。这个模拟器的实现中,如果 |f(x_n)−f(x_{n−1})| < 1e−14 就会停止。

使用指南

  1. 用滑块设定初始点 x₀ 和 x₁。例如 x₀=2.0, x₁=2.5,这样在根两侧配置,收敛会比较稳定
  2. 设定容差(指数)slTolExp。-6 表示 10⁻⁶ 精度停止,-10 表示 10⁻¹⁰ 高精度计算
  3. 设定最大迭代次数 slMaxIter(默认50),点击"执行",割线法开始搜索 x³−2x−5=0 的根,每步的函数值和下一个近似值实时显示

具体计算例

方程 f(x)=x³−2x−5,设 x₀=2.0, x₁=2.5,容差 10⁻⁶:第1次迭代,f(2.0)=-1, f(2.5)=6.625,割线方程 y=5.07x−11.14,得 x₂≈2.094;之后 f(2.094)≈0.214 → f(2.055)≈0.013 → f(2.0946)≈0.00002 快速趋向0,约6次迭代收敛到根 x≈2.0946。欧拉梁固有频率计算(E=210 GPa, I=1.2×10⁻⁵ m⁴, m=50 kg/m, L=3.0 m)也会产生同型非线性方程,无需导数的割线法很有效。

实务注意事项

  1. 初始点离根太远会发散。画出 f(x) 的图像,选择 f 符号反转区域来放置 x₀, x₁
  2. 容差设得过小(-15 以下)会出现浮点舍入误差,之后精度反而下降。实务推荐 -8~-10
  3. 超线性收敛(阶数≈1.618)比牛顿法(阶数2)慢,但多变量时免于计算雅可比能节省计算量