利用 MATLAB 编程实现最速下降法求解无约束最优化问题

本文章包含以下内容

        1、画出最速下降法的算法流程图;

        2、MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件);

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

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

        5、MATLAB 编写程序(命令式 M 文件),分别利用精确搜索和不精确搜索 的最速下降法,求解如下问题:

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

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

        改变初始点为(-1.2,1)重新运行,观察运行结果。

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

本实验中函数用单独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.最速下降法的算法流程图

2、MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件);

function g=shuzhiweifenfa(x)
for i = 1:length(x)
    m=zeros(1,length(x));
    m(i)=(10^-6)/2;
    g(i)=f(x+m)-f(x-m);
end
g=g/10^-6;

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

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

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

function a=Wolfe_Powell(x,pk)
%step 1
u=0.1;
b=0.5;
a=1;
n=0;
m=10^100;
%step 2
fx=f(x);
g=shuzhiweifenfa(x);
while 1
    xk=x+a*pk;
    fxk=f(xk);
    gk=shuzhiweifenfa(xk);
    if (fx-fxk)>=(-u*a*g*pk.')%(3-1)
        if (gk*pk.')>=(b*g*pk.')%(3-2)
            return;
        else
            %step 4
            n=a;
            a=min(2*a,(a+m)/2);
        end
    else
        %step 3
        m=a;
        a=(a+n)/2;
    end
end

function x=zuisuxiajiangfa_Wolfe(e,x)
%step 1
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    g=shuzhiweifenfa(x);
    %step 3
    %范数用的是平方和开根号
    if sqrt(sum(g.^2))<=e
        return;
    end
    pk=-g;
    a=Wolfe_Powell(x,pk);
    %step 4
    x=x+a*pk;
end

5、分别利用精确搜索和不精确搜索 的最速下降法,问题:

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

clear
clc
for i=1:2
    if(i==1)
        x=[-1,1];
        fprintf('=========================');
        fprintf('\nx=%f\t\t%f\n',x(1),x(2));
        fprintf('=========================\n');
    else
        x=[-1.2,1];
        fprintf('=========================');
        fprintf('\nx=%f\t\t%f\n',x(1),x(2));
        fprintf('=========================\n');
    end
    fprintf('精确搜索的最速下降法:\n');
    x_=zuisuxiajiangfa_hjfg(10^-3,x);
    fprintf('x*=%f\t%f\n',x_(1),x_(2));
    fprintf('f(x)=%f\n',f(x_));
    fprintf('不精确搜索的最速下降法\n');
    x_=zuisuxiajiangfa_Wolfe(10^-3,x);
    fprintf('x*=%f\t%f\n',x_(1),x_(2));
    fprintf('f(x)=%f\n',f(x_));
end

结果:

  • 20
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
我的思路是这样的: 最速下降法能找出全局最优点,但在接近最优点的区域内就会陷入“齿型”迭代中,使其每进行一步迭代都要花掉非常久的时间,这样长久的等待是无法忍受的,不信你就在我那个程序的第一步迭代中把精度取得很小如:0.000000001等,其实我等过一个钟都没有什么结果出来。 再者我们考究一下 牛顿迭代法求最优问题,牛顿法相对最速下降法的速度就快得多了,而且还有一个好处就是能高度逼近最优值,而不会出现死等待的现象。 如后面的精度,你可以取如:0.0000000000001等。 但是牛顿法也有缺点,就是要求的初始值非常严格,如果取不好,逼近的最优解将不收敛,甚至不是最优解。 就算收敛也不能保证那个结就是全局最优解,所以我们的出发点应该是:为牛顿法找到一个好的初始点,而且这个初始点应该是在全局最优点附近,这个初始点就能保证牛顿法高精度收敛到最优点,而且速度还很快。 思路概括如下: 1。用最速下降法在大范围找到一个好的初始点给牛顿法:(最速下降法在精度不是很高的情况下逼近速度也是蛮快的) 2。在最优点附近改用牛顿法,用最速下降法找到的点为牛顿法的初始点,提高逼近速度与精度。 3。这样两种方法相结合,既能提高逼近的精度,还能提高逼近的速度,而且还能保证是全局最优点。这就充分吸收各自的优点,扬长避短。得到理想的结果了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值