作者 | 刘洋洲
来源 | 转自知乎专栏《万物皆数也》,数学英才获授权转载,在此感谢!
提起分形,就不得不说Julia集以及Mandelbort集。那么两者究竟是如何构造的呢?如何通过简单的编程去画出图像?让我们一探究竟。
铺垫
让我们先来简单复习一下复数的知识。
复数,即形如 的数,其中 , 是虚数单位, 我们称为实部, 称为虚部,复数集合记为 . 单从加法的角度而言,复数和平面向量没有区别:
<公式左右滑动可见>
但是复数还可以相乘,并且相乘的结果还是复数:
<公式左右滑动可见>
先将复数视为一个关于字母 的多项式,依据多项式乘法打开括号,最后将 代入乘积结果,最后合并同类项即可。
正如我们前面提到复数与平面向量的关系,所以用复平面上的点去表示复数是自然的:我们以平面直角坐标系的横轴定义为实数轴,纵轴定义为虚数轴;同向量满足平行四边形法则一样,复数加法的几何意义也是平移。既然将复数可以视为向量,那么就可以定义其模长与实轴的夹角——辐角。
有了模长与辐角,我们自然可以写出复数的极坐标形式 ,其中 ,即将向量 向实轴、虚轴分别投影。我们定义 ,于是复数就可以更简洁地表示为 . 两个复数在极坐标表示下其几何意义更为明显:
<公式左右滑动可见>
最后由三角函数和角公式(再回过头看复数的乘法公式,是不是很眼熟):
<公式左右滑动可见>
注意到
这不就是指数乘法运算法则吗?事实上,有欧拉公式作为桥梁
所以复数乘法的几何意义:模长相乘,辐角相加。
例如对于平方函数 ,其几何意义是模长变为原来模长的平方,辐角加倍。
定义
首先定义一个复变函数
其中 是给定的复数。这个函数意味着将自变量先伸缩、旋转再平移。
Julia集合以及Mandelbort集合都是由这个二次函数定义的,并且两者关于此函数有某种对偶性。我们先严格用集合的形式将两者表示出来:
<公式左右滑动可见>
其中 表示 次迭代. 我们一般所说的Mandelbort集合其实是 ,即考虑初值为 的迭代:
概括来说,Julia集合以及Mandelbort集合就是反复迭代 ,不发散到无穷的 或者 构成的集合。
性质
相信很多人对于上面的定义十分忌惮,想要获得这两个集合的图像,对于人力而言实在是一项艰巨的挑战。数列 究竟什么时候发散至无穷?实际上有一个很实用的定理:
定理
定理的证明使用归纳法,我们就略去了。有了这个定理,剩下的工作交给计算机就行了:设定一个迭代次数的上限 ,当经过 次迭代后, 如果 仍然没有超过 ,我们就认为这个点属于 (尽管可能存在狼混入羊圈的风险);否则,就说明该点不在 中。
这个算法还有个名字:逃逸时间算法。
R 语言代码
选择生成均匀分布的随机数,然后去验证是否在集合内。由此得到下图。
设定画布par(mar = rep(0, 4), oma = rep(0, 4), bg = "00AC0E") 背景颜色bg任意选择plot(0,0, type = "n", xlim = c(-2, 1),ylim = c(-1, 1), axes = FALSE, xlab = "",ylab = "")绘制Mandelbrot集图像函数Mandelbrot<-function(n=32,color="blue")n表示迭代次数上限{n=2;m=nrepeat这是一个死循环,当图像不再发生太大的变动,请手动stop{a=runif(1,-n,1.5);b=runif(1,-1,1)c=complex(0,a,b)z=0for(iin1:m){z=z*z+cif(mod(z)>2)break 如果超出2就退出循环}if(Mod(z)<2)points(c,pch=16,col=color,cex=0.1)}}Mandelbrot
<左右滑动可见>
以上面的程序为基础,共用一个画布,一层一层覆盖(迭代次数的上限 N 逐层翻倍),反复使用此函数,就可得到Mandelbort集如下图——
红点为原点,每个格子的边长为0.1
将程序稍加修改,就可以获得Julia集合的绘图程序:
par(mar =rep(0,4), oma =rep(0,4), bg ="white") 背景颜色bg任意选择plot(0,0,type="n", xlim = c(-2,2),ylim = c(-2,2), axes = FALSE, xlab ="",ylab ="")Julia <-function(c n="100," color=""yellow")N表示迭代次数上限{repeat{a" b="runif(1,-2,2)z" z="zfor(iin1:N){z">2)break如果超出2就退出循环}if(Mod(z)<2)points(Z, pch=16, col = color, cex=0.1)}}Julia
Julia集和Mandelbort集
Mandelbort集具有如下性质:当则连通。所以,Mandelbort集在某种意义上就像是Julia集的地图,每个位置都对应着一个连通的Julia集。容易证明当时,对应着的刚好是单位圆盘,我们令沿着某一直线运动,相应的Julia集也在相应的变化着:起初在原点附近,Julia边界接近圆,随后图形越来越卷曲、纤细、破碎……
Julia集从左到右依次对应的c为:-1.4,-1.2,-1.0,-0.8,-0.6,-0.4,-0.2,0.0,+0.2
Julia集和Mandelbort集的秘密人们还知之甚少,因为他们实在太过复杂。例如,Shishikura(1994)证明了Mandelbort集的边界具有Hausdorff维数是2!虽然Mandelbort集已经被J. Hubbard和A. Douady证明是连通的(即不可以表示为两个不交的开集的并),但是是否是道路连通(即任意两点都有区间
数学英才
中学生英才计划
数学学科官方公众号
推送数学微慕课和学习资料