实验二:最速下降法程序设计
实验二:最速下降法程序设计
一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式 ;通过此次实验,进一步巩固最速下降法的基本原理和思想。
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取
(3)完成最速下降法(负梯度法)的 MATLAB 编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
步骤1:给出初始点x 0,置k=0,最大迭代次数maxk=5000,精度e=1e-5,目标 函数funf及其梯度gfun
步骤2:若终止条件满足(| | gfun | | < e),则迭代停止
步骤3:计算d k = −gfun
步骤4:在d k方向上利用一维精确线性搜索Amrijo搜索求步长ak
步骤5:x k + 1 = x k + α k d k , k = k + 1,转步骤2
2. 代码
grad.m
function [x,val,k] = grad(funf,gfun,x0)
%功能:用最速下降法求解无约束问题
%输入:funf,gfun分别是目标函数和梯度,x0是初始点
%输出:x,val分别是近似最优解和最优值,k是迭代次数
%%
maxk=5000; %最大迭代次数
rho=0.5;
sigma=0.4;
k=0;
e=1e-5; %精度
while(k<maxk)
g=feval(gfun,x0); %计算梯度
d=-g;
if(norm(d)<e),break;end
%用Amrijo搜索技术确定步长
m=0;mk=0;
while(m<20) %最大迭代次数
if(feval(funf,x0+rho^m*d)<feval(funf,x0)+sigma*rho^m*g'*d)
mk=m;
break;
else
m=m+1;
end
end
x0=x0+d*rho^mk;
k=k+1;
end
x=x0;
val=feval(funf,x0);
end
funf.m
function f= funf(x)
%目标函数
%%
f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
end
gfun.m
function g=gfun(x)
%目标函数的梯度
%%
g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';
end
3. 结果
x0=[-1.2 1]';
>> [x,val,k]=grad('funf','gfun',x0);
>> disp(['最优解:x = '])
disp(x)
disp(['此时: f(x) = ',num2str(val)])
最优解:x =
1.0000
1.0000
此时: f(x) = 1.1985e-10
disp(['迭代次数:k = ', k])
迭代次数:k = ֛
>> disp(k)
1435
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~