用POWELL法求极小值:Rosenbrock函数

函数:\phi =(1-x)^{^{2}}+100(y-x^{^{2}})^{2}

一、题目分析:

       在数学最优化中,Rosenbrock 函数是一个用来测试最优化算法性能的非凸函数,由 Howard Harry Rosenbrock 在 1960 年提出 。也称为 Rosenbrock 山谷或 Rosenbrock 香 蕉函数,也简称为香蕉函数。Rosenbrock 函数的定义如下:

f(x,y)=(a-x)^{2}+b(y-x^{^{2}})^{2}

       Rosenbrock函数的每个等高线大致呈抛物线形,其全域最小值也位在抛物线形的山谷中(香蕉型山谷)。

\phi =(1-x)^{^{2}}+100(y-x^{^{2}})^{2} 函数图像

 二、基本方法原理

鲍威尔(Powell)法是直接利用函数值来构造共辄方向的一种共辄方向法。其基本思想是:在不用导数的前提下,在迭代中逐次构造共辄方向。鲍威尔的基本算法是:在每一轮迭代中总有一个始点(第一轮的始点是任选的初始点)和n个线性独立的搜索方向。从始点出发顺次沿n个方向作一维搜索得一终点,由始点和终点决定了一个新的搜索方向。用这个方向替换原来n个方向中的一个,于是形成新的搜索方向组。替换的原则是去掉原方向组的第一个方向而将新方向排在原方向的最后。此外规定,从这一轮的搜索终点出发沿新的搜索方向作一维搜索而得到的极小点,作为下一轮迭代的始点。这样就形成算法的循环。因为这种方法在迭代中逐次生成共辄方向,而共辄方向是较好的搜索方向,所以鲍威尔法又称方向加速法。

针对二维情况,鲍威尔法的寻优过程如图所示。

 图 二维正定函数得Powell法

 

程序

主程序powell.m

clear all
clc
h0=0.1;
x0=[0,0];
e=[1,0;0,1];
eps = 1e-6;
n=2;
for k=1:100000
 for i=1:n 
 x01=x0(1);x02=x0(2);d=e(i,:); 
 F0=ff(x0(1),x0(2));
 opt_step=goldsection(x01,x02,d,h0);
 x(i,:)=x0+opt_step*d; 
 F(i)=ff(x(i,1),x(i,2));
 D(i)=F(i)-F0;
 end
 for i=2:n 
 x01=x(i-1,1);x02=x(i-1,2);d=e(i,:);
 opt_step=goldsection(x01,x02,d,h0);
 x(i,:)=x(i-1,:)+opt_step*d; 
 F(i)=ff(x(i,1),x(i,2));
 D(i)=F(i-1)-F(i);
 end
 if abs(x(n,:)-x0)<1e-4%收敛条件
 break;
 end
 d=x(n,:)-x0;
 x(n+1,:)=2*x(n,:)-x0;
 [D_m,j]=max(D);
 F2=F(n);F3=ff(x(n+1,1),x(n+1,2));
 if F3<F0 && (F0-2*F2+F3)*(F0-F2-D_m)^2>=D_m/2*(0-F3)^2
 x01=x(n,1);x02=x(n,2);
 opt_step=goldsection(x01,x02,d,h0); 
 opt_step;
 x(n+1,:)=x(n,:)+opt_step*d;
 e(j,:)=[];
 e(n,:)=d;
 x0=x(n+1,:);
 x_d(k,:) = x0; %%记录迭代路径
 else 
 if F2<F3
 x0=x(n,:);
 else
 x0=x(n+1,:);
 x_d(k,:) = x0; %%记录迭代路径
 end 
 end
end
disp('最优化结果 x0')
disp(x0)
F_x0 = ff(x0(1),x0(2));
disp('最优化结果最小函数值 F_x0')
disp(F_x0)
disp(k)
x_road = x_d(:,1);
y_road = x_d(:,2);
z_road = (1 - x_road).^2 + 100 .* (y_road - x_road.^2).^2;
xx = -0.5:0.05:1.2;
yy = -0.5:0.05:1.2;
[X,Y] = meshgrid(xx,yy);
Z = (1-X).^2 + 100 .* (Y - X.^2).^2 ;
figure
mesh(X,Y,Z);
xlabel('x')
ylabel('y')
zlabel('z')
hold on
plot3(x_road,y_road,z_road,'r*')

 子程序goldsection.m

function opt_step=goldsection(x01,x02,d,h0)
l=0.618; 
[a,b]=search2(x01,x02,d,h0); 
a1=b-l*(b-a);y1=ff(x01+d(1)*a1,x02+d(2)*a1);
a2=a+l*(b-a);y2=ff(x01+d(1)*a2,x02+d(2)*a2);
for n=1:100
 if y1>=y2
 x1(n)=a1;x2(n)=a2;yp1(n)=y1;yp2(n)=y2;
 a=a1;a1=a2;y1=y2;
 a2=a+l*(b-a);y2=ff(x01+d(1)*a2,x02+d(2)*a2);
 else
 x1(n)=a1;x2(n)=a2;yp1(n)=y1;yp2(n)=y2;
 b=a2;a2=a1;y2=y1;
 a1=b-l*(b-a);y1=ff(x01+d(1)*a1,x02+d(2)*a1);
 end
 
 aa(n)=(a+b)/2; 
 y(n)=ff(x01+d(1)*aa(n),x02+d(2)*aa(n));
 e(n)=abs(b-a);
 opt_step=(a+b)/2;
 if abs(b-a)<1e-5
 break;
 end
end

子程序 search2.m

function [a,b]=search2(x01,x02,d,h0) 
a1=0; y1=ff(x01+d(1)*a1,x02+d(2)*a1);
h=h0;
a2=h; y2=ff(x01+d(1)*a2,x02+d(2)*a2);
if y2>y1 
 h=-h;
 a3=a1;y3=y1;
 a1=a2;y1=y2;
 a2=a3;y2=y3;
end
a3=a2+h;y3=ff(x01+d(1)*a3,x02+d(2)*a3);
while y3<y2
 h=2*h;
 a1=a2;y1=y2;
 a2=a3;y2=y3;
 a3=a2+h; y3=ff(x01+d(1)*a3,x02+d(2)*a3); 
end
if h>0
 a=a1;b=a3;
else
 a=a3;b=a1;
end

目标函数ff.m

function y=ff(x1,x2) 
y =(1-x1)^2+100*(x2-x1^2)^2;

对于不同的初始点进行优化仿真得出结果如下:

 搜索路径如下图所示:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值