曼德勃羅(Mandelbrot)集合與其編程實現


一、從科赫雪花談起

設想一個邊長為1的等邊三角形(如下圖所示),取每邊中間的三分之一,接上去一個形狀完全相似的但邊長為其三分之一的三角形,結果是一個六角形。現在取六角形的每個邊做同樣的變換,即在中間三分之一接上更小的三角形,以此重復,直至無窮。外界的變得原來越細微曲折,形狀接近理想化的雪花。這個圖形的名字叫柯赫雪花。1904年,瑞典數學家柯赫首次描述了一種后來以其名字命名的曲線——柯赫曲線,而柯赫雪花就是由柯赫曲線所圍成的一個封閉的圖形。柯赫雪花有很多奇妙的性質。例如,柯赫雪花的周長趨於無窮,而柯赫雪花的面積卻是有限的!此外,柯赫雪花也體現了一種(遞歸的)自相似性,即當把圖形的局部放大,它會呈現出一種與整體(或整體的部分)之間的驚人形似性。


二、分形

盡管類似於柯赫雪花這樣的自相似圖形早已經出現。但是真正把這些問題系統地發展成一門學問,則是在二十世紀下半頁。數學家本華·曼德勃羅(Benoit B. Mandelbrot)把這些部分與整體以某種方式相似的形體稱為分形(fractal)。1975年,他創立了分形幾何學(Fractal Geometry)。在此基礎上,形成了研究分形性質及其應用的科學,稱為分形理論(Fractal Theory)。因此,曼德勃羅也被稱為“分形學之父”。現在,分形理論已經發展成為一門十分風靡和活躍的新理論、新學科,特別是把分形理論和混沌理論結合之后,更是衍生出一大片廣闊的研究天地。分形的世界與我們平常所研究的幾何學中很多直觀的常識之間具有巨大的沖突。例如,平常我們說一個幾何圖形的維度,那么這個維度一般都應該是整數。例如平面上一個矩形就是二維的,空間中一個球體就是三維的。但是在分析幾何中,幾何圖形的維度都是不是整數而是分數。這個維度又稱為豪斯多夫維或豪斯多夫-貝塞科維奇維(Hausdorff-Becikovich Dimesion),它是由數學家豪斯多夫於1918年引入的。通過豪斯多夫維可以給一個任意復雜的點集合比如分形賦予一個維度。


三、曼德勃羅集合(Mandelbrot Set)

曼德勃羅集合(Mandelbrot Set)或曼德勃羅復數集合,是一種在復平面上組成分形的點的集合,因由曼德勃羅提出而得名。曼德博集合可以使復二次多項式 進行迭代來獲得。其中,c是一個復參數。對於每一個c,從 z = 0 開始對fc(z)進行迭代。序列 的值或者延伸到無限大,或者只停留在有限半徑的圓盤內(這與不同的參數c有關)。曼德布洛特集合就是使以上序列不延伸至無限大的所有c點的集合。

最后,我們給出一個利用C語言生成Mandelbrot集合並繪制圖形的程序(該程序來自文獻【1】):

#include <stdio.h>#include <stdlib.h>
#include <complex.h>

#define width_size 800
#define height_size 600
#define Maxval 255

static const float orig_x = width_size * 2/3;
static const float orig_y = height_size * 1/2;

typedef struct _pixel {
unsigned char r;
unsigned char g;
unsigned char b;
} pixel;

static const pixel dim_gray = { 105, 105, 105 };

static unsigned char iteration(int x, int y)
{
const int limit = Maxval + 1;
int i;
complex c = ((x - orig_x) / (width_size / 3)) +
((orig_y - y) / (height_size / 2)) * I;
complex z = 0;

for (i = 0; i < limit; i++) {
/* basic formula */
z = z * z + c;
if (creal(z) > 2 || cimag(z) > 2)
break;
}
return (unsigned char) (i == limit ? 0 : i);
}


int main()
{
FILE *f = fopen("mandelbrot.ppm", "w+");

/* PPM header */
fprintf(f,
"P6\n" /* PPM magic number */
"#Mandelbrot Set\n"
"%d " /* width, in ASCII decimal */
"%d\n" /* height, in ASCII decimal */
"%d\n", /* maximum color value, in ASCII decimal */
width_size, height_size, Maxval);

/* Write every pixel generated by Mandelbrot Set */
for (int i = 0; i < height_size; i++) {
for (int j = 0; j < width_size; j++) {
unsigned char iter = iteration(j, i);
if (iter) {
pixel p = {
.r = iter,
.g = (float) abs(j - orig_x) / width_size * Maxval,
.b = (float) abs(i - orig_y) / height_size * Maxval };
fwrite(&p, sizeof(pixel), 1, f);
} else {
fwrite(&dim_gray, sizeof(pixel), 1, f);
}
}
}

fclose(f);
return 0;
}

上述程序所生成的圖像結果如下圖所示,需要補充說明的是:該圖像文件格式為ppm,在Windows下你可以使用Photoshop來查看這種類型的圖像文件,在OS X系統下你可以使用免費的GIMP軟件來查看它。



參考文獻:

【1】http://blog.linux.org.tw/~jserv/archives/2011/09/_mandelbrot_set.html



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com