一、算法原理
1、首先了解一个概念,什么式无约束最优化。
无约束优化问题就是在x∈R^n的范围内,找到一点x*,使得f(x*)<f(x)对于任意x∈R^n都成立。点x*就是全局最优解。
其一般形式为 ,x∈R^n。
2、假设函数为f(x),最速下降法通过给定一个初始点xk,选择xk处的负梯度方向为最速下降方向,然后进行线搜索来确定步长。
其迭代公式为:,
其中a为步长,∇f(xk)=gradient(f)/norm(gradient(f))为梯度。
步长a要满足,f(x(k+1))=min(f(x(k+1))
3、算法步骤,整个步骤分为两大部分:按照迭代公式的循环迭代,步长a的确定。
我们以二维极值问题f=x1.^2+25*x2.^2,为例。
(1)给定初始点[2 2],和迭代精度tol(可设置为默认值);
(2)求其梯度∇f(xk)=gradient(f)/norm(gradient(f));
(3)带入迭代公式;
(4)步长的确定,将上一步的迭代公式代入f=x1.^2+25*x2.^2,对其求导,导数为零点的a就式最佳步长。
(5)将求得的步长a带入迭代公式,判断||梯度值||是否满足精度要求,不满足要求更新当前梯度值,,继续求步长。不断循环,直至满足要求。
二、MATLAB程序
clc
clear
f=@(x1,x2) x1.^2+25*x2.^2;
[x,result]=Min_TD(f,[2;2]);
function [x,result]=Min_TD(f,x0,tol)%f为匿名函数句柄,x0为初始点,tol为精度
if nargin == 2
tol=1e-6;
end
x01=x0(1);
x02=x0(2);
f_sym=sym(f); %将匿名函数转化为符号函数
%% F_td为计算梯度值 f_td为了计算当前梯度值
F_td=matlabFunction(gradient(f_sym));%计算该函数梯度,并取得梯度函数句柄
f_td=F_td(x01,x02); %计算当前的梯度值
d_k=-f_td/norm(f_td);%下降方向
%% 寻找最佳迭代步长 alfa
while norm(f_td) > tol %当前梯度值不满足要求
syms alfa
x1=x0(:)+alfa*d_k;%将这个点带入迭代表达式,求alfa
x11=x1(1);
x12=x1(2);
fx1=f(x11,x12);%计算x1带入后的原函数表达式
d_x1=diff(fx1);%对原函数表达是式求导
d_alfa=double(solve(d_x1));%求解表达式为0时的alfa(导数为零时的点为极小值点)
x0=x0(:)+d_alfa*d_k;%进行迭代
x01=x0(1);
x02=x0(2);
f_td=F_td(x01,x02);%当前梯度值
if norm(f_td) < tol %满足要求,退出
break;
end
d_k=-f_td/norm(f_td);%否则,继续迭代
end
x=x0;
result=f(x(1),x(2));
end