[最优化技术] 第三章 无约束优化方法

第三章 无约束优化方法

无约束优化方法是有约束优化方法的基础,而其中一维问题的优化方法(一维搜索)是所有优化方法的基础。

一维搜索法

对于求解一元函数凸函数的极小值,采用一维搜索来解决。一维搜索一般分为两步,确定初始搜索区间迭代逼近极小值

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》课程课件,授课教师:颜彬老师

posted @ 2025-12-04 20:12  H_Elden  阅读(9)  评论(0)    收藏  举报