跳转至

一维搜索方法

本页讨论一元函数 \(f: \mathbb{R} \to \mathbb{R}\) 极小化的迭代求解方法(统称一维搜索或线搜索)。它的意义是双重的:既是最简单的优化问题,又是多维算法的子程序——梯度方法、牛顿法每一步沿搜索方向确定步长,本质上都在解一个一维问题。

核心结论速览

方法 使用的信息 需要的初始条件 区间压缩比 / 收敛特点
黄金分割法 仅函数值 \(f\) 单峰 + 初始区间 每步 \(0.618\),\(N\) 步共 \(0.618^N\)
斐波那契数列法 仅函数值 \(f\) 单峰 + 初始区间 \(N\) 步共 \(\dfrac{1 + 2\varepsilon}{F_{N+1}}\),同评估次数下最优
二分法 一阶导数 \(f'\) 单峰、\(f \in \mathcal{C}^1\) + 初始区间 每步 \(1/2\),\(N\) 步共 \((1/2)^N\)
牛顿法 \(f'\) 和 \(f''\) 一个初始点(须离极小点足够近,\(f'' > 0\)) 收敛快(二阶),但可能失效
割线法 仅 \(f'\) 两个初始点 用差商代替 \(f''\) 的牛顿法
划界法 仅函数值 \(f\) — 为上述区间法寻找初始区间

多维算法中的步长通常不精确求解,用 Armijo / Goldstein / Wolfe 条件保证"步长不太大也不太小"即可。

问题与方法总览

一维搜索从初始点(或初始区间)出发,产生迭代序列 \(x^{(1)}, x^{(2)}, \dots\) 逼近极小点。按每步用到的信息分类:只用函数值(黄金分割、斐波那契)、用一阶导数(二分、割线)、用一二阶导数(牛顿)。

区间压缩类方法的共同前提是 \(f\) 在初始区间 \([a_0, b_0]\) 上单峰:存在唯一的局部极小点。单峰性保证"比较两个内点的函数值"足以判断极小点落在哪一侧。

黄金分割法

思想:在当前区间 \([a_k, b_k]\) 内对称地取两个试探点

\[ a_{k+1} - a_k = b_k - b_{k+1} = \rho\, (b_k - a_k), \qquad \rho < \tfrac{1}{2} \]

比较函数值:若 \(f(a_{k+1}) < f(b_{k+1})\),极小点必在 \([a_k, b_{k+1}]\) 内;反之在 \([a_{k+1}, b_k]\) 内。每步把区间压缩为原来的 \(1 - \rho\) 倍。

\(\rho\) 的取值从何而来:希望压缩后"旧试探点恰好可以充当新区间的一个试探点",这样每步只需新算一次函数值。设区间长为 1,该复用条件为 \(\rho(1 - \rho) = 1 - 2\rho\),即

\[ \rho^2 - 3\rho + 1 = 0 \implies \rho = \frac{3 - \sqrt{5}}{2} \approx 0.382, \qquad 1 - \rho = \frac{\sqrt{5} - 1}{2} \approx 0.618 \]

此时 \(\dfrac{\rho}{1 - \rho} = \dfrac{1 - \rho}{1}\)——短段与长段之比等于长段与全长之比,正是黄金分割。

算法步骤(黄金分割法)

给定单峰区间 \([a_0, b_0]\) 与精度要求:

  1. 由 \(0.618^N (b_0 - a_0) \le\) 目标长度,确定迭代次数 \(N\);
  2. 每步取试探点 \(a' = a + 0.382\,(b - a)\),\(b' = b - 0.382\,(b - a)\)(其中一个继承自上一步,只需新算一个);
  3. \(f(a') < f(b')\) → 新区间 \([a, b']\);否则 → 新区间 \([a', b]\);
  4. 重复 \(N\) 次,输出最终区间。

例:黄金分割法压缩区间

用黄金分割法求 \(f(x) = x^4 - 14x^3 + 60x^2 - 70x\) 在 \([0, 2]\) 上的极小点所在区间,要求长度压缩到 \(0.3\) 之内。

解答

确定迭代次数:\(2 \times 0.618^N \le 0.3 \Rightarrow N \ge 3.94\),取 \(N = 4\)。

\(k\) 当前区间 试探点与函数值 比较 新区间
1 \([0, 2]\) \(a_1 = 0.764,\ f = -24.36\);\(b_1 = 1.236,\ f = -18.96\) \(f(a_1) < f(b_1)\) \([0, 1.236]\)
2 \([0, 1.236]\) 新点 \(a_2 = 0.472,\ f = -21.10\);复用 \(b_2 = a_1 = 0.764\) \(f(a_2) > f(b_2)\) \([0.472, 1.236]\)
3 \([0.472, 1.236]\) 复用 \(a_3 = 0.764\);新点 \(b_3 = 0.944,\ f = -23.59\) \(f(a_3) < f(b_3)\) \([0.472, 0.944]\)
4 \([0.472, 0.944]\) 新点 \(a_4 = 0.652,\ f = -23.84\);复用 \(b_4 = 0.764\) \(f(a_4) > f(b_4)\) \([0.652, 0.944]\)

最终区间长度 \(0.292 < 0.3\),满足要求(第 1 步算两次函数值,之后每步只算一次)。

斐波那契数列法

黄金分割法每步用同一个 \(\rho\);若允许每步使用不同的 \(\rho_k\),复用条件变为

\[ \rho_{k+1} = 1 - \frac{\rho_k}{1 - \rho_k}, \qquad \rho_k \in \left[0, \tfrac{1}{2}\right] \]

\(N\) 步后的总压缩比为 \((1 - \rho_1)(1 - \rho_2) \cdots (1 - \rho_N)\)。把"总压缩比最小"本身当成一个优化问题求解,最优参数序列由斐波那契数列(\(F_{-1} = F_0 = 1\),\(F_{k+1} = F_k + F_{k-1}\),即 \(1, 1, 2, 3, 5, 8, 13, 21, \dots\))给出:

\[ \rho_k = 1 - \frac{F_{N-k+1}}{F_{N-k+2}}, \quad k = 1, \dots, N \qquad \Longrightarrow \qquad \text{总压缩比} = \frac{F_N}{F_{N+1}} \cdot \frac{F_{N-1}}{F_N} \cdots \frac{F_1}{F_2} = \frac{1}{F_{N+1}} \]

在"只比较函数值"的方法中这是理论最优,优于黄金分割法的 \(0.618^N\)。

最后一步的小修正

\(\rho_N = 1 - F_1 / F_2 = 1/2\) 会使两个试探点重合、无法压缩。实操中取 \(\rho_N = \frac{1}{2} - \varepsilon\)(\(\varepsilon\) 为很小的正数),总压缩比相应变为 \(\dfrac{1 + 2\varepsilon}{F_{N+1}}\)。

例:斐波那契数列法压缩区间

同前例:\(f(x) = x^4 - 14x^3 + 60x^2 - 70x\),\([0, 2]\),目标长度 \(0.3\)。

解答

确定迭代次数:\(\dfrac{1 + 2\varepsilon}{F_{N+1}} \le \dfrac{0.3}{2} = 0.15\),取 \(\varepsilon < 0.1\) 时 \(F_{N+1} \ge 8\),即 \(N = 4\)。参数序列:

\[ \rho_1 = 1 - \tfrac{F_4}{F_5} = 0.375, \quad \rho_2 = 1 - \tfrac{F_3}{F_4} = 0.4, \quad \rho_3 = 1 - \tfrac{F_2}{F_3} = 0.333, \quad \rho_4 = 0.5 - 0.05 = 0.45 \]
\(k\) \(\rho_k\) 当前区间 新试探点与函数值 新区间
1 0.375 \([0, 2]\) \(a_1 = 0.75\ (f = -24.34)\),\(b_1 = 1.25\ (f = -18.65)\) \([0, 1.25]\)
2 0.4 \([0, 1.25]\) \(a_2 = 0.5\ (f = -21.69)\),复用 \(b_2 = 0.75\) \([0.5, 1.25]\)
3 0.333 \([0.5, 1.25]\) 复用 \(a_3 = 0.75\),\(b_3 = 1\ (f = -23)\) \([0.5, 1]\)
4 0.45 \([0.5, 1]\) \(a_4 = 0.725\ (f = -24.27)\),复用 \(b_4 = 0.75\ (f = -24.34)\) \([0.725, 1]\)

最终区间长度 \(0.275 < 0.3\)。

二分法

若 \(f\) 还是连续可微的(\(f \in \mathcal{C}^1\)),可以利用导数符号压缩区间:取中点 \(x^{(k)} = \frac{1}{2}(a_{k-1} + b_{k-1})\),

  • \(f'(x^{(k)}) > 0\):函数在上升,极小点在左侧,新区间 \([a_{k-1}, x^{(k)}]\);
  • \(f'(x^{(k)}) < 0\):极小点在右侧,新区间 \([x^{(k)}, b_{k-1}]\);
  • \(f'(x^{(k)}) = 0\):\(x^{(k)}\) 即为极小点,停止。

每步压缩一半,\(N\) 步总压缩比 \((1/2)^N\)——比黄金分割和斐波那契压得更快,代价是每步要算一次导数而非函数值。

例:二分法压缩区间

同前例函数与区间,目标长度 \(0.3\)。

解答

\(f'(x) = 4x^3 - 42x^2 + 120x - 70\)。

\(k\) 中点 \(x^{(k)}\) \(f'(x^{(k)})\) 新区间
1 \(1\) \(12 > 0\) \([0, 1]\)
2 \(0.5\) \(-20 < 0\) \([0.5, 1]\)
3 \(0.75\) \(-1.94 < 0\) \([0.75, 1]\)

3 步后区间长度 \(0.25 < 0.3\)(黄金分割需要 4 步)。

牛顿法(一维)

设 \(f \in \mathcal{C}^2\)。在当前点 \(x^{(k)}\) 处用二阶泰勒展开构造二次拟合函数

\[ q(x) = f(x^{(k)}) + f'(x^{(k)})(x - x^{(k)}) + \frac{1}{2} f''(x^{(k)}) (x - x^{(k)})^2 \]

它与 \(f\) 在 \(x^{(k)}\) 处函数值、一二阶导数全部相同。用 \(q\) 的极小点(驻点)作为下一个迭代点:令 \(q'(x) = 0\) 得

\[ x^{(k+1)} = x^{(k)} - \frac{f'(x^{(k)})}{f''(x^{(k)})} \]

例:牛顿法求极小点

用牛顿法求 \(f(x) = \frac{1}{2} x^2 - \sin x\) 的极小点,初始点 \(x^{(0)} = 0.5\),停止条件 \(|x^{(k+1)} - x^{(k)}| < \varepsilon = 10^{-5}\)。

解答

\(f'(x) = x - \cos x\),\(f''(x) = 1 + \sin x\)。迭代:

\(k\) \(x^{(k)}\) \(\lvert x^{(k)} - x^{(k-1)} \rvert\)
1 \(0.7552\) \(0.2552\)
2 \(0.7391\) \(0.0161\)
3 \(0.7390\) \(10^{-4}\)
4 \(0.7390\) \(< 10^{-5}\),停止

校验:\(f'(x^{(4)}) \approx -8.6 \times 10^{-6} \approx 0\),\(f''(x^{(4)}) = 1.673 > 0\),满足二阶充分条件,\(x^* \approx 0.739\) 是严格局部极小点。仅 4 步就达到 \(10^{-5}\) 精度——远快于区间压缩类方法。

与方程求根的关系:牛顿法本质是不断把 \(f'\) 逼向零。令 \(g(x) = f'(x)\),迭代式变为求解方程 \(g(x) = 0\) 的牛顿切线法:

\[ x^{(k+1)} = x^{(k)} - \frac{g(x^{(k)})}{g'(x^{(k)})} \]

即"求 \(f\) 的极小点"等价于"求 \(f' = 0\) 的根"。课件例 7.5 用它求三次方程 \(x^3 - 12.2x^2 + 7.45x + 42 = 0\) 的根,从 \(x^{(0)} = 12\) 出发 4 步收敛到 \(11.2\)。

易错点:牛顿法的失效情形

  • \(f''(x) < 0\) 时方向出错:二次拟合开口朝下,驻点是拟合函数的极大点,迭代会朝极大点/远处跑。牛顿法正常工作的前提是所考虑区间内 \(f'' > 0\);
  • 初始点必须足够好:若 \(g(x^{(0)}) / g'(x^{(0)})\) 不够小(初始点离根太远),牛顿切线法可能发散。一维搜索中常先用划界法 + 区间法粗定位,再用牛顿法精化。

割线法

牛顿法需要二阶导数。若 \(f''\) 不可得,用相邻两点的一阶导数差商近似:

\[ f''(x^{(k)}) \approx \frac{f'(x^{(k)}) - f'(x^{(k-1)})}{x^{(k)} - x^{(k-1)}} \]

代入牛顿迭代式得割线法(需要两个初始点 \(x^{(-1)}, x^{(0)}\)):

\[ x^{(k+1)} = x^{(k)} - \frac{x^{(k)} - x^{(k-1)}}{f'(x^{(k)}) - f'(x^{(k-1)})}\, f'(x^{(k)}) \]

几何上,牛顿切线法用切线与横轴的交点更新,割线法用过两点的割线与横轴的交点更新。求根版本(\(g = f'\))同理。课件例 7.6 用割线法解同一个三次方程,从 \(x^{(-1)} = 13\)、\(x^{(0)} = 12\) 出发 5 步收敛到 \(11.2\),比牛顿法多一步左右,但每步省掉了二阶导数。

二次拟合视角的统一:三种方法都在"用二次函数拟合 \(f\),取拟合函数的驻点"——

方法 拟合条件 初始点数 每步信息
牛顿法 与 \(f\) 在 \(x^{(k)}\) 处的 \(f', f''\) 相同 1 \(f', f''\)
割线法 与 \(f\) 在 \(x^{(k-1)}, x^{(k)}\) 处的 \(f'\) 相同 2 \(f'\)
逆抛物线插值法 与 \(f\) 在 \(x^{(k-2)}, x^{(k-1)}, x^{(k)}\) 处的函数值相同 3 仅 \(f\)

划界法

区间压缩类方法需要先有一个含极小点的初始区间,找区间的方法称为划界法。原理:对单峰函数,只要找到三点 \(a < c < b\) 满足

\[ f(c) < f(a) \quad \text{且} \quad f(c) < f(b) \]

极小点必在 \([a, b]\) 内(中间低、两头高,谷底被"框"住了)。

做法:任取 \(x_0 < x_1 < x_2\)。若 \(f(x_1)\) 已是三者最小,完成;若 \(f(x_0) > f(x_1) > f(x_2)\)(一路下坡),向右取新点 \(x_3 > x_2\) 继续探,直到函数值回升;一路上坡则反向搜索。新点与前一点的距离应逐步放大(例如倍增)以快速圈住谷底。

衔接技巧:若后续用黄金分割法,划界时按扩展倍数 \(2 - \rho \approx 1.618\) 取新点,即 \(x_k = x_{k-1} + (2 - \rho)(x_{k-1} - x_{k-2})\),则划界结束时中间点恰好就是黄金分割的一个试探点,可省去一次函数值计算。

多维优化中的一维搜索(步长选择)

多维迭代算法的通用格式为

\[ \boldsymbol{x}^{(k+1)} = \boldsymbol{x}^{(k)} + \alpha_k \boldsymbol{d}^{(k)} \]

\(\boldsymbol{d}^{(k)}\) 是搜索方向,步长 \(\alpha_k \ge 0\) 通过极小化一元函数

\[ \phi_k(\alpha) = f(\boldsymbol{x}^{(k)} + \alpha \boldsymbol{d}^{(k)}) \]

确定。由链式法则(本章所有方法都可直接套用):

\[ \phi_k'(\alpha) = \boldsymbol{d}^{(k)\top} \nabla f(\boldsymbol{x}^{(k)} + \alpha \boldsymbol{d}^{(k)}), \qquad \phi_k''(\alpha) = \boldsymbol{d}^{(k)\top} \boldsymbol{F}(\boldsymbol{x}^{(k)} + \alpha \boldsymbol{d}^{(k)})\, \boldsymbol{d}^{(k)} \]

精确搜索不划算:精确极小化 \(\phi_k\) 计算量大(极小值甚至可能不存在),实践经验是把计算资源留给外层多维算法,步长只需"足够好"——核心是不太大也不太小。

非精确步长条件(Armijo / Goldstein / Wolfe)

取常数 \(\varepsilon \in (0, 1)\),\(\gamma > 1\),\(\eta \in (\varepsilon, 1)\)。注意下降方向上 \(\phi_k'(0) < 0\):

条件 不等式 作用
Armijo ① \(\phi_k(\alpha_k) \le \phi_k(0) + \varepsilon \alpha_k \phi_k'(0)\) 充分下降,防 \(\alpha_k\) 太大
Armijo ② \(\phi_k(\gamma \alpha_k) \ge \phi_k(0) + \varepsilon \gamma \alpha_k \phi_k'(0)\) 放大 \(\gamma\) 倍就不达标,防 \(\alpha_k\) 太小
Goldstein(替代②) \(\phi_k(\alpha_k) \ge \phi_k(0) + \eta \alpha_k \phi_k'(0)\) 防太小;①+③合称 Armijo–Goldstein 条件
Wolfe(曲率条件) \(\phi_k'(\alpha_k) \ge \eta\, \phi_k'(0)\) 用导数防太小(走到坡度足够平缓处)
强 Wolfe \(\lvert \phi_k'(\alpha_k) \rvert \le \eta\, \lvert \phi_k'(0) \rvert\) 进一步排除冲过头的点

算法步骤(Armijo 回溯法,最常用的实现)

  1. 选定初始步长候选 \(\alpha^{(0)}\)、缩小系数 \(\tau \in (0, 1)\)(通常 \(\tau = 0.5\));
  2. 检验 Armijo 条件①:满足则接受当前步长,停止;
  3. 不满足则令 \(\alpha \leftarrow \tau \alpha\),回到第 2 步。\(m\) 次回溯后步长为 \(\alpha_k = \tau^m \alpha^{(0)}\)。

从较大候选值开始只缩不放,天然防止步长太小,因此实践中常只检验条件①。

速查表

方法对比:

方法 前提 每步计算 \(N\) 步压缩比 / 特点
黄金分割法 单峰 1 次 \(f\) \(0.618^N\),实现最简单
斐波那契数列法 单峰 1 次 \(f\) \((1 + 2\varepsilon)/F_{N+1}\),函数值类最优
二分法 单峰、\(\mathcal{C}^1\) 1 次 \(f'\) \((1/2)^N\),压缩最快的区间法
牛顿法 \(\mathcal{C}^2\)、\(f'' > 0\)、初值近 \(f'\) 与 \(f''\) 各 1 次 点迭代,收敛极快但可能失效
割线法 \(\mathcal{C}^1\)、两个初值 1 次 \(f'\) 免二阶导数的牛顿法
划界法 单峰 若干次 \(f\) 不求解,只负责圈出初始区间

易错点:

  • 区间压缩类方法的全部理论建立在单峰之上;多峰函数上得到的只是某个局部极小点所在区间;
  • 黄金分割的 \(\rho \approx 0.382\) 是试探点离端点的比例,每步留下的长度是 \(1 - \rho \approx 0.618\),两者不要记混;
  • 斐波那契法最后一步必须做 \(\rho_N = \frac{1}{2} - \varepsilon\) 修正,否则两试探点重合;
  • 牛顿法迭代式分母是 \(f''\):在 \(f'' < 0\) 区域它会朝极大点走,失效不是"慢"而是"方向错";
  • Armijo 条件中 \(\phi_k'(0) = \boldsymbol{d}^\top \nabla f < 0\)(下降方向),所以右端的"下降配额"是负的——步长越大要求降得越多。