最優化理論與算法------最速下降法(附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

 

注意修改目標函數和梯度函數(一階偏導函數)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM