[最优化技术] 第三章 无约束优化方法
第三章 无约束优化方法
无约束优化方法是有约束优化方法的基础,而其中一维问题的优化方法(一维搜索)是所有优化方法的基础。
一维搜索法
对于求解一元函数凸函数的极小值,采用一维搜索来解决。一维搜索一般分为两步,确定初始搜索区间 和 迭代逼近极小值。
1. 确定搜索区间(进退法/外推法)
这个方法用来从初始点确定初始搜索区间。具体步骤如下:
- ① 取初始点和初始步长。
- ② 计算 \(f(a_0)\) 和 \(f(a_0 + h)\),根据比较结果,向左或向右搜索,步长每次加倍,直到得到 “大-小-大” 的结构。
动画演示
C++代码实现
#include <iostream>
#include <cmath>
#include <functional>
#include <utility>
using namespace std;
// 进退法求初始区间
pair<double, double> bracket_minimum(function<double(double)> func, double a0, double h) {
// 进退法最大搜索次数
const int MAX_ITER = 1e4;
if (h <= 0)
throw invalid_argument("Step size h must be positive.");
// 递增,向左搜索
if (func(a0) <= func(a0 + h)) {
printf("[debug] left search.\n");
double x0 = a0 + h, x1 = a0;
h *= 2;
double x2 = x1 - h; // 步长加倍
int iter = 0;
while (func(x2) < func(x1)) {
if (iter++ > MAX_ITER)
throw runtime_error("Max iterations exceeded in left expansion");
printf("[debug] step %d: (%.2lf, %.2lf, %.2lf)\n", iter, x2, x1, x0);
x0 = x1;
x1 = x2;
h *= 2;
x2 = x1 - h; // 步长加倍
}
printf("[debug] step %d: (%.2lf, %.2lf, %.2lf)\n", iter + 1, x2, x1, x0);
return make_pair(x2, x0);
}
// 递减,向右搜索
else {
printf("[debug] right search.\n");
double x0 = a0;
double x1 = a0 + h;
h *= 2;
double x2 = x1 + h;
int iter = 0;
while (func(x2) < func(x1)) {
if (iter++ > MAX_ITER)
throw runtime_error("Max iterations exceeded in right expansion");
printf("[debug] step %d: (%.2lf, %.2lf, %.2lf)\n", iter, x0, x1, x2);
x0 = x1;
x1 = x2;
h *= 2;
x2 = x1 + h; // 步长加倍
}
printf("[debug] step %d: (%.2lf, %.2lf, %.2lf)\n", iter + 1, x0, x1, x2);
return make_pair(x0, x2);
}
}
int main() {
// 定义一个一元凸函数
auto f = [](double x) {
return x * x - 2 * x - 5;
};
double a0, h;
cout << "输入初始点a0: ";
cin >> a0;
cout << "输入初始步长h: ";
cin >> h;
try {
auto r = bracket_minimum(f, a0, h);
cout << "初始搜索区间为:(" << r.first << ", " << r.second << ").\n";
} catch (const exception& e) {
cerr << "Error: " << e.what() << endl;
return 1;
}
return 0;
}
2. 逼近极小值(区间消去法)
在初始区间 \([a, b]\) 中任取两点 \(a_1 < b_1\),计算 \(f(a_1), f(b_1)\):
- ① 若 \(f(a_1) < f(b_1)\),区间缩小为 \([a, b_1]\);
- ② 若 \(f(a_1) > f(b_1)\),区间缩小为 \([a_1, b]\);
- ③ 若 \(f(a_1) = f(b_1)\),区间缩小为 \([a_1, b_1]\)。
当区间长度 \(|b - a| \leq \varepsilon\) 时,取极小值:\(\frac{a + b}{2}\)。
关于此处的任取,根据不同的选择方法,产生了不同的搜索算法,可以按如下分类。
\[一维搜索法(选取插入点)
\begin{cases}
试探法(序列消去原理)
\begin{cases}
黄金分割法 \\
斐波那契法 \\
\cdots
\end{cases} \\
插值法(多项式逼近)
\begin{cases}
二次插值法 \\
牛顿法 \\
\cdots
\end{cases}
\end{cases}
\]
对于不同的区间消去法,将在后续的文章中逐一讲解。
多元函数的无约束优化
对于多元函数 \(f(X) = f(x_1,x_2,\cdots,x_n)\) 的无约束优化,根据第一章中迭代的一般步骤一节,关键是构造搜索方向 \(S^{(k)}\)和 求出每次迭代的步长因子\(\alpha_k\)。
对于求出每次迭代的步长因子\(\alpha_k\),实际上就是在沿 \(S^{(k)}\) 方向进行一次一维搜索,找到这个方向上的函数最低点。
每次迭代都是在进行一维搜索,而根据选取搜索方向策略的不同,产生了许多不同的方法。有牛顿法、最速下降法、共轭梯度法等等。后续文章会详细介绍每一种方法。
本学习笔记参考资料:
[1] 白清顺, 孙靖民, 梁迎春. 机械优化设计 第7版[M]. 北京: 机械工业出版社, 2024. ISBN: 978-7-111-75103-8 在线链接
[2] 武汉理工大学《最优化技术B》课程课件,授课教师:颜彬老师

本文介绍了无约束优化方法,重点阐述了一维搜索法的原理与步骤,包括进退法确定初始区间和区间消去法逼近极小值,并指出多元函数优化的关键在于搜索方向与步长的确定,其核心为沿方向进行一维搜索。
浙公网安备 33010602011771号