实验四:共轭梯度法
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取;
(3)完成FR共轭梯度法的MATLAB编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
初始化
定义目标函数 func,它是一个字符串表达式,描述了优化问题的目标。
初始化起始点 x0,它是一个向量,表示在搜索空间中的起始位置。
设置容忍度 tol,用于确定何时停止迭代(当梯度的范数小于此值时)。
设置最大迭代次数 max_iter,以防止无限循环。
定义变量和函数
使用 length(x0) 确定变量的数量 n。
使用符号变量 vars 定义符号表达式中的变量。
将目标函数字符串 func 转换为符号表达式 funf_sym。
计算目标函数的梯度 gradf_sym 和海森矩阵 hessf_sym(尽管FR方法通常不需要海森矩阵,但这里被计算了)。
将符号表达式转换为MATLAB函数句柄 funf、gradf 和 hessf,以便在数值计算中使用。
迭代过程
初始化当前点 x 为起始点 x0。
计算当前点的梯度 g。
初始化搜索方向 d 为负梯度方向 -g。
初始化迭代计数器 k 为0。
主循环
当梯度的范数大于 tol 且迭代次数小于 max_iter 时,进行以下迭代:
计算搜索方向 d 与海森矩阵 Hd 的乘积(尽管FR方法不使用这个值来计算步长,但这里计算了)。
使用FR公式计算步长 alpha:alpha = -(g' * d) / (d' * Hd)(注意:这里通常使用线搜索来找到最佳步长,而不是直接用这个公式)。
更新当前点 x:x = x + alpha * d。
计算新点的梯度 g_new。
使用FR公式更新搜索方向 d:d = -g_new + beta * d,其中 beta = (g_new' * g_new) / (g' * g)。
更新梯度 g 为 g_new。
递增迭代计数器 k。
输出
迭代完成后,输出最优解 x 和迭代次数 k
2. 代码
function [x, iter] = FR(func, x0, tol, max_iter)
n = length(x0);
vars = sym('x', [1 n]);
funf_sym = str2sym(func);
gradf_sym = gradient(funf_sym, vars);
hessf_sym = hessian(funf_sym, vars);
funf = matlabFunction(funf_sym, 'Vars', {vars.'});
gradf = matlabFunction(gradf_sym, 'Vars', {vars.'});
hessf = matlabFunction(hessf_sym, 'Vars', {vars.'});
x = x0;
g = gradf(x);
d = -g;
k = 0;
while norm(g) > tol && k < max_iter
Hd = hessf(x) * d;
alpha = -(g' * d) / (d' * Hd);
x = x + alpha * d;
g_new = gradf(x);
beta = (g_new' * g_new) / (g' * g);
d = -g_new + beta * d;
g = g_new;
k = k + 1;
end
iter = k;
end
func = '(x1 + 10*x2)^2 + 5*(x3 - x4)^2 + (x2 - 2*x3)^4 + 10*(x1 - x4)^4';
x0 = [2; 2; 2; 2];
tol = 1e-6;
max_iter = 1000;
[x, iter] = FR(func, x0, tol, max_iter);
disp('Optimal solution x:');
disp(x);
disp(['Number of iterations: ', num2str(iter)]);
3. 结果
四、心得体会
通过本次实验我知道了共轭梯度法的实验原理
FR共轭梯度法是一种用于求解无约束优化问题的迭代算法,它结合了梯度下降法的迭代格式和共轭梯度法的思想。该方法在每一步迭代中,利用前一步的搜索方向和当前点的梯度信息来构造新的搜索方向,并通过一定的步长调整来更新迭代点。FR共轭梯度法具有二次终止性,即对于二次函数,该方法可以在有限步内达到精确解。
我对比了FR共轭梯度法与之前实验中使用的方法的性能差异,并分析了在最优解、最优值以及收敛速度等方面的差异。这次实验不仅加深了我对优化算法的理解,还提高了我的编程和调试能力。同时,我也认识到了不同算法在求解实际问题时的优缺点和适用范围。在未来的学习和研究中,我将继续探索更多的优化