Mandelbrot集和Julia集的分形图之matlab实现
基于逃逸时间算法 1. Mandelbrot集
function Mandelbrot(res,iter,xc,yc,xoom) %Mandelbrot
% res是目标分辨率,iter是循环次数,(xc,yc)是图像中心,xoom是放大倍数 x0=xc-2/xoom;x1=xc+2/xoom; y0=yc-2/xoom;y1=yc+2/xoom; x=linspace(x0,x1,res); y=linspace(y0,y1,res); [xx,yy]=meshgrid(x,y); z=xx+yy*1i; C=z;
N=zeros(res,res); %初始化N,最终根据N,对各点进行染色 tic % 显示tic和toc间的程序运行时间 for k=1:iter
z=z.^2+C; %对空间上每点都进行迭代
N(abs(z)>4)=k; %逃逸半径为4,诺某点逃逸,记录逃逸时间k,未逃逸则时间为0 z(abs(z)>4)=0; C(abs(z)>4)=0; end
imshow(N,[]); toc end
>>Mandelbrot(512,100,0,0,1)
>>Mandelbrot(512,128,-1.478,0,300)
2.Julia集
function Julia(c,res,iter,xc,yc,xoom) %Julia集
%c为参数, res是目标分辨率,iter是循环次数,(xc,yc)是图像中心,xoom是放大倍数 x0=xc-2/xoom;x1=xc+2/xoom; y0=yc-2/xoom;y1=yc+2/xoom; x=linspace(x0,x1,res); y=linspace(y0,y1,res); [xx,yy]=meshgrid(x,y); z=xx+yy*1i;
N=zeros(res,res); C=c*ones(res,res); for k=1:iter z=z.^2+C;
N(abs(z)>2)=k; C(abs(z)>2)=0;
z(abs(z)>2)=0; end
colormap jet; image(x,y,N); axis square; end
>>Julia(i,512,200,0,0,1) >> Julia(i,512,200,0,0,2000)
上面两张图很好的反映分形的自相似性,右图是左图关于原点放大2000倍的情况。
>>Julia(0.1+0.7i,512,200,0,0,1)
>>Julia(-0.8-0.21i,512,200,0,0,1)
3.newton分形
参考:http://tieba.http://www.china-audit.com//f?kz=1469535720
附注:
4*.matlab的矩阵运算和循环运算比较
function test(N) A=rand(N); tic
B=A>0.5; toc tic
for i=1:N for j=1:N
if A(i,j)>0.5 B(i,j)=1; else B(i,j)=0; end end end toc
运行程序:
>> test(100)
Elapsed time is 0.000108 seconds. Elapsed time is 0.000476 seconds. >> test(1000)
Elapsed time is 0.029430 seconds. Elapsed time is 0.053551 seconds. >> test(10000)
Elapsed time is 0.565822 seconds. Elapsed time is 24.152359 seconds.
从中可知在matlab中完成同样的操作,矩阵效率要远远优于循环效率。本文的两个程序均包含循环,当数据量大时,运行时间会很长。
相关推荐: