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
注意修改目标函数和梯度函数(一阶偏导函数)。
请发表评论