一、从科赫雪花谈起

设想一个边长为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

曼德勃罗(Mandelbrot)集合与其编程实现的更多相关文章

  1. OpenACC 绘制曼德勃罗集

    ▶ 书上第四章,用一系列步骤优化曼德勃罗集的计算过程. ● 代码 // constants.h ; ; ; ; const double xmin=-1.7; ; const double ymin= ...

  2. OpenMP并行化实例----Mandelbrot集合并行化计算

    在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的 ...

  3. Mandelbrot集合及其渲染

    什么是Mandelbrot集合? Mandelbrot集合是在复数平面上组成分形的点的集合,它正是以数学家Mandelbrot命名. Mandelbrot集合可以用复二次多项式 \[ f_c(z)=z ...

  4. Python matplotlib numpy 曼德尔布罗特集合 曼德尔布罗特 B.Madelbrot

    import numpy as np import matplotlib.pyplot as plt def mandelbrot(h,w,maxit=20): y,x = np.ogrid[-1.4 ...

  5. 把List<string>集合,编程string,并以“,”号分割

    List<int> roleIdList = GetRoleIdList(user.ID); string roleIdsStr = ""; if (roleIdLis ...

  6. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  7. 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】

    转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

  8. 机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总

    <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...

  9. 机器学习(Machine Learning)&深度学习(Deep Learning)资料(下)

    转载:http://www.jianshu.com/p/b73b6953e849 该资源的github地址:Qix <Statistical foundations of machine lea ...

随机推荐

  1. Redux简易理解

    1. createStore(相当于vuex的$store) 这才是数据存储仓库,用来存储初和输出的数据,更vuex$store功能一样 作用:  创建一个 Redux store 来以存放应用中所有 ...

  2. eclipse创建maven

    第一步: 第二步 第三步: 第四步: 第五步: 第六步: <?xml version="1.0" encoding="UTF-8"?> <we ...

  3. NIO专栏学习

    http://blog.csdn.net/column/details/12993.html

  4. 洛谷 P2819 图的m着色问题

    P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的 ...

  5. 洛谷 P1927 防护伞

    P1927 防护伞 题目描述 据说 2012 的灾难和太阳黑子的爆发有关.于是地球防卫小队决定制造一个特殊防护 伞,挡住太阳黑子爆发的区域,减少其对地球的影响.由于太阳相对于地球来说实在是太 大了,我 ...

  6. <%%>创建内联代码块(表达式)

    其实<%%>很早之前就见过了,只是会用一点功能,其它的不甚了解.今天偶尔见到了它的庐山真面目,现在共享给大家. 语法 代码块呈现(<%%>)定义了当呈现页时执行的内联代码或内联 ...

  7. [TypeScript@2.5] Omit catch error block if not needed

    From TypeScript@2.5, you can omit catch error block. Before: try { throw new Error('whatever'); } ca ...

  8. Ubuntu VMware Tools安装详细过程(非常靠谱)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.前言 VMware Ubuntu安装以及详细过程:https://blog.csdn.net/qq_41782425/arti ...

  9. GO语言学习(十一)Go 语言循环语句

    Go 语言提供了以下几种类型循环处理语句: 循环类型 描述 for 循环 重复执行语句块 循环嵌套 在 for 循环中嵌套一个或多个 for 循环 语法 Go语言的For循环有3中形式,只有其中的一种 ...

  10. iOS_05_iOS设备发展史

    ios设备发展史 IPhone一代 * 2007年发布. * 支持电子邮件.移动电话.短信.网络浏览等. * 采取触摸键盘 * 3.5英寸,480 x 320像素. * 后置摄像投200万像素. IP ...