基于复变函数f(z)=z^2+c的迭代分形图

来源:互联网 发布:杨文理知乎 编辑:程序博客网 时间:2024/06/05 15:58

参考:http://www.matrix67.com/blog/archives/292
github:https://github.com/dreamhuan/fractal
演示:https://dreamhuan.github.io/fractal/

先上图(分别是Julia集和Mandelbrot集)
Julia集

Mandelbrot集

然后简单说下这两幅图什么意思以及如何得到,顺带解释下标题。
其实一切在第一个链接里面均能得到答案,matrix67用pascal写的,我这里用js实现了下。(选择js是因为相对于别的语言的图形库我还是canvas的api用的熟一点)

PS:自行学习前置技能“复数”,百度百科过一遍就行。
所谓迭代就是把运算结果作为自变量带入得到新的结果,如此反复进行。对于f(z)=z^2+c,在确定c后即得到一个具体的函数,对于每一个复数z都可以得出f(z)。给定初始值z0,数次迭代得到z1=f(z0),z2=f(z1)=f(f(z0))…得到一个复数列z0,z1,z2,…,zn并且我们可以计算出各项的膜,组成新的实数列|z0|,|z1|,|z2|,…,|zn|,我们发现,|z0|>2时数列一定发散(|zn|→∞)故可将使|z|>2的迭代次数作为临界点。

对于二维平面上的每一个点(x,y)均可对应一个复数x+yi,故也对应一个z0。在c确定时我们进行30次迭代,如果发现|z|>2就停止迭代并记录迭代次数,顺利迭代30后|z|还是没有大于2就当做收敛,迭代次数一律记做30。于是我们将平面上的每一点都对应了一个数(1到30),然后每个数对应一种颜色就可以对平面着色了。着色完就得到了图一,由于每一个确定的c都对应一个复变函数,故改变c可以得到不同的漂亮的图形。最后,我们将使其不扩散的z值的集合称为朱利亚集合。(即平面上对应30的点,一般着色为黑色)
(图片越外围迭代次数越低,可以适当减少颜色,比如1~5都填一种颜色…)

Mandelbrot集
知道了Julia集的来历,这个就很简单了。Julia是平面(x,y)对应的x+yi对应不同的z,c是事先固定好的(为某一初始值)。Mandelbrot则平面(x,y)对应的x+yi对应不同的c,z固定为0。从而吧平面上每一点对应一个迭代次数(规则一样)Julia可以改变固定的c得到不同的图形,Mandelbrot也可以改变固定的z得到不同图形,但是一般不这么做,并且有|z|<=1/4时图形不变。Mandelbrot集定义与Julia集相同。

最后解释标题的分形。分形图即图片某一部分拥有整个图片的样子,即把Mandelbrot集的图片一直放大总能看到图片本身的样子,见视频:
http://www.bilibili.com/video/av3536953/

代码部分github上传的都有清晰注释,这里不赘述。

2 0