2024.6.5
实验四:共轭梯度法程序设计
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取;
(3)完成FR共轭梯度法的MATLAB编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
确定无约束优化问题:
给定目标函数$f(x)$,要求最小化或最大化该函数,即求解$\min f(x)$或$\max f(x)$。
选择终止准则:
确定终止准则,通常是设置一个收敛精度,当两次迭代之间目标函数值的差小于该精度时,认为算法已经收敛,可以终止迭代。
实现FR共轭梯度法的MATLAB编程:
编写MATLAB代码实现FR共轭梯度法,包括计算搜索方向、确定步长、更新迭代点等步骤。
选取初始点:
在实验二和实验三中选取的初始点作为起始点,用于FR共轭梯度法的初始迭代点。
执行共轭梯度法迭代:
使用FR共轭梯度法进行迭代优化,直到满足终止准则。
比较实验结果:
比较FR共轭梯度法与实验二和实验三中其他优化算法的实验结果,包括最优解、最优值和收敛速度等方面。
2. 代码
function [xk]=FR_Wolfe(e,x)
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
%没用到k,只存储当前迭代的值。
xk=x;
while 1
%step 2
%一维搜索求ak
a=Wolfe_Powell(xk,pk);
%step 3
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 4
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
return;
end
%step 5
b=(g1*g1')/(g0*g0');
pk=-g1+b*pk;
%step 6
%没用到k,只存储当前迭代的值。
g0=g1;
function g=shuzhiweifenfa(x)
for i = 1:length(x)
m=zeros(1,length(x));
m(i)=(10^-6)/2;
g(i)=f(x+m)-f(x-m);
end
g=g/10^-6;
function a=Wolfe_Powell(x,pk)
%step 1
u=0.1;
b=0.5;
a=1;
n=0;
m=10^100;
%step 2
fx=f(x);
g=shuzhiweifenfa(x);
while 1
xk=x+a*pk;
fxk=f(xk);
gk=shuzhiweifenfa(xk);
if (fx-fxk)>=(-u*a*g*pk.')%(3-1)
if (gk*pk.')>=(b*g*pk.')%(3-2)
return;
else
%step 4
n=a;
a=min(2*a,(a+m)/2);
end
else
%step 3
m=a;
a=(a+n)/2;
end
end
3. 结果
四、心得体会
通过实现共轭梯度法,我深入理解了其算法原理,并体会到了编程中的挑战与乐趣。在编写代码的过程中,我学会了如何处理数值稳定性问题,并调整了算法参数以达到最佳效果。这次实验不仅锻炼了我的编程能力,还增强了我对优化算法的认识。我认识到共轭梯度法在求解大规模稀疏线性方程组时具有明显优势,但面对复杂问题时需要相应改进。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通