0


【最优化算法】基于【MATLAB】的最速下降仿真

文章目录


前言

无约束问题的求解过程一般都是通过一系列的一维搜索来实现,搜索方向的不同,形成了不同的最优化方法。这篇文章从最速下降法入手,来进行搜索。


一、最速下降法介绍

最速下降法又叫梯度法,通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代,其过程刚好与最速下降法相反,所以在求解最大值的优化问题时,常常将目标函数加负号之后,转变为求最小值后,使用最速下降法来求解。

二、最速下降法原理

最速下降法是使用负梯度方向
搜索方向
来作为搜索的方向。设f(x)在Xk附近 可微,dk为搜索方向,gk为梯度方向,有Taylor公式可知:
Taylor公式
而由导数的定义可知:Xk在沿着搜索方向下降的变化为

在这里插入图片描述
在这里插入图片描述
当搜索方向与梯度方向的夹角为π时,下降的变化最小,所以负梯度方向是目标函数在已知点的最速下降方向。

三、最速下降法步骤

  1. 给定初始点x(0),设置允许误差ε
  2. 计算初始点的导数,确定搜索方向
  3. 判断梯度范数与允许误差的大小
  4. 若梯度范数大于允许误差,则进行一维搜索,在这里插入图片描述否则停止搜索,得到最优解。
  5. 进行迭代计算在这里插入图片描述
  6. 迭代次数更新:k=k+1
  7. 转步骤(2)继续进行后续搜索,直至得到局部最优解。

四、最速下降法代码

function [k, ender]=fun(f,x,e)%最速下降法,f为目标函数
syms x1 x2 m;%x1、x2为变量,m为步长
d=-[diff(f,x1);diff(f,x2)];%分别求x1和x2的偏导数,组合为梯度
flag=1;%循环标志
k=0;%迭代次数
while(flag)
    d_temp=subs(d,x1,x(1));%将起始点代入,求得当次下降x1梯度值
    d_temp=subs(d_temp,x2,x(2));%将起始点代入,求得当次下降x2梯度值
    nor=norm(d_temp);%范数
    if(nor>=e)
        x_temp=x+m*d_temp;%改变初始点x的值
        f_temp=subs(f,x1,x_temp(1));%将改变后的x1和x2代入目标函数
        f_temp=subs(f_temp,x2,x_temp(2));
        h=diff(f_temp,m);%对m求导,求出最佳步长
        m_temp=solve(h);%求方程,得到当次m
        x=x+m_temp*d_temp;%更新起始点x
        k=k+1;%迭代次数增加
    else
        flag=0;
    end
end
ender=double(x);%搜索的终点
end

五、最速下降法测试

测试以二元函数发f(x1,x2)=2*x1^2 + x2^2为例:

syms x1 x2;
f=2*x1^2+x2^2;
e=0.1;
x=[1;1];[k,ender]=fun(f,x,e)

k =3

ender =-0.00820.0329

经过三次迭代,误差小于允许误差,最终最优解在(-0.0082,0.0329)处取得。


总结

在有限的迭代次数内,只能得到局部最优解,不一定能够取得真正的最优解,而且最速下降法是根据梯度来进行迭代,所以搜索的的实际曲线是锯齿形的曲线,越接近到最优解的点,下降的速度越缓慢。


本文转载自: https://blog.csdn.net/dxcn01/article/details/125448450
版权归原作者 Ali.s 所有, 如有侵权,请联系我们删除。

“【最优化算法】基于【MATLAB】的最速下降仿真”的评论:

还没有评论