坐标轮换法是将多维问题转化为一系列一维问题的求解方法,它将多变量的优化问题轮流转化为单变量的优化问题,因此又称为变量轮换法。这种方法在搜索过程中只需要目标函数的信息,而不需要求解目标函数的导数。
坐标轮换法轮流沿坐标方向搜索,每次只允许一个变量变化,其余变量保持不变。以二元函数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。这个二维问题经过沿和e1和e2方向的两次一维搜索完成了第一轮迭代。接着的第二轮迭代则是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
运行结果如下: