最优化方法——拟牛顿法

对称秩1算法

目标函数

function f=fun(x)
f=2*(x(1)-x(2)^2)^2+(x(2)-2)^2;

梯度

function gf=gfun(x)
gf=[4*(x(1)-x(2)^2);-8*x(2)*(x(1)-x(2)^2)+2*(x(2)-2)];

对称秩1算法程序

function[k,x,val]=sr1(fun,gfun,x0,epsilon,N)
if nargin<5
    N=1000;
end
if nargin<4
    epsilon=1.e-5;
end
beta=0.55;
sigma=0.4;
n=length(x0);
Hk=eye(n);
k=0;
while(k<N)
    gk=feval(gfun,x0);
    dk=-Hk*gk;
    if(norm(gk)<epsilon)
        break;
    end
    m=0;
    mk=0;
    while(m<20)
        if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
            mk=m;
            break;
        end
        m=m+1;
    end
    x=x0+beta^mk*dk;
    sk=x-x0;
    yk=feval(gfun,x)-gk;
    Hk=Hk+(sk-Hk*yk)*(sk-Hk*yk)'/((sk-Hk*yk)'*yk);
    k=k+1;
    x0=x;
end
val=feval(fun,x0);

测试文件

clear;
clc;
x0=[1.0;1.0];
[k,x,val]=sr1('fun','gfun',x0)

输出结果
在这里插入图片描述

BFGS算法

BFGS算法程序

function[k,x,val]=bfgs(fun,gfun,x0,varargin)
N=1000;
epsilon=1.e-5;
beta=0.55;
sigma=0.4;
n=length(x0);
Bk=eye(n);
k=0;
while(k<N)
    gk=feval(gfun,x0,varargin{:});
    if(norm(gk)<epsilon),
        break;
    end
    dk=-Bk\gk;
    m=0;
    mk=0;
    while(m<20)
        newf=feval(fun,x0+beta^m*dk,varargin{:});
        oldf=feval(fun,x0,varargin{:});
        if(newf<=oldf+sigma*beta^m*gk'*dk)
            mk=m;
            break;
        end
        m=m+1;
    end
    x=x0+beta^mk*dk;
    sk=x-x0;
    yk=feval(gfun,x,varargin{:})-gk;
    if(yk'*sk>0)
        Bk=Bk-(Bk*(sk*sk')*Bk)/(sk'*Bk*sk)+(yk*yk')/(yk'*sk);
    end
    k=k+1;
    x0=x;
end
val=feval(fun,x0,varargin{:});

测试文件

clear;
clc;
x0=[1.0;1.0];
[k,x,val]=bfgs('fun','gfun',x0)

fun、gfun已经在最开始部分给出!

输出结果
在这里插入图片描述

DPF算法

DPF算法程序

function[k,x,val]=dfp(fun,gfun,x0,epsilon,N)
if nargin<5
    N=1000;
end
if nargin<4
    epsilon=1.e-5;
end
beta=0.55;
sigma=0.4;
n=length(x0);
Hk=eye(n);
k=0;
while(k<N)
    gk=feval(gfun,x0);
    if(norm(gk)<epsilon),
        break;
    end
    dk=-Hk*gk;
    m=0;
    mk=0;
    while(m<20)
        if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
            mk=m;
            break;
        end
        m=m+1;
    end
    x=x0+beta^mk*dk;
    sk=x-x0;
    yk=feval(gfun,x)-gk;
    if(sk'*yk>0)
        Hk=Hk-(Hk*(yk*yk')*Hk)/(yk'*Hk*yk)+(sk*sk')/(sk'*yk);
    end
    k=k+1;
    x0=x;
end
val=feval(fun,x0);

测试文件

clear;
clc;
x0=[1.0;1.0];
[k,x,val]=dfp('fun','gfun',x0)

fun、gfun已经在最开始部分给出!

输出结果在这里插入图片描述

Broyden族算法

Broyden族算法程序

function[k,x,val]=broyden(fun,gfun,x0,epsilon,N)
phi=0.5;
if nargin<5
    N=1000;
end
if nargin<4
    epsilon=1.e-5;
end
beta=0.55;
sigma=0.4;
n=length(x0);
Hk=eye(n);
k=0;
while(k<N)
    gk=feval(gfun,x0);
    if(norm(gk)<epsilon),
        break;
    end
    dk=-Hk*gk;
    m=0;
    mk=0;
    while(m<20)
        if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
            mk=m;
            break;
        end
        m=m+1;
    end
    x=x0+beta^mk*dk;
    sk=x-x0;
    yk=feval(gfun,x)-gk;
    Hy=Hk*yk;
    sy=sk'*yk;
    yHy=yk'*Hk*yk;
    if(sy<0.2*yHy)
        theta=0.8*yHy/(yHy-sy);
        sk=theta*sk+(1-theta)*Hy;
        sy=0.2*yHy;
    end
    vk=sqrt(yHy)*(sk/sy-Hy/yHy);
    Hk=Hk-(Hy*Hy')/yHy+(sk*sk')/sy+phi*vk*vk';
    x0=x;
    k=k+1;
end
val=feval(fun,x0);

文件测试

clear;
clc;
x0=[1.0;1.0];
[k,x,val]=broyden('fun','gfun',x0)

输出结果
在这里插入图片描述

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hyacinth&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值