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

Mandelbrot图实际上是由Mandelbrot集合构成的图像。

Mandelbrot集合的定义如下:

zn+1=z2n+c

其中,c是一个复数。加入给定一个复数 z0 ,比如 z0=0 ,那么这个递推式会生成一个序列: [z0,z1,z2,z3,...] 。如果这个序列收敛在一个有限值范围内,那么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');

用matlab画Mandelbrot(曼德布罗特)图_第1张图片

通过调整中心点和放大倍数的位置,可以看到不同地方的图像
下面是在(-1.478,0),放大300倍,看到的图像
用matlab画Mandelbrot(曼德布罗特)图_第2张图片

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

你可能感兴趣的:(杂项)