最优化


function [ x0,f0 ] = opt_golden( f,a,b,tolx,tolfun,k)
%f为函数
%a为区间起点,b为区间终点
%tolx为最优值点检的误差阀值
%tolfun为函数的误差阀值
%k为最大迭代次数
%x0为最优化点值,f0为函数f在x0处的函数值
r=(sqrt(5)-1)/2;%黄金分割点
h=b-a;%区间长度
rh=r*h;
c=b-rh;
d=a+rh;
fc=feval(f,c);
fd=feval(f,d);
%FEVAL(F,x1,...,xn) evaluates the function specified by a function handle or function name, F,
%at the given arguments, x1,...,xn.
%For example, if F = @foo, FEVAL(F,9.64) is the same as foo(9.64).
if k<=0|(abs(h)<tolx&abs(fc-fd)<tolfun)%判断迭代是否终止
if fc<=fd
x0=c;
f0=fc;
else
x0=d;
f0=fd;
end
if k==0
disp('最好设置迭代次数大于0');
end
else
if fc<fd
[ x0,f0 ] = opt_golden( f,a,d,tolx,tolfun,k-1);%将d赋给b,并跳到步骤2,每迭代了一次,k减1
else
[ x0,f0 ] = opt_golden( f,c,d,tolx,tolfun,k-1);%将c赋给a,并跳到步骤2,每迭代了一次,k减1
end
end
function [ x0,f0 ] = opt_quadratic( f,x,tolx,tolfun,k)
%f为函数
%x为搜索区间
%tolx为最优值点检的误差阀值
%tolfun为函数的误差阀值
%k为最大迭代次数
%x0为最优化点值,f0为函数f在x0处的函数值
if length(x)~=3
disp('x的长度必须是3');
return;
else
xdata=x(1:3);
fdata=f(xdata);
x0=xdata(1);
x1=xdata(2);
x2=xdata(3);
f0=fdata(1);
f1=fdata(2);
f2=fdata(3);
end
nd=[f0-f2,f1-f2,f2-f1]*[x1^2,x2^2,x0^2;x1,x2,x0]';%nd是一行两列向量
x3=nd(1)/nd(2);
f3=feval(f,x3);%求二次插值多项式的最小值x3和对应的函数值f3
if k<=0|(abs(x3-x1)<tolx&abs(f3-f1)<tolfun)%判断迭代是否终止
x0=x3;
f0=f3;
else
if x3<x1
if f3<f1
xdata=[x0,x3,x1];
fdata=[f0,f3,f1];
else
xdata=[x3,x1,x2];
fdata=[f3,f1,f2];
end
else
if f3<f1
xdata=[x1,x3,x2];
fdata=[f1,f3,f2];
else
xdata=[x0,x1,x3];
fdata=[f0,f1,f3];
end
end
end
[ x0,f0 ] = opt_quadratic( f,x,tolx,tolfun,k-1);
end
浙公网安备 33010602011771号