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
注意修改目標函數和梯度函數(一階偏導函數)。