无约束一维极值——坐标轮换法

坐标轮换法是将多维问题转化为一系列一维问题的求解方法,它将多变量的优化问题轮流转化为单变量的优化问题,因此又称为变量轮换法。这种方法在搜索过程中只需要目标函数的信息,而不需要求解目标函数的导数。

坐标轮换法轮流沿坐标方向搜索,每次只允许一个变量变化,其余变量保持不变。以二元函数f(x1,x2)为例,说明坐标轮换法的迭代过程。

如下图所示,选定的初始点X(0)作为第一轮的始点X0(1),保持X2不变而沿X1方向e1=[1,0]T作一维搜索,确定其最优步长a1(1) ,即可获得第一轮的第一 个 迭代点X1(1)=X0(1)+a1(1)e1

然后以X1(1)为新起点,改沿X2方向e1=[0,1]T作一维搜索,确定其最优步长a2(1),可得第一轮的第二个迭代点X2(1)=X1(1)+a2(1)e2。这个二维问题经过沿和e1e2方向的两次一维搜索完成了第一轮迭代。接着的第二轮迭代则是X0(2)←X2(1), X1(2)= X0(2) + a1(2)e1,X2(2)= X1(2) + a2(2)e2

按照同样的方式进行第三轮、第四…迭代。随着迭代的进行,目标函数值不断
下降,最后的迭代点必将逼近该二维目标函数的最优点。

迭代的终止准则可以采用点距准则,即在一轮迭代后,终点与始点的距离小于收敛
精度ε,则迭代停止。

对n维优化问题,先将(n- 1)个变量固定不动,只对第一个变量进行一维搜索得到
最优点X1(1)。然后,再对第二个变量进行一维搜索到X2(1)点等。总之,每次都固定(n- 1)个变量不变,只对目标函数的一个变量进行一维搜索, 当n个变量X1,X2,…,Xn,依次进行过一轮搜索之后,即完成一轮迭代计算。若未收敛,则又从前一轮的最末点开始,做下一轮迭代计算,如此继续下去,直至收敛到最优点为止。

在这里插入图片描述
在这里插入图片描述
例 使用坐标轮换法,求解下 面目标函数的无约束最优解。其中,设定精度
为0.0001 ,初始点为[4,2]。
f(x)= 10x12 + 106x22+ 10x1x2 + 96x1 + 100*x2

解:根据编写代码:

clear all;
clc;
e = input('输入精度要求e:');
X = input('输入初始点: ');
syms t s
a = 10*X(1,1)^2 + 106*X(2,1)^2 + 10*X(1,1)*X(2,1)+96*X(1,1)+ 100*X(2,1);
k = 1;
e1 = [1;0];
e2 = [0;1];
A = X;            %A矩阵用于存储每一轮变换所得解
C = X+t* e1;      %沿e1方向搜索
x1 =C(1,1);
x2 =C(2,1);
df =diff(10*x1 ^2+ 106* x2^2+ 10* x1*x2+96+x1 + 100* x2);
t = solve(df);
X = X+t*e1;
C = X+s* e2;      %沿e2方向搜索
x1 = C(1,1);
x2 = C(2,1);
df = diff(10* x1^2 + 106*x2^2 + 10*x1*x2+96*x1 + 100*x2);
s= solve(df);
X = X+s*e2;
A =[A X];

b = 10* X(1,1)^2+ 106* X(2,1)^2+ 10* X(1,1) * X(2,1) +96* X(1,1)+ 100* X(2,1);
a =[a b];
B = A(:,k+ 1)- A(:,k);
while double(sqrt(B(1,1)^2 + B(2,1)^2)) > e
    syms t s
    C = X+t*e1;     %沿e1方向搜索
    x1 =C(1,1);
    x2=C(2,1);
    df =diff(10*x1^2 + 106*x2^2 + 10*x1*x2 + 96*x1 + 100*x2);
    t = solve(df);
    X = X + t*e1;
    C = X + s*e2;     %沿e2方向搜索
    x1 = C(1,1);
    x2 = C(2,1);
    df= diff(10*x1^2 + 106*x2^2 + 10*x1*x2 + 96*x1 + 100*x2);
    s = solve(df);
    X = X + s*e2;
    A = [A X];
    b =10*X(1,1)^2+ 106* X(2,1)^2+ 10*X(1,1) *X(2,1) +96*X(1,1) + 100* X(2,1);
    a =[a b];
    B =A(:,k+ 1)-A(:,k);
    k=k+ 1;
end
Y= 10* X(1,1)^2+ 106* X(2,1)^2+ 10*X(1,1)*X(2,1)+96* X(1,1)+ 100* X(2,1);
A
a
fprintf('轮换次数k= %f\n',k);
X
Y

运行结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值