在Mathematica中,我们可以有很多种方法绘制Mandelbrot集合,比如其中一种实现方案:
Graphics@ Raster@ Rescale@ Table[ Length@ NestWhileList[ #^2 + x + I y &, 0, Norm@# < 2 &, {1, 2}, 40 ], {y, -1.3, 1.3, 0.01}, {x, -2.6, 1.3, 0.01} ]
这么短的一段代码,就能绘制出Mandelbrot集合的图像。 对于不熟悉Mathematica语言的朋友,这确实是有点儿莫名其妙。今天我们就来解开这里面的秘密。
这里调用的语法为:
NestWhileList[f,expr,test,{mmin,m},max_iter]
主要是说:在至少生成 mmin 结果之前不会开始应用测试;然后,在每个步骤中,它提供参数来测试尽可能多的最新结果,最大为 m;且最大迭代次数为max_iter.
在这里:mmin=1,m=2。也就是说,在迭代产生元素的范数小于1时,不进行‘范数小于2’(Norm@#)的检测。这样会节省很多计算时间【不信的话,你可以拿掉{1,2}这个条件试一下 :-)】
简单测试:
c := {-0.25, 0.4}; (*可改变来观察产生的List*) NestWhileList[ #^2 + Complex @@ c &, 0, Norm@# < 2 &, {1, 2}, 40 ]
这里调用的语法为:
Rescale[list]
将list中的元素做标准化处理,返回0到1之间的值。在这里,复合函数Rescale@Table[Length@...]返回一个表格,其元素为像素点x+iy在迭代下的逃逸时间(list的长度)的标注化数值(在0和1之间)。
这里调用的语法为:
Raster[{{a11,a12,…},…}]
返回一个二维图表像素值。进一步地,可以使用图像函数Graphics将这个图标输出。
简单测试:
Graphics@ Raster@ Rescale@ Table[x^2 + y^2, {x, -3, 3}, {y, -3, 3}]
如果将长度取对数,有利于观测到不同迭代次数之间的不同:
Graphics@ Raster@ Rescale@ Table[ Log@Length@ NestWhileList[ #^2 + x + I y &, 0, Norm@# < 2 &, {1, 2}, 40 ], {y, -1.3, 1.3, 0.01}, {x, -2.6, 1.3, 0.01} ]