利用 MATLAB 编程实现直接法求解无约束最优化问题(坐标轮换法、模式搜索法、单纯形法、Powell 改进的方向加速法)

本文章包含以下内容:

1、画出单纯形法的算法流程图;

2、MATLAB 编写坐标轮换法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);

3、MATLAB 编写模式搜索法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);

4、MATLAB 编写单纯形法求解无约束优化问题的函数(函数式 M 文件,精 度设为 epson 可调);

5、MATLAB 编写 Powell 改进的方向加速法求解无约束优化问题的函数,利 用黄金分割算法精确一维搜索(函数式 M 文件,精度设为 epson 可调);

6、MATLAB 编写程序(命令式 M 文件),分别调用 2-5 定义的 M 文件,求解 如下问题:

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

        精度为 0.001,初始点为(-1,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、坐标轮换法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);

function xk=zuobiaolunhuan(e,x)
global xk;
global pk;
%step 0
%n为函数变量数。
n=length(x);
p=eye(n);    %n阶单位矩阵
%没用到k,只存储当前迭代的值。
while 1
    %step 1
    xk=x;
    i=1;%控制循环
    while 1
        %行向量因为之前写的黄金分割默认行向量。
        %取得单位向量
        pk=p(i,:);
        %一维搜索求ak
        %这两个函数见之前代码(matlab无约束最优化的一般算法)
        [a,b,c]=jintuifa(0,0.1);
        a=huangjinfenge(a,c,10^-4);
        xk=xk+a*pk;
        if(i<n)
            i=i+1;
        else
            break;
        end
    end
    %step 2
    %范数用的是平方和开根号
    if sqrt(sum((xk-x).^2))<=e
        return;
    end
    x=xk;
    %没用到k,只存储当前迭代的值。
end

3、模式搜索法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);

function xk=moshisousuo(e,x)
global xk;
global pk;
%step 0
%n为函数变量数。
n=length(x);    %变量数
p=eye(n);    %n阶单位矩阵
%没用到k,只存储当前迭代的值。
while 1
    %step 1
    xk=x;
    i=1;%控制循环
    while 1
        %行向量因为之前写的黄金分割默认行向量。
        %取得单位向量
        pk=p(i,:);
        %一维搜索求ak
        %这两个函数见之前代码(matlab无约束最优化的一般算法)
        [a,b,c]=jintuifa(0,0.1);
        a=huangjinfenge(a,c,10^-4);
        xk=xk+a*pk;
        if(i<n)
            i=i+1;
        else
            break;
        end
    end
    %step 2
    %范数用的是平方和开根号
    if sqrt(sum((xk-x).^2))<=e
        return;
    end
    pk=xk-x;
    %一维搜索求ak
    %这两个函数见之前代码(matlab无约束最优化的一般算法)
    [a,b,c]=jintuifa(0,0.1);
    a=huangjinfenge(a,c,10^-4);
    xk=xk+a*pk;
    %step 3
    x=xk;
    %没用到k,只存储当前迭代的值。
end

4、单纯形法求解无约束优化问题的函数(函数式 M 文件,精 度设为 epson 可调);

function xk=danchunxingfa(e,x)
%step 0
b=0.5;
r=2;
n=length(x);    %变量数
p=eye(n);    %n阶单位矩阵
p=[0,0;p];
fx(n+1)=0;  %储存fx
s=zeros(n+1,n);
k=1;
while(1)%构造单纯形
    s(k,:)=x+p(k,:);
    fx(k)=f(s(k,:));
    k=k+1;
    if k>n+1
        break;
    end
