习题二
-
-用0.618法求近似最优解
function [s,phis,k,G,E]=golds(phi,a,b,delta,epsilon)
%功能: 0.618法精确线搜索
%输入: phi是目标函数, a, b 是搜索区间的两个端点
% delta, epsilon分别是自变量和函数值的容许误差
%输出: s, phis分别是近似极小点和极小值, G是nx4矩阵,
% 其第k行分别是a,p,q,b的第k次迭代值[ak,pk,qk,bk],
% E=[ds,dphi], 分别是s和phis的误差限.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t=(sqrt(5)-1)/2; h=b-a; phia=feval(phi,a); phib=feval(phi,b);
p=a+(1-t)*h; q=a+t*h; phip=feval(phi,p); phiq=feval(phi,q);
k=1; G(k,:)=[a, p, q, b];
while(abs(phib-phia)>epsilon)|(h>delta)
if(phip<phiq)
b=q; phib=phiq; q=p; phiq=phip;
h=b-a; p=a+(1-t)*h; phip=feval(phi,p);
else
a=p; phia=phip; p=q; phip=phiq;
h=b-a; q=a+t*h; phiq=feval(phi,q);
end
k=k+1; G(k,:)=[a, p, q, b];
end
ds=abs(b-a); dphi=abs(phib-phia);
if(phip<=phiq)
s=p; phis=phip;
else
s=q; phis=phiq;
end
E=[ds,dphi];
在窗口输入命令
[s,phis,k,G,E]=golds(inline('s^3-2*s+1)'),0,3,0.15,0.001)
2-用抛物线法求
function [s,phis,k,ds,dphi,S]=qmin(phi,a,b,delta,epsilon)
%功能: 精确线搜索之抛物线法
%输入: phi 是目标函数, a和b是搜索区间的端点
% delta,epsilon是容许误差
%输出: s是近似极小点, phis是对应的近似极小值;
% ds, dphi分别是s, phis的误差界; S是迭代向量
s0=a; maxj=20; maxk=30; big=1e6; err=1; k=1;
S(k)=s0; cond=0; h=1; ds=0.00001;
if (abs(s0)>1e4), h=abs(s0)*(1e-4); end
while (k<maxk & err>epsilon &cond~=5)
f1=(feval(phi,s0+ds)-feval(phi,s0-ds))/(2*ds);
if(f1>0), h=-abs(h); end
s1=s0+h; s2=s0+2*h; bars=s0;
phi0=feval(phi,s0); phi1=feval(phi,s1); phi2=feval(phi,s2);
barphi=phi0; cond=0; j=0;
%确定h使得phi1<phi0且phi1<phi2
while(j<maxj&abs(h)>delta&cond==0)
if (phi0<=phi1),
s2=s1; phi2=phi1; h=0.5*h;
s1=s0+h; phi1=feval(phi,s1);
else if (phi2<phi1),
s1=s2; phi1=phi2; h=2*h;
s2=s0+2*h; phi2=feval(phi,s2);
else
cond=-1;
end
end
j=j+1;
if(abs(h)>big|abs(s0)>big), cond=5; end
end
if(cond==5)
bars=s1; barphi=feval(phi,s1);
else
%二次插值求phis
d=2*(2*phi1-phi0-phi2);
if(d<0),
barh=h*(4*phi1-3*phi0-phi2)/d;
else
barh=h/3; cond=4;
end
bars=s0+barh; barphi=feval(phi,bars);
h=abs(h); h0=abs(barh);
h1=abs(barh-h); h2=abs(barh-2*h);
%确定下一次迭代的h值
if(h0<h), h=h0; end
if(h1<h), h=h1; end
if(h2<h), h=h2; end
if(h==0), h=barh; end
if(h<delta), cond=1; end
if(abs(h)>big|abs(bars)>big), cond=5; end
%迭代终止判别
err=abs(phi1-barphi);
%e0=abs(phi0-barphi); e1=abs(phi1-barphi); e2=abs(phi2-barphi);
%if(e0~=0 & e0<err), err=e0; end
%if(e1~=0 & e1<err), err=e1; end
%if(e2~=0 & e2<err), err=e2; end
%if(e0~=0 & e1==0 & e2==0), err=0; end
%if(err<epsilon), cond=2; end
s0=bars; k=k+1; S(k)=s0;
end
if(cond==2&h<delta), cond=3; end
end
s=s0; phis=feval(phi,s);
ds=h; dphi=err;
输入命令
>> clear all;[s,phis,k,ds,dphi,S]=qmin(inline('s^3-2*s+1'),0,3,1e-2,1e-4);
>> s
习题三
1-分别用牛顿法和阻尼牛顿法求
牛顿法
function [x,val,k]=grad(fun,gfun,x0)
% 功能: 用最速下降法求解无约束问题: min f(x)
%输入: x0是初始点, fun, gfun分别是目标函数和梯度
%输出: x, val分别是近似最优点和最优值, k是迭代次数.
maxk=5000; %最大迭代次数
rho=0.5;sigma=0.4;
k=0; epsilon=1e-5;
while(k<maxk)
g=feval(gfun,x0); %计算梯度
d=-g; %计算搜索方向
if(norm(d)<epsilon), break; end
m=0; mk=0;
while(m<20) %Armijo搜索
if(feval(fun,x0+rho^m*d)<feval(fun,x0)+sigma*rho^m*g'*d)
mk=m; break;
end
m=m+1;
end
x0=x0+rho^mk*d;
k=k+1;
end
x=x0;
val=feval(fun,x0);
构建funone和gfunone两个M文件
function f=funone(x)
f=4*x(1)^2+x(2)^2-8*x(1)-4*x(2);
function gf=gfunone(x)
gf=[8*x(1)-8,2*x(2)-4]';
执行窗口命令
>> x0=[0,1]';[x val k]=grad('funone','gfunone',x0)
阻尼牛顿法
function [x,val,k]=dampnm(fun,gfun, Hess,x0)
%功能: 用阻尼牛顿法求解无约束问题: min f(x)
%输入: x0是初始点, fun, gfun, Hess 分别是求
% 目标函数,梯度,Hesse 阵的函数
%输出: x, val分别是近似最优点和最优值, k是迭代次数.
maxk=100; %给出最大迭代次数
rho=0.55;sigma=0.4;
k=0; epsilon=1e-5;
while(k<maxk)
gk=feval(gfun,x0); %计算梯度
Gk=feval(Hess,x0); %计算Hesse阵
dk=-Gk\gk; %解方程组Gk*dk=-gk, 计算搜索方向
if(norm(gk)<epsilon), break; end %检验终止准则
m=0; mk=0;
while(m<20) % 用Armijo搜索求步长
if(feval(fun,x0+rho^m*dk)<feval(fun,x0)+sigma*rho^m*gk'*dk)
mk=m; break;
end
m=m+1;
end
x0=x0+rho^mk*dk;
k=k+1;
end
x=x0;
val=feval(fun,x);
%gval=norm(gfun(x));
%%%% 目标函数 %%%%%%%%%
%function f=fun(x)
%f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
%%%% 梯度 %%%%%%%%%%%%%%%%%%%
%function g=gfun(x)
%g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1), -200*(x(1)^2-x(2))]';
%%%% Hesse 阵 %%%%%%%%%%%%%%%%%%%
%function He=Hess(x)
%n=length(x);
%He=zeros(n,n);
%He=[1200*x(1)^2-400*x(2)+2, -400*x(1);
% -400*x(1), 200 ];
除了之前创建的FUNONE.M,GFUNONE.M,HRAD.M,还需要创建Hess.M
function He=Hess(x)
n=length(x);
He=zeros(n,n);
He=[8,0;
0,2 ];
输入命令
x0=[0,1]';[x val k]=dampnm('funone','gfunone','Hess',x0)
3-用最速下降法求函数
function [x,val,k]=grad(fun,gfun,x0)
% 功能: 用最速下降法求解无约束问题: min f(x)
%输入: x0是初始点, fun, gfun分别是目标函数和梯度
%输出: x, val分别是近似最优点和最优值, k是迭代次数.
maxk=5000; %最大迭代次数
rho=0.5;sigma=0.4;
k=0; epsilon=1e-5;
while(k<maxk)
g=feval(gfun,x0); %计算梯度
d=-g; %计算搜索方向
if(norm(d)<epsilon), break; end
m=0; mk=0;
while(m<20) %Armijo搜索
if(feval(fun,x0+rho^m*d)<feval(fun,x0)+sigma*rho^m*g'*d)
mk=m; break;
end
m=m+1;
end
x0=x0+rho^mk*d;
k=k+1;
end
x=x0;
val=feval(fun,x0);
两个M文件
function f=funone(x)
f=(x(1)-2)^4+(x(1)-2*x(2))^2;
function gf=gfunone(x)
gf=[4*(x(1)-2)^3+2*(x(1)-2*x(2)),-4*(x(1)-2*x(2))]';
>> clear all;
>> x0=[0 3]';[v,val,k]=grad('funone','gfunone',x0)