%%%%%%%%%%%%%%%%%梯度下降法求函数极小值%%%%%%%%%%%%%%%%%%%函数:f(x,y)=(x-2)^2+(y-4)^2%目的:求极小值和对应的极小值点坐标%方法:梯度下降法%理论:%方向导数:偏导数反应的是函数沿坐标轴方向的变化率,但许多物理现象告诉我们,只考虑函数沿坐标轴方向的变化率是不够的,有必要研究函数沿任一指定方向的变化率。%函数f(x,y)在点P0(x0,y0)可微分,那么函数在改点沿任一方向l的方向导数存在,其值为:f'x(x0,y0)*cos(α)+f'y(x0,y0)*cos(β),其中,cos(α),cos(β)是方向l%的方向余弦。%梯度:是与方向导数有关联的另一个概念,梯度是一个向量,表示为:f'x(x0,y0)*i+f'y(x0,y0)*j。%关系:%f'x(x0,y0)*cos(α)+f'y(x0,y0)*cos(β)%=gradf(x0,y0)*el%=|gradf(x0,y0)|*cos(θ),其中el=(cos(α),cos(β))是与方向l同方向的单位向量。%变化率:函数沿某个方向的变化率指的是函数值沿这个方向变化的快慢。%θ=0,el与梯度同向,函数增加最快,函数在这个方向的方向导数达到最大值,这个最大值就是梯度的模;%θ=π,el与梯度反向,函数减少最快,函数在这个方向的方向导数达到最小值;%θ=π/2,el与梯度方向正交,函数变化率为零;%%clearclcsymsxybf=2*(x-2)^2+(y-4)^2;%求解函数的极小值点Grad=[diff(f,x),diff(f,y)];%求梯度eps=1e-3;v=[x,y];v0=[0,0];Grad0=subs(Grad,v,v0);%求V0的梯度值M=norm(Grad0);%梯度的模,方向导数n=0;%%whilen=100d=-Grad0;%寻优搜索方向fval=subs(f,v,v0);%函数值%%%%%%%%%%%%%%%%%%%%%%%%%求出最优步长,然后确定下一刻的坐标点%%%%%%%%%%%%%%%%%%%%%%%%设步长变量为b,将v0=v0+b*d带入函数,求导,令导数等于零,解出最佳步长b1,此为一维寻优。得到下一刻坐标点v0=v0+b1*dft=subs(f,v,v0+b*d);%将步长变量带入函数dft=diff(ft);%求导b1=solve(dft);%得到该方向的最优步长v0=v0+b1*d;%得到下一刻坐标点%%Grad0=subs(Grad,v,v0);%求下一刻梯度M=norm(Grad0);%求方向导数大小,即梯度的模n=n+1;endv0=double(v0);fval=double(subs(f,v,v0));disp(v0)%最优解disp(fval)%f在v0处的最优值