MATLAB无约束多维极值之坐标轮换法

一、算法原理

坐标轮换法亦称变量轮换法时一种求无约束最优化问题的降维方法.其迭代过程是沿不同的坐标方向轮换地进行搜索.

例 二维极值

设初始点为x0=[1,1],先只改变一个变量,其他变量视为常数,进行一维搜索,得到最优点x01:

x01=x0+e1*a,式中e1=[0,1]为方向,a为待求步长。通过min f(x0+e1*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;再换一个变量,同样进行一维搜索,得到最优点x02

x02=x0+e2*a,式中e1=[1,0]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;如此继续下去,直到完成一个循环,即对n个变量都轮换完毕,得到最优点x。

三维极值

设初始点为x0=[1,1,1],先只改变一个变量,其他变量视为常数,进行一维搜索,得到最优点x01:

x01=x0+e1*a,式中e1=[1,0,0]为方向,a为待求步长。通过min f(x0+e1*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;再换一个变量,同样进行一维搜索,得到最优点x02

x02=x0+e2*a,式中e1=[0,1,0]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;再换一个变量,同样进行一维搜索,得到最优点x03

x03=x0+e2*a,式中e1=[0,0,1]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。

;如此继续下去,直到完成一个循环,即对n个变量都轮换完毕,得到最优点x。

二、算法流程

三、matlab程序

%% 坐标轮换 
% syms x1 x2
f=@(x1,x2) x1.^2+x2.^2-x1*x2-10*x1-4*x2+60;
X=ZBLH(f,[0 0],1e-6,100)
function x=ZBLH(f,x0,eps,k)

x0 = x0';
m = length(x0);
n = 1;
syms alfa
while n < k
    temp = x0; %作为一个中间变量
    for i = 1:m
        e=zeros(m,1);
        e(i)=1;
        x1 = temp + alfa*e;
        f_alfa=matlabFunction(eval('f(x1(1),x1(2))'));
%          d_alfa=solve(f_alfa);
        [~,d_alfa]=huangjin(f_alfa,0,0.1,1000);
        temp = temp + d_alfa*e;
    end
    x1 = temp;
    if norm(x0 - x1) < eps
        x = x1;
        return;
    end
    x0 = x1;
end
end
function [result,x]=huangjin(f,x0,h0,n)
tol=1e-6;
[a,b]=Min_jintui(f,x0,h0);%进退法寻找搜索区间
x1=min(a,b);
x2=max(a,b);
i=1;
while i < n
    %取中间值
    a=x1+0.382*(x2-x1);
    b=x1+0.618*(x2-x1);
    fa=f(a);
    fb=f(b);
    % 判断fa  fb大小,缩小区间
    if fa < fb
        x2=b;
    else
        x1=a;
    end
    if  abs(x1-x2) < tol
        result=f((x1+x2)/2);
        x=(x1+x2)/2;
        break;
    end
    i=i+1;
end
end
%进退法寻找搜索区间
function [a,b]=Min_jintui(f,x1,h0)
%f为函数句柄
%x1为初始点
%h0为步长
x2=x1+h0;
i=1;
if f(x2) < f(x1)
    x3=x2+h0;
    h=h0;
    while f(x3) < f(x2)
        x3=x2+h;
        h=i*h;
        i=i+1;
    end
    a=x1;
    b=x3;
else
    Temp=x1;
    x1=x2;
    x2=Temp;
    h=-h0;
    x3=x2+h;
    while f(x3) < f(x2)
        x3=x2+h;
        h=i*h;
        i=i+1;
    end
    a=x3;
    b=x1;
end
end

 

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值