3.2 收敛失败现场与全局策略


3.2 收敛失败现场与全局策略

本节摘要:牛顿法在收敛域外有四种典型事故:导数近零导致一步飞出、初值出域导致发散、多根场景收敛到"错误的根"、迭代进入循环。现代求解器用混合策略(二分兜底)、阻尼步长、信赖域三重保险丝治理这些问题。本节逐一复现事故并解剖 SciPy 求解器的保险设计。

一、事故图谱:四种翻车现场

现场一:导数近零,一步飞天

import numpy as np f = lambda x: x**3 - 1 df = lambda x: 3*x**2 x = 0.5 # 距离根 x=1 不远,但路径经过平坦区 for k in range(5): print(f"step {k}: x = {x:.6e}") d = df(x) if abs(d) < 1e-12: print("导数消失,除法爆炸"); break x = x - f(x) / d # x 在 0.5 与 -1 之间来回横跳,迟迟不进

病理:迭代路径经过 x=0 附近时分母趋零,步长 -f/f' 失控。牛顿步对"除以小导数"毫无防御。症状识别:迭代序列出现绝对值突然暴增再折返的"甩鞭"轨迹。

现场二:初值出收敛球

import numpy as np f = lambda x: np.arctan(x) df = lambda x: 1 / (1 + x**2) x = 2.0 # arctan 的牛顿收敛域约为 |x| < 1.39 for k in range(8): x = x - f(x) / df(x) print(f"step {k}: x = {x:.4e}") # 值单调爆走,inf 之后变成 nan

病理:arctan 有界而导数随|x|衰减,大初值下牛顿步把 x 推得更远,恶性循环。这是教科书级反例——被解函数性质温和(光滑、有根)不等于迭代收敛。收敛域是一个以根为中心、边界由函数形状决定的有限球,初值必须在球内。

现场三:多根场景认错人

\sin x = 0$$ 从不同初值出发,收敛到 0、π、2π……哪个根完全由初值"势力范围"决定。电路工作点分析里这对应**收敛到非物理解**:数学上合法、工程上错误。这不是算法 bug,但需要工程师知道"我拿到的是哪一个根、还有没有别的根",标准做法是多初值扫描后聚类结果。 ### 现场四:完美循环 构造 $f$ 使迭代满足 $x_3 = x_1$,序列在两个值之间永久振荡,残差永不归零也不发散。症状是相邻两步残差几乎相同——发现这种"心电图变直线"就该立即停机换策略。 ## 二、保险丝一:二分兜底的混合策略 二分法慢(每步只赚半个比特)但**绝对收敛**——只要区间两端函数值异号。Brent 方法(SciPy 的默认求根器)把两者焊接:用二分保证全局安全,用逆二次插值提供超线性速度,危险时退回二分: ```python from scipy.optimize import brentq, newton import numpy as np f = lambda x: np.arctan(x) r_brent = brentq(f, -10, 10) # 区间法:合同保证收敛 r_newton = newton(f, 2.0) # 纯牛顿:这个初值下会发散 print(f"brentq: {r_brent:.12f}") # 0.0,正确 # print(r_newton) # 不可靠,可能抛错或返回垃圾 r_hybrid = newton(f, 2.0, x1=1.9) # 割线模式也救不了这个初值 ``` **判决**:知道根所在区间时,`brentq` 是默认答案;只知道单点初值时,SciPy 的 `newton` 支持指定安全区间,或在多初值上重试。**速度靠插值、安全靠二分**,是混合策略的设计母题。 ## 三、保险丝二:阻尼与信赖域 把牛顿的全步长乘一个小于 1 的因子 λ(阻尼牛顿),牺牲近期速度换取稳定;信赖域则反过来说话:**先承诺只信半径 Δ 内的局部模型**,如果实际下降符合预测就扩信任半径,不符就缩。这把"步子多大"从固定公式变成自适应协议: ### 图 3.2-1 信赖域自适应协议示意 ![图 3.2-1 信赖域自适应协议示意](https://aiknowledge.cn/images/%E8%AE%A1%E7%AE%97%E6%95%B0%E5%AD%A6/03-02-fig01.png) ```python from scipy.optimize import minimize import numpy as np # 经典试探函数:朴素牛顿类方法容易在山谷里翻车 rosen = lambda z: (1 - z[0])**2 + 100 * (z[1] - z[0]**2)**2 res = minimize(rosen, x0=[-1.2, 1.0], method='trust-exact', options={'gtol': 1e-10}) print(res.x, res.nit) # 收敛到 [1, 1],迭代数温和 ``` ## 四、结案:给求根问题写一份标准办案流程 1. **画图或扫描**:先在粗网格上找函数变号区间,锁定根的势力范围(多根场景同时暴露) 2. **能区间则区间**:有变号区间优先 `brentq`,合同保证收敛 3. **单点初值用混合法**:`newton` 带安全选项,或自己套多初值重试 4. **监控三类信号**:残差横盘(循环)、步长爆增(导数消失)、达到上限(初值出域) 5. **多根问题聚类报告**:所有初值解出来的根做聚类,列出全部候选及其残差 > ⚠️ 常见坑:拿二分法解偶数重根(函数触碰零轴但不穿越,如 x 平方)。区间端点不变号,二分直接失效——这类根用最小化 |f| 或专门的重根算法处理。 再补一份实操心得:排查非线性求解问题时,把迭代轨迹完整记录下来(每步的 x、f、f')远比只看最终返回值有用。多数"玄学失败"在轨迹图上一目了然——甩鞭、横盘、循环各有各的形状。养成这个习惯后,你会发现教科书里那些收敛定理不再是抽象条件,而是轨迹形状背后的分类学。 ## 本节要点回顾 - **四种事故**:导数近零甩鞭、初值出域爆走、多根认错人、二点循环,各有可识别的症状 - **收敛域是硬边界**:函数温和不保平安,初值必须在以根为中心的收敛球内 - **混合策略母题**:二分/信赖域保全局,插值/牛顿保速度,成熟求解器全是焊接件 - **信赖域哲学**:步长上限由"预测命中率"动态调,远则稳、近则快 - **多根报告制**:工程求根的交付物是根的清单加各自势力范围,不是单个数 下一节把镜头转向优化:求根的镜像问题,梯度下降的锯齿病与条件数在此正式会师。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U