?? hj10.m
字號:
%HJ模式搜索的改進版
%主要改進在于對好點的搜索,模式移動不變
%改進,即使記錄變化的量
x0=[-3;-1;-3;-1]; %初始點
n=4; %參數個數n
E=eye(n); %搜索方向
x=zeros(n,2*n); %搜索點
y=zeros(1,2*n); %d對應搜索點的值
h=1; %初始步長
l=1; %作為點間距離
yc=1; %初始值,
a=1.618; %步長放大因子
x1=x0;
e=0.0000001; %截至精度
M=2000; %最大迭代次數
%best=0
%better=0
tic
for k=1:M
if (l<e|yc<e)
break;
end
for i=1:n %2n個搜索方向,函數值
x(:,2*i-1)=x1+h*E(:,i);
x(:,2*i)=x1-h*E(:,i);
y(2*i-1)=fm(x(:,2*i-1));
y(2*i)=fm(x(:,2*i));
end
ybest=y(1); %最好點
ybetter=y(1); % 次好點
xbest=x(:,1);
xbetter=x(:,1);
for i=2:2*n %查找最好點、次好點,并記錄相應的函數值
if y(i)<ybetter
if y(i)<ybest
ybetter=ybest;
xbetter=xbest;
ybest=y(i);
xbest=x(:,i);
else
ybetter=y(i);
xbetter=x(:,i);
end
end
end
xtemp=xbest+xbetter; %根據最好點和次好點新產生的點
ytemp=fm(xtemp);
if ytemp<ybest
xbest=xtemp;
end
j=0;
while(j<10*n)
%for j=1:100
j=j+1;
xp=xbest+a*(xbest-x1); %模式移動
yp=fm(xp);
if yp<ybest;
x1=xbest;
xbest=xp;
y1=ybest;
ybest=yp;
l=norm(xbest-x1); %點間距離
yc=abs(ybest-y1); %y的改變量
%l=norm(xp-xbest);
%if (abs(ybest-yp)<e)
% break;
% end
else
%l=norm(xp-xbest);
if (l<e|yc<e)
break;
end
if a<=0.3
a=1.618;
x1=xbest;
%l=0.382*l;
h=0.382*l; %取0。382效果最好,或大或小,均不好
break;
else
a=0.5*a;
end
end
end
%l=norm(xp-xbest); %只要模式移動100次還沒停止,就退出
%if (l<e|abs(ybest-yp)<e)
% break;
%end
end
tic
ybest
xbest
k
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -