📄 liziqun_tanli.m
字号:
function [X,V,t,Pg,Z]=liziqun_tanli(F,dF,X0,V0,M,n,d,epsilon,iter)
for i=1:n
f0(i)=feval(F,X0(i,:));
end
Pi=X0;
Pg=X0(1,:);
for i=2:n
if f0(i)<feval(F,Pg)
Pg=X0(i,:);
end
end
Z=zeros(1,5+iter);
a=feval(F,Pg);
Z(5)=a;
k=1;l=1;q1=2;q2=2;
for t=1:iter
for i=1:n
I(i)=k*f0(i);
s(i)=I(i)/M(i);
end
for i=1:n
for j=1:d
u(i,j)=V0(i,j)+q1*rand()*(Pi(i,j)-X0(i,j))+q2*rand()*(Pg(j)-X0(i,j));
end
u(i,:)=u(i,:)/norm(u(i,:));
V(i,:)=s(i)*u(i,:);
X(i,:)=X0(i,:)+V(i,:);
end
for i=1:n
f(i)=feval(F,X(i,:));
if f(i)<feval(F,Pi(i,:))
Pi(i,:)=X(i,:);
end
end
Pg1=X(1,:);
for i=2:n
if f(i)<feval(F,Pg1)
Pg1=X(i,:);
end
end
b=feval(F,Pg1);
Z(t+5)=b;
if Pg1<Pg
Pg=Pg1;
end
X0=X;
V0=V;
f0=f;
if feval(F,Pg)<epsilon
break;
end
end
shg
clf reset
set(gcf,'color','white','menubar','none','numbertitle','off','name','Fractal Fern')
x=[.5;.5];
h=plot(x(1),x(2),'.');
darkgreen=[0 2/3 0];
set(h,'markersize',1,'color',darkgreen,'erasemode','none');
axis([-3 3 0 10])
axis off
stop=uicontrol('style','toggle','string','stop','background','white');
drawnow
p=[.85 .92 .99 1.00];
A1=[.85 .04;-.04 .85];b1=[0;1.6];
A2=[.02 -.26;.23 .22];b2=[0;1.6];
A3=[-.15 .28;.26 .24];b3=[0;.44];
A4=[0 0;0 .16];
cnt=1;
tic
while ~get(stop,'value')
r=rand;
if r<p(1)
x=A1*x+b1;
elseif r<p(2)
x=A2*x+b2;
elseif r<p(3)
x=A3*x+b3;
else
x=A4*x;
end
set(h,'xdata',x(1),'ydata',x(2));
cnt=cnt+1;
drawnow
end
t=toc;
s=sprintf('%8.0f points in %6.3f seconds',cnt,t);
text(-1.5,-0.5,s,'fontweight','bold');
set(stop,'style','pushbutton','string','close','callback','close(gcf)')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -