2024.6.15
所学时间:3小时
代码行数:120
博客园数:1篇
所学知识:今天学习了工程数学的实验四共轭梯度法程序设计。
1)求解无约束优化问题:
(2)终止准则取;
(3)完成FR共轭梯度法的MATLAB编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
1. 算法步骤
(1)设置初始条件和参数。
(2)初始化变量并计算初始梯度。
(3)进行迭代,直到满足停止条件(达到最大迭代次数或梯度范数低于阈值)。
(4)更新搜索方向和步长。
(5)计算新的迭代点和梯度。
(6)更新下一次迭代的共轭方向。
(7)检查停止条件,并在满足时退出循环。
(8)输出迭代次数、近似最优点和近似最优值。
2. 代码
function [k,x,val]=linecg(A,b,x0,ep,N)
%设置初始条件
if(nargin<5),N=1000;end
if(nargin<4),ep=1e-5;end;
if(nargin<3),x0=zeros(length(b),1);end
k=0;
ep=1e-6;
gk=feval(b,x0)
dk=-gk
while(k<N)
temp=feval(A,x0)*dk;
alpha=-dk'*gk/(dk'*temp);
x=x0+alpha*dk;
gk=feval(b,x);
betak=gk'*temp/(dk'*temp);
dk=-gk+betak*dk;
if(norm(gk)<ep)
break;
end
x0=x;
k=k+1;
end
disp('迭代次数:')
k
disp('近似最优点:')
x0
disp('近似最优值:')
val=0.5*x0'*feval(A,x0)*x0-feval(b,x0)'*x0
End
x0=[1;1;1;1];
[k,x,val]=linecg('ggfun','gfun',x0,1e-6,5000);
function gg=ggfun(x)
%目标函数的二阶矩阵
gg=[2+120*(x(1)-x(4))^2, 20, 0, -120*(x(1)-x(4))^2;
20, 200+12*(x(2)-2*x(3))^2, -24*(x(2)-2*x(3))^2, 0;
0, -24*(x(2)-2*x(3))^2, 10+48*(x(2)-2*x(3))^2, -10;
-120*(x(1)-x(4))^2, 0, -10, 10+120*(x(1)-x(4))^2];
End
function g=gfun(x)
%目标函数的梯度
g=[2*(x(1)+10*x(2))+40*(x(1)-x(4))^3;
20*(x(1)+10*x(2))+4*(x(2)-2*x(3))^3;
10*(x(3)-x(4))-8*(x(2)-2*x(3))^3;
-10*(x(3)-x(4))-40*(x(1)-x(4))^3];
end