function expl set(gcf,'rend','z'); set(gcf,'doublebuffer','on'); fF=inline('1+0*x','x','y'); dinit=inline('dcircle(p,0,0,.2)','p'); lssim(fF,dinit,1e-2,70,1,'F=1'); fF=inline('1+x+y','x','y'); dinit=inline('dcircle(p,-.5,-.5,.2)','p'); lssim(fF,dinit,1e-2,150,4,'F=1+x+y'); fF=inline('1+0*x','x','y'); dinit=inline('drect0(p,-.5,.5,-.5,.5)','p'); lssim(fF,dinit,1e-2,35,1,'F=1'); fF=inline('1+0*x','x','y'); dinit=inline('-drect0(p,-.5,.5,-.5,.5)','p'); lssim(fF,dinit,1e-2,35,1,'F=-1'); fF=inline('1+0*x','x','y'); dinit=inline('dunion(dcircle(p,-.5,0,.2),dcircle(p,.5,0,.2))','p'); lssim(fF,dinit,1e-2,40,1,'F=1'); function lssim(fF,dinit,dt,niter,pltfreq,tit) h=0.025; [xx,yy]=meshgrid(-1.1:h:1.1,-1.1:h:1.1); p=[xx(:),yy(:)]; zz=reshape(dinit(p),size(xx)); plt(xx,yy,zz,tit) pause for iter=1:niter F=fF(xx,yy); zz=lsstep(zz,F,h,dt); zz=h*reinit2dc(zz/h,1,[.2,1.5]); if mod(iter,pltfreq)==0, plt(xx,yy,zz,tit); end end pause function plt(xx,yy,zz,tit) %surf(xx,yy,0*xx,zz) clf hold on,contour(xx,yy,zz,-1:.25:1,'c');hold off hold on,[foo,handle]=contour(xx,yy,zz,[0,0],'k');set(handle,'linewidth',2);hold off view(2),axis equal,axis([-1,1,-1,1]) title(tit,'fontsize',24,'fontname','times','fontangle','italic'); drawnow function zz=lsstep(zz,F,h,dt) [m,n]=size(zz); Dnx=zeros(m,n); Dpx=zeros(m,n); Dny=zeros(m,n); Dpy=zeros(m,n); Dx=(zz(2:m,:)-zz(1:m-1,:))/h; Dy=(zz(:,2:n)-zz(:,1:n-1))/h; Dnx(2:m,:)=Dx; Dpx(1:m-1,:)=Dx; Dny(:,2:n)=Dy; Dpy(:,1:n-1)=Dy; delp=sqrt(max(Dnx,0).^2+min(Dpx,0).^2+ ... max(Dny,0).^2+min(Dpy,0).^2); deln=sqrt(max(Dpx,0).^2+min(Dnx,0).^2+ ... max(Dpy,0).^2+min(Dny,0).^2); upd=-dt*(max(F,0).*delp+min(F,0).*deln); zz(:)=zz(:)+upd(:);