📄 zcx.m
字号:
clear;
nn=20;%设置随机方向数
x0=[3;2];
xx=x0;
f0=getf(x0);
ii=0;
while ii<200
x0=xx;
e=zeros(2,nn);%方向矩阵
f=zeros(1,nn);%值
a=zeros(1,nn);%步长
x1=zeros(2,nn);%新点
%定义了nn个方向
for i=1:nn
e1=[2*rand(1)-1,2*rand(1)-1];
e(:,i)=e1./sqrt(e1(1)^2+e1(2)^2);
end
%找到最好的方向
for i=1:nn
e1=e(:,i);%临时变量
a(1,i)=geta(x0,e1);
x1(:,i)=x0+a(1,i).*e1;
if tj(x1(:,i))==1
x1(:,i)=x1(:,i);
f(1,i)=getf(x1(:,i));
else
x1(:,i)=[0;0];
f(1,i)=inf;
end
end
ymin=min(f);
for i=1:nn
if f(1,i)==ymin
xx=x1(:,i);
ee=e(:,i);
aa=a(1,i);
end
end
%如果找到最好方向,但是结果却扩大了的时候要缩小步长到满足条件为止
while f0<ymin
x2=xx;
a2=aa;
aa=0.7.*aa;%最优步长
xx=x0+aa*ee;%xx最优点,ee最优方向
if tj(xx)>0
ymin=getf(xx);
else
xx=x2;
aa=a2;
ymin=getf(xx);
end
end
%确定最优点和最优方向后,对步长进行扩大
e0=xx-x0;%最优方向,和ee同向,但值不一样
while f0<ymin
x2=xx;
a2=aa;
aa=1.3*aa;
xx=x0+aa*e0;
if tj(xx)>0
ymin=getf(xx);
else
xx=x2;
aa=a2;
ymin=getf(xx);
end
end
if aa<0.001||abs((getf(xx)-getf(x0))/getf(x0))<0.001
break;
end
ii=ii+1;
end
xx
getf(xx)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -