2024.6.3
所学时间:2小时
代码行数:32
博客园数:1篇
所学知识:今天继续完成工程数学的最速下降法的实验。
实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式;通过此次实验,进一步巩固最速下降法的基本原理和思想。
二、实验内容
(1)求解无约束优化问题:;
(2)终止准则取;
(3)完成最速下降法(负梯度法)的MATLAB编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
定义目标函数 fun 和目标函数的梯度 gfun。
(1)在 grad 函数中,设定最大迭代次数 maxk,学习率 beta 和 Armijo准则参数 sigma。
(2).初始化迭代次数 k,并在迭代次数小于 maxk 时执行循环。
(3).计算当前点 x0 处的梯度 gk。
(4).计算负梯度方向 dk。
(5).如果梯度的2范数小于设定阈值 epsilon,则结束迭代。
(6).初始化Armijo条件搜索参数,设定最大搜索次数为 20。
(7).在最大搜索次数内,利用Armijo准则搜索最优的步长 beta。更新 x0。
(8).增加迭代次数 k。
(9).返回最终结果 x0 和目标函数在最优点的值。
2. 代码
function f= fun(x)
%目标函数x
f=(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=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
function[k,x,val]=grad(fun,gfun,x0,epsilon)
maxk=500000;
beta=0.5; sigma=0.4;
k=0;
while(k<maxk)
gk=feval(gfun,x0);
dk=-gk;
if(norm(gk)<epsilon) break;end
m=0;mk=0;
while(m<20)
if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
mk=m;break;
end
m=m+1;
end
x0=x0+beta^mk*dk;
k=k+1;
end
x=x0;
val=feval(fun,x0);