最速下降法求二元函数最小值一例

作者:王福昌 时间:2018-12-09 点击数:

最速下降法求二元函数最小值一例

最速下降法是一种常见的梯度下降类算法,具有广泛的应用。这里给出求一个二元函数最小值的算例和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) %fv1处的最优值

 

©  防灾科技学院基础部 版权所有  Copyright 2009.www.cidp.edu.cn All Rights Reserved