end
while(1)
    %step 1
    fl=Inf;
    fh=-Inf;
    fg=-Inf;
    l=0;
    h=0;
    g=0;
    xl(n)=0;
    xh(n)=0;
    xg(n)=0;
    k=1;
    while(1)    %得到xl,xh,xg;
        if(fx(k)<fl)    %最小的
            l=k;
            xl=s(k,:);
            fl=fx(k);
        end
        if(fx(k)>fh)    %比最大的大
            g=h;    %最大变为次大
            xg=xh;
            fg=fh;
            h=k;
            xh=s(k,:);
            fh=fx(k);
        else
            if(fx(k)>fg)
                g=k;
                xg=s(k,:);
                fg=fx(k);
            end
        end
        k=k+1;
        if k>n+1
            break;
        end
    end
    %得到x_,fx_
    x_=(sum(s)-xh)/n;
    fx_=f(x_);
    k=1;
    error=0;
    while(1)    %得到error
        error=error+(fx(k)-fx_)^2;
        k=k+1;
        if k>n+1
            error=(error/(n+1))^0.5;
            break;
        end
    end
    if(error<e)
        xk=xl;
        return;
    end
    %step 2
    xm=2*x_-xh;
    fm=f(xm);
    if(fm<fl)
        xe=x_+r*(xm-x_);
        fe=f(xe);
        if(fe<fl)
            xh=xe;
        else
            xh=xm;
        end
            s(h,:)=xh;  %修改单纯形和fx
            fx(h)=f(xh);
    else
        if(fm<fg)
            xh=xm;
            s(h,:)=xh;  %修改单纯形和fx
            fx(h)=f(xh);
        else
            if(fm<fh)
                xc=x_+b*(xm-x_);
                fc=f(xc);
            else
                xc=x_+b*(xh-x_);
                fc=f(xc);
            end
            if(fc<fh)
                xh=xc;
                s(h,:)=xh;  %修改单纯形和fx
                fx(h)=f(xh);
            else
                k=1;
                while(1)%构造新单纯形
                    s(k,:)=xl+(s(k,:)-xl)/2;
                    fx(k)=f(s(k,:));%计算新的fx
                    k=k+1;
                    if k>n+1
                        break;
                    end
                end
            end
        end
    end
end

5、 Powell 改进的方向加速法求解无约束优化问题的函数,利用黄金分割算法精确一维搜索(函数式 M 文件,精度设为 epson 可调);

function xk=Powell(e,x)
global xk;
global pk;
%step 1
%n为函数变量数。
n=length(x);    %变量数
p=eye(n);    %n阶单位矩阵
fx(n+1)=0;
fx(1)=f(x);
%没用到k,只存储当前迭代的值。
%step 1
while 1
    %step 2
    xk=x;
    i=1;%控制循环
    m=0;
    d=-Inf;
    while 1
        %行向量因为之前写的黄金分割默认行向量。
        %取得方向向量
        pk=p(i,:);
        %一维搜索求ak
        %这两个函数见之前代码(matlab无约束最优化的一般算法)
        [a,b,c]=jintuifa(0,0.1);
        a=huangjinfenge(a,c,10^-4);
        xk=xk+a*pk;
        fx(i+1)=f(xk);
        fx_f=fx(i)-fx(i+1);  %方便算德尔塔
        if(d<fx_f)   %求出d和m
            m=i;
            d=fx_f;
        end
        %step 3(控制循环)
        if(i<n)
            i=i+1;
        else
            break;
        end
    end
    %step 4
    %范数用的是平方和开根号
    xk_x=sqrt(sum((xk-x).^2));%方便算pn
    if xk_x<=e
        return;
    end
    %step 5
    f_=f(2*xk-x);
    %step 6
    if((f_>=fx(1))|(fx(1)-2*fx(n+1)+f_)*(fx(1)-fx(n+1)-d)^2>=0.5*(fx(1)-f_)^2*d)
        fx(1)=fx(n+1);
        x=xk;
    else
        %step 7
        while(1)
            p(m,:)=p(m+1,:);
            if(m<n-1)
                m=m+1;
            else
                break;
            end
        end
        p(n,:)=(xk-x)/xk_x;
        %step 8
        pk=p(n,:);
        %一维搜索求ak
        %这两个函数见之前代码(matlab无约束最优化的一般算法)
        [a,b,c]=jintuifa(0,0.1);
        a=huangjinfenge(a,c,10^-4);
        x=xk+a*pk;
        fx(1)=f(x);
    end
end

6、程序(命令式 M 文件),分别调用 2-5 定义的 M 文件,求解 如下问题:

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

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

clear
clc
x=[-1,1];
e=0.001;
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
fprintf('e= %f\n',e);
fprintf('=========================\n');
fprintf('坐标轮换法:\n');
x_=zuobiaolunhuan(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('=========================\n');
fprintf('模式搜索法:\n');
x_=moshisousuo(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('=========================\n');
fprintf('单纯形法:\n');
x_=danchunxingfa(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('=========================\n');
fprintf('Powell 改进的方向加速法:\n');
x_=Powell(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));

结果:

 可以明显地看出,四种方法的准确性是逐渐上升的

  • 14
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值