最速下降法求二元函数最小值一例
最速下降法是一种常见的梯度下降类算法,具有广泛的应用。这里给出求一个二元函数最小值的算例和MATLAB程序。
例1 求函数的最小值
算法有两个要素:
一是方向。局部沿着负梯度方向下降最快。当然梯度有解析解最好,没有或者很难算的话,用数值解微分替代。
二是步长。步长大小通过求关于步长的一元函数最值确定。代码例子中把初值和负梯度确定后,得到新点,代入目标多元函数后,得是关于步长的一元函数,这时需要求步长为多少时,最小。这里让函数关于求导数,得驻点作为步长。
该算法的缺点是对一些特殊函数,最后Z字步数走的太多,收敛速度慢。
% 最速下降算法 参考文献:http://blog.sina.com.cn/s/blog_92d2c5e10102vnqn.html
clear,clc,close all
syms x y t
f = (x-2)^2+2*(y-4)^2; %求解函数的极小值点
g = [diff(f,x),diff(f,y)]; %求梯度向量,对于可导函数有解析式更好,若没有则要差分处理
x0 = -1; y0 = -1; % 初值
eps = 1e-6; % 迭代误差限
v = [x,y]; %自变量
%令函数 g 中变量 v 取[x0,y0],用来求[x0,y0]的梯度值
g0 = subs(g,v,[x0,y0]);
v1 = [x0,y0]; temp0 = norm(g0) %初值处梯度范数
n = 0;
ezcontour(f,[-3,7,-2,8]);
hold on
while temp0>eps && n<=1000
d = -g0;% 负梯度方向
fval = subs(f,v,v1); % 函数值
ft = subs(f,v,v1+t*d);
dft = diff(ft);
s = double(solve(dft)); % 求使得目标函数减少最大的步长
plot([v1(1) v1(1)+s*d(1)],[v1(2),v1(2)+s*d(2)],'Color',rand(1,3));drawnow;pause(0.3);
v1 = v1+s*d; %求下一个迭代点
g0 = subs(g,v,v1); %更新梯度
temp0 = norm(g0); %更新后的梯度范数,足够小时迭代终止
n = n+1;
end
plot(v1(1),v1(2),'ro'), disp(v1) %最优解
disp(fval) %f在v1处的最优值