利用 MATLAB 编程实现共轭梯度法求解无约束最优化问题

本文章包含以下内容

1、FR 共轭梯度法的算法流程图;

2、MATLAB 编写 FR 共轭梯度法求解无约束优化问题的函数,要求采用 黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设 为 epson 可调);

3、MATLAB 编写 n 步重新开始的 FR 共轭梯度法求解无约束优化问题的 函数,要求采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设为 epson 可调);

4、MATLAB 编写 FR 共轭梯度法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函数式 M 文件, 精度设为 epson 可调);

5、MATLAB 编写 n 步重新开始的 FR 共轭梯度法求解无约束优化问题的 函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函 数式 M 文件,精度设为 epson 可调);

6、MATLAB 编写程序(命令式 M 文件),分别利用精确搜索和不精确搜索 的共轭梯度法,求解如下问题:

\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.FR 共轭梯度法的算法流程图

利用 MATLAB 编程实现共轭梯度法求解无约束最优化问题_第1张图片

2、FR 共轭梯度法求解无约束优化问题的函数,采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设 为 epson 可调);

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

3、n 步重新开始的 FR 共轭梯度法求解无约束优化问题的函数,采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设为 epson 可调);

function xk=FR_n_hjfg(e,x,n)
global xk;
global pk;
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
k=1;
xk=x;
while 1
    %step 2
    %一维搜索求ak
    %这两个函数见之前代码(matlab无约束最优化的一般算法)
    [a,b,c]=jintuifa(0,0.1);
    a=huangjinfenge(a,c,10^-4);
    %step 3
    xk=xk+a*pk;
    g1=shuzhiweifenfa(xk);
    %step 4
    %范数用的是平方和开根号
    if sqrt(sum(g1.^2))<=e
        return;
    end
    %step 5
    if(mod(k,n)==0)
        pk=-g1;
    else
        b=(g1*g1')/(g0*g0');
        pk=-g1+b*pk;
    end
    %step 6
    k=k+1;
    g0=g1;
end

4、FR 共轭梯度法求解无约束优化问题的函数,采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函数式 M 文件, 精度设为 epson 可调);

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

5、n 步重新开始的 FR 共轭梯度法求解无约束优化问题的函数,采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函 数式 M 文件,精度设为 epson 可调);

function xk=FR_n_Wolfe(e,x,n)
global xk;
global pk;
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
k=1;
xk=x;
while 1
    %step 2
    %一维搜索求ak
    a=Wolfe_Powell(xk,pk);
    %step 3
    xk=xk+a*pk;
    g1=shuzhiweifenfa(xk);
    %step 4
    %范数用的是平方和开根号
    if sqrt(sum(g1.^2))<=e
        return;
    end
    %step 5
    if(mod(k,n)==0)
        pk=-g1;
    else
        b=(g1*g1')/(g0*g0');
        pk=-g1+b*pk;
    end
    %step 6
    k=k+1;
    g0=g1;
end

6、分别利用精确搜索和不精确搜索 的共轭梯度法,求解如下问题:

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

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

clear
clc
n=10;
x=[-1,1];
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
fprintf('n=%9f\n',n);
fprintf('=========================\n');
fprintf('精确搜索的共轭梯度法:\n');
x_=FR_hjfg(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的共轭梯度法:\n');
x_=FR_Wolfe(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('n步重新开始的精确搜索的共轭梯度法:\n');
x_=FR_n_hjfg(10^-3,x,n);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('n步重新开始的不精确搜索的共轭梯度法:\n');
x_=FR_n_Wolfe(10^-3,x,n);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));

结果:

利用 MATLAB 编程实现共轭梯度法求解无约束最优化问题_第2张图片

你可能感兴趣的:(matlab,算法)