1,基本思路
梯度法也称最速下降法。目标函数的梯度方向函数值上升最快,负梯度方向 是函数值下降最快的方向。因此以负梯度方向作为探索方向,来求目标函数的极小值。
2,迭代公式
3,步长的选择
a,任意选取只需要满足步长
b,沿负梯度方向进行一维搜索,求解一维最优化问题的最优步长,即对目标函数求最小,以得到最优步长
4,迭代步骤
详见 https://wenku.baidu.com/view/a2aee7ee4afe04a1b071dee1.html
5,MATLAB可执行代码
function [k,x_min,f_min]=Gradient_method(f,x,exp)
%% 程序说明
%{
该程序应用于多维无条件优化问题中的梯度下降法
从数值迭代格式可以看出,构造一种算法的关键是如何确定一个有利的搜索方向。
梯度方向是函数值上升最快的方向,负梯度方向是函数值下降最快的方向。
变量说明:
输入值部分
f为目标函数,对于目标函数中自由变量的个数没有要求
x为初值矩阵,要求在调用函数是必须为一行n列的形式,否则会导致后期维度出现错误
exp为精度
返回值部分
k为迭代次数
x_min为函数的局部极小值数列
f_min为函数的局部极小值
调用方法:
clc
clear
syms x1 x2%所有的自由变量且必须由x1,x2,x3……表示
x=[1,3];
f=(x1-2)^2+2*(x2-1)^2;
exp=0.0005;
[k,x_min,f_min]=Gradient_method(f,x,exp)
%}
%% 函数主体
x_size=size(x,2);
x_i= sym(zeros(1,x_size));
%class(x_i)
for i=1:x_size
syms([\'x\' num2str(i)]);
x_i(1,i)=[\'x\' num2str(i)];
end
k=0;
grad_f=gradient(f,x_i);
while 1
k=k+1;
%求函数方向导数
%grad_f=[diff(f,x1),diff(f,x2)];
fz_d=subs(grad_f,x_i,x);
%class(fz_d);
fz_d=double(fz_d);
%class(fz_d);
fz_d1=norm(fz_d);
s=fz_d/fz_d1;
if fz_d1<exp
x_min=x;
f_min=subs(f,x_i,x_min);
break;
else
%求最优步长
syms a
s=s\';
f_b=subs(f,x_i,x+a.*s);
f_bd=diff(f_b,a);
a=solve(f_bd==0,a);
a=double(a);
x=x+a*s;
end
end
end
请发表评论