几种优化方法的Matlab实现

原创 2018年04月17日 19:40:49

题目

这里写图片描述

目标函数

function y=F(x, N)
y=0;
for i=1:(N-1)
    y=y+(1-x(i))^2+100*(x(i+1)-x(i)^2)^2;
end
end

函数梯度(N维向量,注意首尾变量)

function g=G(x, N)
g=zeros(N,1);
g(1)=2*(x(1)-1)+400*(x(1)^3-x(2)*x(1));
for i=2:(N-1)
    g(i)=200*(x(i)-x(i-1)^2)+2*(x(i)-1)+400*(x(i)^3-x(i+1)*x(i));
end
g(N)=200*(x(N)-x(N-1)^2);
end

Hessen矩阵N×N,对梯度再求导)

function h=H(x, N)
h=zeros(N,N);
h(1,1)=2+1200*x(1)^2-400*x(2);
h(1,2)=-400*x(1);
for i=2:(N-1)
    h(i,i-1)=-400*x(i-1);
    h(i,i)=202+1200*x(i)^2-400*x(i+1);
    h(i,i+1)=-400*x(i);
end
h(N,N-1)=-400*x(N-1);
h(N, N)=200;
end

几种优化方法的不同之处主要在于搜索方向的选取,步长使用不精确的线搜索得到(满足Wolfe-Powell准则)。
线搜索部分可以参考线搜索(line search)方法

最速下降法 (梯度下降,Gradient Descend)

x(k+1)=x(k)λkf(x(k))

function main_gd
N=100;
x0=zeros(N,1);
eps=1e-4;
g0=G(x0, N);
step=0;
while norm(g0)>=eps
    F0=F(x0, N);
    fprintf('step %d: %.10f\t %f\n',step, F0, norm(g0));
    s0=-g0;
    %linear search
    lambda0=1;
    c1=0.1; c2=0.5;
    a=0; b= inf;
    temp=g0'* s0;
    while 1
        x1=x0+lambda0*s0;
        if F0-F(x1, N) < -c1*lambda0*temp
            b=lambda0;
            lambda=(lambda0+a)/2;
        elseif G(x1, N)'*s0 < c2*temp
            a=lambda0;
            lambda=min(2*lambda0, (lambda0+b)/2);
        else
            break;
        end
        if abs(lambda-lambda0)<=eps
            break;
        else
            lambda0=lambda;
        end
    end
    x0=x0+lambda0*s0;
    g0=G(x0,N);
    step=step+1;
end
fprintf('--------Gradient Descent (total step %d)---------\nx*=',step)
for i=1:N
    fprintf('%.2f ',x0(i));
end
end

牛顿法 (Newton)

x(k+1)=x(k)(2f(x(k)))1f(x(k))

function main_nt
N=100;
x0=zeros(N,1);
eps=1e-4;
g0=G(x0, N);
step=0;
while norm(g0)>=eps
    fprintf('step %d: %.10f\t %f\n',step, F(x0, N), norm(g0));
    x0=x0-H(x0, N)\g0;
    g0=G(x0, N);
    step=step+1;
end
fprintf('--------Newton (total step %d)---------\nx*=',step)
for i=1:N
    fprintf('%.2f ',x0(i));
end
fprintf('\nf(x*)=%.2f\n',F(x0, N));
end

BFGS方法 (拟牛顿法)

迭代方式逐步近似Hessen阵,初始H0=I

x(k+1)=x(k)λkHk1f(x(k))

