最速下降法求解无约束最优化问题
1 理论基础
已知问题模型为
minf?x? nx?R 算法:
1) 选取初始点x0与f0?f?x0?,初始化k?0
2) 验证迭代中止条件:?xk?eps且?f?xk??eps或k?lim
若是?xk?eps且?f?xk??eps,则输出解xk及迭代次数k 若是k?lim,则输出error信息 注:其中eps?10?10,lim?1000 3) 计算xk点搜索方向:dk???f?xk?
计算xk点迭代步长:?k?argmin?f?xk??dk??
??0更新点列:xk?1?xk??kdk,k?k?1 转第2步
2 MATLAB程序
2.1 函数说明
文件名称:Opt_Steepest.m
function [xo, fo] = Opt_Steepest(f, grad, x0, TolX, TolFun, dist0, MaxIter)
% 用最速下降法求最优化解 % 输入: % f——函数名 % grad——梯度函数 % x0——解的初值 % TolX——变量的误差阈值 % TolFun——函数的误差阈值 % dist0——初始步长 % MaxIter——最大迭代次数 % 输出:
% xo——最小值的点 % fo——最小的函数值
%% 判断输入的变量数,设定一些变量为默认值 if nargin < 7
MaxIter = 1000; %最大迭代次数默认为100 end
if nargin < 6
dist0 = 10; %初始步长默认为10 end
if nargin < 5
TolFun = 1e-10; %函数值误差为1e-8
end
if nargin < 4
TolX = 1e-5; %自变量距离误差 end
%% 第一步,求解的初值的函数值 x = x0;
fx0 = feval(f, x0); fx = fx0; dist = dist0;
kmax1 = 25; % 线性搜索法确定步长的最大搜索次数 warning = 0; %% 迭代计算求最优解 for k = 1 : MaxIter g = feval(grad, x);
g = g/norm(g); % 求在x处的梯度方向 %线性搜索方法确定步长
dist = dist*2; % 令步长为原步长的二倍 fx1 = feval(f, x-dist*2*g); for k1 = 1 : kmax1 fx2 = fx1;
fx1 = feval(f, x-dist*g);
if fx0 > fx1+TolFun && fx1 < fx2 - TolFun % fx0 > fx1 < fx2,
den = 4*fx1 - 2*fx0 - 2*fx2; num = den - fx0 + fx2; % 二次逼近法 dist = dist*num/den; x = x - dist*g;
fx = feval(f,x); % 确定下一点 break; else
dist = dist/2; end end
if k1 >= kmax1
warning = warning + 1; %无法确定最优步长 else
warning = 0; end
if warning >= 2 || (norm(x - x0) < TolX && abs(fx - fx0) < TolFun) break; end x0 = x; fx0 = fx; end xo = x;
相关推荐: