一、从科赫雪花谈起

设想一个边长为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. C#之在treeview中鼠标点击的所选的节点触发事件

    一.背景 如下图所示,我想实现通过鼠标点击treeview的根节点,然后在文本框控件中显示鼠标点击的节点号. 二.程序实现 因为是要通过鼠标点击才发生的事情,所以这属于一个事件,需要触发才行,刚开始不 ...

  2. asp.net Code学习一(vs code跨平台软件操作)

    1.命令行: dotnet new -t web 创建web项目 dotnet new restore build pubilsh run test pack dotnet -info / -h do ...

  3. 微信支付v2开发(11) Native支付

    关键字:微信公众平台 微信支付 Native原生支付 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/wxpay-native.html 在这篇微信公众平台开 ...

  4. LayUI-Table表格渲染

    记项目中又一表格使用方法,项目首选是使用BootstrapTable的,但是经过多番查证与调试,始终没有把固定列的功能调试成功,找到的成功的例子原样照搬都不行,文件引入也都没有问题,实在搞不懂了,如果 ...

  5. .vsdc和.svf用于formal verification tools

    svf:Setup Verification for Formality

  6. 【例题 7-3 UVA - 10976】Fractions Again?!

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] x>=y => \(\frac{1}{x}<=\frac{1}{y}\) => \(\frac{1}{x}= ...

  7. iOS开发RunLoop学习:一:RunLoop简单介绍

    一:RunLoop的简单介绍 #import "ViewController.h" @interface ViewController () @end @implementatio ...

  8. amazeui-datatables(登录注册界面用到)

    amazeui-datatables(登录注册界面用到) 一.总结 amazeui-datatables:DataTables 插件 Amaze UI 集成,只修改了样式和默认显示语言,其他参数同官方 ...

  9. winedt (latex 编译器)解决中文的问题(CJK & CTEX)

    主要是导入相关的库支持: 1. CJK \usepackage{CJK}:CJK,是中日韩的英文首字母的组合,处理中文需要先导入这个包: \begin{CJK*}{GBK}{song}:默认句式,表示 ...

  10. hadoop组件及其作用

    1.hadoop有三个主要的核心组件:HDFS(分布式文件存储).MAPREDUCE(分布式的计算).YARN(资源调度),现在云计算包括大数据和虚拟化进行支撑. 在HADOOP(hdfs.MAPRE ...