function main_bfgs
N=100;
x0=zeros(N,1);
eps=1e-4;
g0=G(x0, N);
step=0;
H=eye(N, N);
while norm(g0)>=eps 
    fprintf('step %d: %.10f\t %f\n',step, F(x0, N), norm(g0));
    s0=-H*g0;
    %linear search
    lambda0=1;
    c1=0.1; c2=0.5;
    a=0; b= inf;
    temp=g0'* s0;
    while 1
        x1=x0+lambda0*s0;
        if F(x0, N)-F(x1, N) < -c1*lambda0*temp
            b=lambda0;
            lambda=(lambda0+a)/2;
        elseif G(x1, N)'*s0 < c2*temp
            a=lambda0;
            lambda=min(2*lambda0, (lambda0+b)/2);
        else
            break;
        end
        if abs(lambda-lambda0)<=eps
            break;
        else
            lambda0=lambda;
        end
        %fprintf('%f\n',lambda0);
    end

    x1=x0+lambda0*s0;
    g1=G(x1, N);
    delta_x=x1-x0;
    delta_g=g1-g0;
    miu=1+((delta_g')*H*delta_g)/((delta_x')*delta_g);
    % 更新H
    H=H+((miu*delta_x*(delta_x')-H*delta_g*(delta_x')-delta_x*(delta_g')*H))/((delta_x')*delta_g);
    x0=x1;
    g0=g1;
    step=step+1;
end
fprintf('--------BFGS (total step %d)---------\nx*=',step)
for i=1:N
    fprintf('%.2f ',x0(i));
end
fprintf('\nf(x*)=%.2f\n',F(x0, N));
end

FR(共轭梯度法,Conjugate Gradient)

由Fletcher 和 Reeves 提出,我找了半天才知道FR方法即共轭梯度法…
注意对于N维问题的共轭方向只有N个,在N步之后需要重新选择初始点。

function main_frcg
N=100;
x0=zeros(N,1);
eps=1e-4;
g0=G(x0, N);
s0=-g0;
step=0;

while norm(g0)>=eps 
    fprintf('step %d: %.10f\t %f\n',step, F(x0, N), norm(g0));
    %linear search
    lambda0=1;
    c1=0.1; c2=0.5;
    a=0; b= inf;
    temp=g0'* s0;
    while 1
        x1=x0+lambda0*s0;
        if F(x0, N)-F(x1, N) < -c1*lambda0*temp
            b=lambda0;
            lambda=(lambda0+a)/2;
        elseif G(x1, N)'*s0 < c2*temp
            a=lambda0;
            lambda=min(2*lambda0, (lambda0+b)/2);
        else
            break;
        end
        if abs(lambda-lambda0)<=1e-10
            break;
        else
            lambda0=lambda;
        end
    end
    x1=x0+lambda0*s0;
    g1=G(x1, N);
    miu=(g1'*g1)/(g0'*g0);
    %以N步的近似极小点作为新的初始点
    if step>=N-1
        miu=0;
    end
    s0=-g1+miu*s0;
    x0=x1;
    g0=g1;
    step=step+1;  
end
fprintf('--------FR Conjugate Gradient (total step %d)---------\nx*=',step)
for i=1:N
    fprintf('%.2f ',x0(i));
end
fprintf('\nf(x*)=%.2f\n',F(x0, N));
end

结论

通过运行可以发现,收敛速度最快的是Newton法,其次是拟Newton法(BFGS),再是共轭梯度法,最后是梯度下降法。

--------Newton (total step 73)---------
x*=1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 
f(x*)=0.00
--------BFGS (total step 462)---------
--------FR Conjugate Gradient (total step 26906)---------
--------Gradient Descent (total step 27236)---------
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012938704/article/details/79979579

设计模式快速入门-面试必用的几种

本教程从23种常用的设计模式中,抽取了几种面试和开发中最常用的设计模式案例,使学员可以快速入门。 设计模式是一个需要在工作中长期消化、理解的技术,不能一口吃个胖子。初级和中级开发人员,了解几种常用设计模式就够用了!
  • 2016年09月30日 14:39

TMS320C54XDSP程序的几种优化方法.pdf

  • 2010年08月05日 17:12
  • 490KB
  • 下载

优化sql 语句的几种方式

1、 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1...
  • u014236541
  • u014236541
  • 2015-11-17 18:10:25
  • 2998

MySQL的几种优化方法

没索引与有索引的区别优点: 当表中有大量记录时,若要对表进行查询,如果没用建立索引,搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据...
  • u013474436
  • u013474436
  • 2015-11-18 16:13:12
  • 7207

MySQL查询优化的几种思路和方法

整理的一些mysql查询存储的优化思路和方法
  • RonghuiMO
  • RonghuiMO
  • 2017-03-08 20:44:40
  • 706

几种矩阵分解算法的matlab实现

  • 2018年03月17日 08:41
  • 2KB
  • 下载

常见的几种优化方法

常见的几种最优化方法 1. 梯度下降法(Gradient Descent)   梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数...
  • u012684062
  • u012684062
  • 2016-12-12 11:27:14
  • 1710

SQL Server数据库优化的几种方法.

转子:http://www.cr173.com/html/5338_1.html 巧妙优化SQL Server数据库的几种方法,在实际操作中导致查询速度慢的原因有很多,其中最为常见有...
  • silence432
  • silence432
  • 2014-06-26 09:49:59
  • 1326

SQL优化的几种方法

1.尽量不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的...
  • super_tianxinmomo
  • super_tianxinmomo
  • 2018-04-22 00:14:42
  • 94

sql优化的几种方法

我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享!  (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效):  ORACLE...
  • qq_405930170
  • qq_405930170
  • 2017-04-26 08:47:59
  • 610
收藏助手
不良信息举报
您举报文章:几种优化方法的Matlab实现
举报原因:
原因补充:

(最多只允许输入30个字)