利用 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 共轭梯度法的算法流程图

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_));

结果:

  • 19
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值