最优化

习题二

  1. -用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)

猜你喜欢

转载自blog.csdn.net/qq_28013751/article/details/82949763
今日推荐