最速下降法是用负梯度方向: 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 Cauchy−Schwarz不等式我们得到:
∣ g k T d ∣ ⩽ ∥ g k ∥ ∥ d ∥ \left| g_{k}^{T}d \right|\leqslant \lVert g_k \rVert \lVert d \rVert ∣∣gkTd∣∣⩽∥gk∥∥d∥
从而知当 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)=(x1−2)4+(x1−2x2)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×10−5。
具体程序及说明如下:
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