5.26
实验四:共轭梯度法程序设计
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取
;
(3)完成FR共轭梯度法的MATLAB编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
初始点和初始梯度计算
选择初始点x0
计算初始梯度 g0=∇f(x0)
初始搜索方向 d0= - g0
迭代步骤
线搜索找到最佳步长 ak
αk=argminαf(xk+αdk)
更新点:
xk+1=xk+αkdk
计算新的梯度:gk+1=∇f(xk+1)
计算 β
βk=(gk)Tgk(gk+1)Tgk+1
更新搜索方向:dk+1=−gk+1+βkdk
终止条件
如果 ∥gk+1∥≤10−6,则停止迭代。
2. 代码
function [x, k] = fr_conjugate_gradient()
% 初始猜测
x = [1; 2; 2; 2];
% 计算初始梯度
g = grad_f(x);
% 初始搜索方向
d = -g;
% 终止准则的容差
tol = 1e-6;
% 最大迭代次数
max_iter = 1000;
for k = 1:max_iter
% 线搜索找到最优步长 alpha
alpha = line_search(@f, x, d);
% 更新 x
x = x + alpha * d;
% 计算新的梯度
g_new = grad_f(x);
% 检查收敛性
if norm(g_new) <= tol
break;
end
% 计算 beta
beta = (g_new' * g_new) / (g' * g);
% 更新搜索方向
d = -g_new + beta * d;
% 更新梯度
g = g_new;
end
end
function y = f(x)
% 计算目标函数值
y = (x(1) + 10 * x(2))^2 + 5 * (x(3) - x(4))^2 + (x(2) - 2 * x(3))^4 + 10 * (x(1) - x(4))^4;
end
function g = grad_f(x)
% 计算目标函数的梯度
g = zeros(4,1);
g(1) = 2 * (x(1) + 10 * x(2)) + 40 * (x(1) - x(4))^3;
g(2) = 20 * (x(1) + 10 * x(2)) + 4 * (x(2) - 2 * x(3))^3;
g(3) = 10 * (x(3) - x(4)) - 8 * (x(2) - 2 * x(3))^3;
g(4) = -10 * (x(3) - x(4)) - 40 * (x(1) - x(4))^3;
end
function alpha = line_search(f, x, d)
% 简单回溯线搜索
alpha = 1;
rho = 0.5;
c = 1e-4;
while f(x + alpha * d) > f(x) + c * alpha * (grad_f(x)' * d)
alpha = alpha * rho;
end
end
3. 结果
四、心得体会
最优梯度法 每次下降时 都是垂直梯度,如下图
共轭梯度法对最优梯度法进行了修正,搜索方向为共轭方向,将负梯度方向旋转了一个角度,每次往最优方向需要在负梯度方向进行修正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义