下面是三个非线性规划领域的算法。课堂上给予了详细的讲解,在实践环节让学生编程实现,从而可以实验复杂一些的例子,加深对算法的理解。下面共有四个程序grad,simplelinesearch,bfgs和phr,全部使用MATLAB语言编写。这些代码远未完善,可修改余地很大,仅供教学之用。
function gradf=grad(hfun,x)
%GRAD 数值法求函数在给定点处的导数值(一元函数)或梯度(多元函数)
% gradf = grad(hfun,x0) hfun是函数句柄或内联函数,x0是一定点或一批点(按列);返回
% 值gradf是函数在该点处的导数或梯度。
% 要求函数能对成批的点求函数值。比如:feval(hfun,X)返回一个与X同列的行向量,对应于以
% X每一列作为函数自变量而求得的函数值。
%
% Reference: 《最优化计算原理与算法程序设计》, 粟塔山等编著, 国防科技大学出版社
% (湖南), 2001.
%
% $Author: WBC $ $Date: 2003/10/25 $
n = length(x);
h=1e-3; % 数值法求梯度的步长
w1=zeros(n,1);%h/2
w2=w1; %-h/2
w3=w1; %h
w4=w1; %-h
for i=1:n
x(i)=x(i)+h/2;
w1(i)=hfun(x);
x(i)=x(i)-h;
w2(i)=hfun(x);
x(i)=x(i)-h/2;
w4(i)=hfun(x);
x(i)=x(i)+2*h;
w3(i)=hfun(x);
x(i)=x(i)-h;
end
gradf=(8*(w1-w2)-(w3-w4))/(6*h);
function [fv,x,lambda,exitflag]=simplelinesearch(hf,rho,l,u,lambda0,fv0,x0,g,d)
%LINESEARCH 简单线搜索
%输入参数:
% hf -- 函数句柄,目标函数
% rho -- 实标量,简单线搜索的参数,介于0到0.5之间的数
% l -- 实标量,简单线搜索的参数,介于0到1之间的数
% u -- 实标量,简单线搜索的参数,介于0到1之间的数,满足u>l
% alpha0 -- 实标量,步长的初始值
% fv0 -- 实标量,一维搜索的初始目标函数值,即 hf(x0+alpha_0*d)
%