最优化理论与算法------最速下降法(附Matlab实现)

 

 

 1 function [xo,fo] = Opt_Steepest(f,grad,x0,TolX,TolFun,dist0,MaxIter)
 2 % 用最速下降法求最优化解
 3 %输入:f为函数名 grad为梯度函数
 4 %x0为解的初值 TolX,TolFun分别为变量和函数的误差阈值
 5 %dist0为初始步长 MaxIter为最大迭代次数
 6 %输出: xo为取最小值的点 fo为最小的函数值
 7 % f0 = f(x(0))
 8 
 9 %%%%%%判断输入的变量数,设定一些变量为默认值
10 if nargin < 7
11     MaxIter = 100; %最大迭代次数默认为100
12 end
13 if nargin < 6
14     dist0 = 10; %初始步长默认为10
15 end
16 if nargin < 5
17     TolFun = 1e-8; %函数值误差为1e-8
18 end
19 if nargin < 4
20     TolX = 1e-6; %自变量距离误差
21 end
22 %%%%%第一步,求解的初值的函数值
23 x = x0;
24 fx0 = feval(f,x0);
25 fx = fx0;
26 dist = dist0;
27 kmax1 = 25; %线性搜索法确定步长的最大搜索次数
28 warning = 0; 
29 %%%%%迭代计算求最优解
30 
31 for k = 1: MaxIter
32     g = feval(grad,x);
33     g = g/norm(g); %求在x处的梯度方向
34     %%线性搜索方法确定步长
35     dist = dist*2; %令步长为原步长的二倍
36     fx1 = feval(f,x-dist*2*g);
37     for k1 = 1:kmax1
38         fx2 = fx1;
39         fx1 = feval(f,x-dist*g);
40         if fx0 > fx1+TolFun & fx1 < fx2 - TolFun %fx0 > fx1 < fx2,
41             den = 4*fx1 - 2*fx0 - 2*fx2;num = den - fx0 + fx2;  %二次逼近法
42             dist = dist*num/den;
43             x = x - dist*g; fx = feval(f,x); %确定下一点
44             break;
45         else
46             dist = dist/2;
47         end
48     end
49     if k1 >= kmax1
50         warning = warning + 1; %无法确定最优步长
51     else
52         warning = 0;
53     end
54     if warning >= 2|(norm(x - x0) < TolX&abs(fx - fx0) < TolFun)
55         break;
56     end
57     x0 = x;
58     fx0 = fx;
59 end
60 xo = x; fo = fx;
61 if k == MaxIter
62     fprintf('Just best in %d iterations',MaxIter);
63 end

 

注意修改目标函数和梯度函数(一阶偏导函数)。

posted @ 2020-12-17 10:38  北漂的尘埃  阅读(1921)  评论(3编辑  收藏  举报