最优化方法-最速下降法及MATLAB实现

基本思想

最速下降法是用负梯度方向: d k = − ∥ ∇ f ( x k ) ∥ d_{k} = - \lVert \nabla f(x_{k}) \rVert dk=f(xk)作为搜索方向 (因此也称为梯度法)来解决无约束优化问题: m i n     φ ( α ) = f ( x k + α d k ) min\,\,\,\varphi \left( \alpha \right) =f\left( x_k+\alpha d_k \right) minφ(α)=f(xk+αdk)

公式推导

假定在第 k k k步迭代已得迭代点 x k x_{k} xk,我们欲求 x k x_{k} xk处使得 f ( x ) f(x) f(x)下降最快的方向,这个方向应该满足下降条件 g k T < 0 g_{k}^{T}<0 gkT<0。由 C a u c h y − S c h w a r z Cauchy-Schwarz CauchySchwarz不等式我们得到:
∣ g k T d ∣ ⩽ ∥ g k ∥ ∥ d ∥ \left| g_{k}^{T}d \right|\leqslant \lVert g_k \rVert \lVert d \rVert gkTdgkd

从而知当 d = d k = − g k / ∥ g k ∥ d=d_{k}=-g_{k}/ \lVert g_k \rVert d=dk=gk/gk时,等式成立, ∣ g k T d ∣ \left| g_{k}^{T}d \right| gkTd达到最大值,由于在 d k d_{k} dk方向要考虑步长,故取 d k d_{k} dk为负梯度方向,即:
d k = − g k d_{k}=-g_{k} dk=gk

算法步骤

1、选定某一初始点 x 0 x_{0} x0 ε > 0 \varepsilon>0 ε>0,并令 k = 0 k=0 k=0

2、若 ∥ ∇ f ( x k ) ∥ ⩽ ε \lVert \nabla f(x_{k}) \rVert \leqslant \varepsilon f(xk)ε,则令 x ∗ = x k x_{*} = x_{k} x=xk,否则转3;

3、 d k = − ∥ ∇ f ( x k ) ∥ d_{k} = - \lVert \nabla f(x_{k}) \rVert dk=f(xk)

4、由精确一维搜索确定步长步长 λ k \lambda _{k} λk,即由一个极小化问题求得最佳步长 m i n λ    f ( x k + λ d k ) \underset{\lambda}{min}\,\,f\left( x_k+\lambda d_k \right) λminf(xk+λdk),令 x k + 1 = x k + λ k d k x_{k+1}=x_{k}+\lambda_{k}d_{k} xk+1=xk+λkdk k = k + 1 k=k+1 k=k+1,转2。

具体练习及程序实现

用最速下降法求下列函数的极小值点,
f ( x 1 , x 2 ) = ( x 1 − 2 ) 4 + ( x 1 − 2 x 2 ) 2 f\left( x_1,x_2 \right) =\left( x_1-2 \right) ^4+\left( x_1-2x_2 \right) ^2 f(x1,x2)=(x12)4+(x12x2)2

取初始点为 x 0 = ( 0 , 3 ) T x_0=\left( 0,3 \right) ^T x0=(0,3)T,容许误差取 ε ⩽ 1 × 1 0 − 5 \varepsilon\leqslant1\times10^{-5} ε1×105
具体程序及说明如下:

function f=fun(x) %目标函数
f=(x(1)-2)^4+(x(1)-2*x(2))^2;

function g=gfun(x) %梯度函数
g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1), -200*(x(1)^2-x(2))]';

function [x,val,k]=grad(fun,gfun,x0)
maxk=5000; %最大迭代次数
rho=0.5;sigma=0.4;
k=0; epsilon=1e-5;
while(k<maxk)
    g=feval(gfun,x0); %feval函数调用gfun函数,计算参数
    d=-g; %计算搜索方向
    if(norm(d)<epsilon) 
        break; %终止条件
    end
    m=0; mk=0;
    while(m<20) %Armijo搜索过程
        if(feval(fun,x0+rho^m*d)<feval(fun,x0)+sigma*rho^m*g'*d)
            mk=m; break;
        end
        m=m+1;
    end
    x0=x0+rho^mk*d;
    k=k+1;
end
x=x0;%最优点
val=feval(fun,x0);%最优值

输入及输出

x0=[0 3];
[x,val,k]=grad(’fun’,’gfun’,x0)

运行程序,输出结果为:

x= 2.0139
   1.0070
val= 3.7685-08
k= 2111
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页