利用 MATLAB 编程实现拟 Newton 法求解无约束最优化问题。

本文章包含以下内容

1、画出 DFP 拟 Newton 法的算法流程图;

2、MATLAB 编写程序(命令式 M 文件),用分别用黄金分割算法精确搜索与 Wolfe-Powell 不精确搜索的 DFP 拟 Newton 法,求解如下问题:

\LARGE \min f(x)=100(x_2-x_1^2)^2+(1-x_1)^2

        精度为 0.001,初始点为(-1,1)。

3、MATLAB 编写程序(命令式 M 文件),用分别用黄金分割算法精确搜索与 Wolfe-Powell 不精确搜索的 BFGS 拟 Newton 法,求解如下问题:

\LARGE \min f(x)=100(x_2-x_1^2)^2+(1-x_1)^2

        精度为 0.001,初始点为(-1,1)。

 数值微分法,Wolfe-Powell 非精确一维搜索代码链接

一维搜索,进退法,黄金分割法代码链接

本实验中函数用单独function计算

function y=f(x)
if(length(x)==1)
    global xk;
    global pk;
    x=xk+x*pk;
end
y=100*(x(2)-x(1)^2)^2+(1-x(1))^2;

1、画出 DFP 拟 Newton 法的算法流程图;

利用 MATLAB 编程实现拟 Newton 法求解无约束最优化问题。_第1张图片

 

2、MATLAB 编写程序(命令式 M 文件),用分别用黄金分割算法精确搜索与 Wolfe-Powell 不精确搜索的 DFP 拟 Newton 法,求解如下问题:

\LARGE \min f(x)=100(x_2-x_1^2)^2+(1-x_1)^2

        精度为 0.001,初始点为(-1,1)。

黄金分割算法精确搜索的 DFP 拟 Newton 法

function x_=DFP_hjfg(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    pk=-(Hk*g0')';   %默认都是列向量
    %step 3
     %这两个函数见之前代码(matlab无约束最优化的一般算法)
    [a,b,c]=jintuifa(0,0.1);
    a=huangjinfenge(a,c,10^-4);
    %step 4
    xk=xk+a*pk;
    g1=shuzhiweifenfa(xk);
    %step 5
    %范数用的是平方和开根号
    if sqrt(sum(g1.^2))<=e
        x_=xk;
        return;
    end
    sk=(a*pk)'; %x(k+1)-x(k)=a*pk
    yk=(g1-g0)';
    %step 6
    Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk);
    g0=g1;
end

Wolfe-Powell 不精确搜索的 DFP 拟 Newton 法

function x_=DFP_Wolfe(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    pk=-(Hk*g0')';   %默认都是列向量
    %step 3
    %一维搜索求ak
    a=Wolfe_Powell(xk,pk);
    %step 4
    xk=xk+a*pk;
    g1=shuzhiweifenfa(xk);
    %step 5
    %范数用的是平方和开根号
    if sqrt(sum(g1.^2))<=e
        x_=xk;
        return;
    end
    sk=(a*pk)'; %x(k+1)-x(k)=a*pk
    yk=(g1-g0)';
    %step 6
    Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk);
    g0=g1;
end

3、MATLAB 编写程序(命令式 M 文件),用分别用黄金分割算法精确搜索与 Wolfe-Powell 不精确搜索的 BFGS 拟 Newton 法,求解如下问题:

\LARGE \min f(x)=100(x_2-x_1^2)^2+(1-x_1)^2

        精度为 0.001,初始点为(-1,1)。

黄金分割算法精确搜索的 BFGS 拟 Newton 法

function x_=BFGS_hjfg(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    pk=-(Hk*g0')';   %默认都是列向量
    %step 3
    %这两个函数见之前代码(matlab无约束最优化的一般算法)
    [a,b,c]=jintuifa(0,0.1);
    a=huangjinfenge(a,c,10^-4);
    %step 4
    xk=xk+a*pk;
    g1=shuzhiweifenfa(xk);
    %step 5
    %范数用的是平方和开根号
    if sqrt(sum(g1.^2))<=e
        x_=xk;
        return;
    end
    sk=(a*pk)'; %x(k+1)-x(k)=a*pk
    yk=(g1-g0)';
    %step 6
    wk=(yk'*Hk*yk)^0.5*(sk/(yk'*sk)-(Hk*yk)/(yk'*Hk*yk));
    Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk)+wk*wk';
    g0=g1;
end

Wolfe-Powell 不精确搜索的 BFGS 拟 Newton 法

function x_=BFGS_Wolfe(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    pk=-(Hk*g0')';   %默认都是列向量
    %step 3
    %一维搜索求ak
    a=Wolfe_Powell(xk,pk);
    %step 4
    xk=xk+a*pk;
    g1=shuzhiweifenfa(xk);
    %step 5
    %范数用的是平方和开根号
    if sqrt(sum(g1.^2))<=e
        x_=xk;
        return;
    end
    sk=(a*pk)'; %x(k+1)-x(k)=a*pk
    yk=(g1-g0)';
    %step 6
    wk=(yk'*Hk*yk)^0.5*(sk/(yk'*sk)-(Hk*yk)/(yk'*Hk*yk));
    Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk)+wk*wk';
    g0=g1;
end

调用命令式文件:

clear
clc
x=[-1,1];
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
H=[1 0;0 1]
fprintf('=========================\n');
fprintf('精确搜索的DFP拟Newton法:\n');
x_=DFP_hjfg(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的DFP拟Newton法:\n');
x_=DFP_Wolfe(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('精确搜索的BFGS拟Newton法:\n');
x_=BFGS_hjfg(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的BFGS拟Newton法:\n');
x_=BFGS_Wolfe(10^-3,x,H);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));

结果:

利用 MATLAB 编程实现拟 Newton 法求解无约束最优化问题。_第2张图片

 

你可能感兴趣的:(matlab,算法,开发语言)