梯度算法的matlab程序,基于MATLAB的梯度法源代码
第⼀部分:⽬标函数 根据⾃⼰需求,更改⽬标函数
function y=ObjFun(x)
%⽬标函数 根据实际情况修改
%输⼊参数x[x1,x2,...,xn];
%输出参数y
%⼆维⽬标函数
y =60-10*x(1)-4*x(2)+x(1)*x(1)+x(2)*x(2)-x(1)*x(2);
end
第⼆部分:求解最优步长函数 不需要更改
function a=OptStep(x,S)
%⼀维搜索,求最优步长
syms b
x=x+b.*S;
y=ObjFun(x);
Y=diff(y); %求导,导数为0的点,即为所求最优步长
a=solve(Y==0);
a=double(a);
end
第三部分:主体程序,根据⾃⼰需求,更改函数中的初始迭代点,收敛精度,梯度,梯度的模以及⾥⾯的⽬标函数
function [X,F]=GradientMethod
%梯度法,⼜称为最速下降法
%X是最优解
%F是最优解函数值
%% 第⼀步:给定初始迭代点x,收敛精度err,k=1
k=1;
x(:,k)=[0;0];
err=0.001;
syms x1 x2
f=60-10*x1-4*x2+x1*x1+x2*x2-x1*x2; %⽬标函数
%% 第⼆步:计算梯度和模并取搜索⽅向
FG=gradient(f,[x1 x2]); %f的梯度
fg=sqrt(FG(1)^2+FG(2)^2); %梯度的模
while(1)
S=-double(subs(FG,[x1,x2],x(:,k)')); %搜索⽅向
%% 第三步:进⾏收敛判断
fgvalue=double(subs(fg,[x1,x2],x(:,k)'));
if fgvalue<=err
X=x(:,k);
F=ObjFun(X);
break
else
%% 第四步求最优步长以及求新迭代点
a=OptStep(x(:,k),S);
x(:,k+1)=x(:,k)+a.*S;
k=k+1;
end
end
end
matlab求导ok,直接在命令窗⼝上运⾏ [X,F]=GradientMethod 就ok啦,看我不上传到资源上,索要积分,直接公开代码,点个赞,给个评论呗。
发布评论