您的位置:首页 > 编程语言 > MATLAB

用matlab画Mandelbrot(曼德布罗特)图

2015-11-01 13:53 423 查看
Mandelbrot图实际上是由Mandelbrot集合构成的图像。

Mandelbrot集合的定义如下:

zn+1=z2n+cz_{n+1}=z_n^2+c

其中,c是一个复数。加入给定一个复数z0z_0,比如z0=0z_0=0,那么这个递推式会生成一个序列:[z0,z1,z2,z3,...][z_0,z_1,z_2,z_3,...]。如果这个序列收敛在一个有限值范围内,那么c就在Mandelbrot集合中。当序列中有一项的绝对值大于2时,这个序列一定趋向于无穷,一般说来,如果这个序列前60项都没有一项大于2,那么可以认为这时c就在Mandelbrot集合中。

下面的Matlab程序就是根据以上的原理写的,只不过为了使得图片更加炫酷,根据发散快慢(也即序列在第几项大于2)设置不同的颜色:

xc = 0;  %图片中心点
yc = 0;
xoom = 1;   %放大倍数
res = 512;   %分辨率
iter = 100;   %序列项数

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);
C = xx + yy * 1i;
z = zeros(size(C));
N = uint8(zeros(res, res, 3));

color = uint8(round(rand(iter, 3) * 255));

for k = 1: iter
z = z.^2 + C;
[row, col] = find(abs(z) > 2);
k1 = zeros(size(row)) + 1;
k2 = zeros(size(row)) + 2;
k3 = zeros(size(row)) + 3;

p1 = sub2ind(size(N), row, col, k1);
N(p1) = color(k, 1);
p2 = sub2ind(size(N), row, col, k2);
N(p2) = color(k, 2);
p3 = sub2ind(size(N), row, col, k3);
N(p3) = color(k, 3);
z(abs(z) > 2) = 0;
C(abs(z) > 2) = 0;
end
imshow(N);
imwrite(N, 'test.png');




通过调整中心点和放大倍数的位置,可以看到不同地方的图像

下面是在(-1.478,0),放大300倍,看到的图像



调整序列项数,以及分辨率,可以得到更加精细的图片,下面是一个5000x5000分辨率,序列项数为10000的图片

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: