Python3 趣味系列题14----分形
分形(Fractal)一词,是由美国数学家曼德勃罗先生(Mandelbrot)创造出来的。分形几何学是一门以非规则几何形态为研究对象的几何学。按照分形几何学的观点,一切复杂的对象虽然看似杂乱无章,但他们具有相似性。简单地说,就是把复杂对象的某个局部进行放大,其形态和复杂程度与整体相似。
本文给出基于复动力系统,例如Mandelbrot集、Julia集;基于迭代函数系统,例如科赫雪花、谢尔宾斯基三角形。
一、基于复动力系统
因为复数可以用平面直角坐标系上的点来表示。横坐标轴表示复数的实数部分,纵坐标轴表示复数的虚数部分,则复数 A+Bi就对应了平面上的点 (A, B),其中复数A+Bi的模就是A^2 + B^2 的算数平方根。这个平面直角坐标系也就成为了复平面。
- Julia集
所谓Julia集就是复平面上的点经过如下形式:
image的无数次迭代得到的复数的模不大于2的点构成的集合。其中Z代表复平面上的点,C是任意的复数。对于不同的C值,不同的迭代次数,所得到的图像是不同的。下面给出几种不同的C值对应的图像。之所以限定模值为2,是因为随着迭代次数的增大,模大于2的点肯定会发散。为了图片的美观,根据不同的模值定义不同的颜色。
image image- Mandelbrot集
生成Mandelbrot集和Julia集的原理是类似的,唯一的不同在于,迭代的表达式变为:
image其中Z0表示复平面上的每个点。计算Mandelbrot集,也就是记录每个点在迭代过程中得到的复数的模值大于2时的迭代次数,然后根据迭代次数进行绘图,不同的迭代次数用不同的颜色表示,即可绘制出图。
在Julia集中,C值是任意给定的复平面上的一点,对于所有复平面上的点Z而言,都是一样的。而Mandelbrot集中C就是该点Z,对于所有复平面上的点Z而言,都是不一样的。Julia集每个图形表示的是一个C值,而C值肯定是Z0值中的一个。因此Mandelbrot集是Julia集的高度概括,也就是任意一个C值对应的Julia图形,肯定可以在Mandelbrot集的图形中找到与其对应的图像。下面给出Mandelbrot集的图像:
image下面给出
image时的Mandelbrot集的图像:
image下面给出次数为2时的Mandelbrot集局部放大时的图像:
image image二、基于迭代函数
基于迭代函数就是根据一定的规则,迭代生成分形图像。下面以谢尔宾斯基三角形和科赫雪花为例:
- 谢尔宾斯基三角形
由波兰数学家谢尔宾斯基在1915年提出。
迭代规则:
1,取一个底色为黑色的三角形,一般为等边三角形;
2,沿三边中点的连线,将它分成四个小三角形;
3,将中间的那一个小三角形底色变为白色;
4,对其余三个小三角形重复步骤2,3;
5,重复以上步骤;
图示:
image除了迭代法之外,也可以利用随机的方法获得。
随机方法规则:
1,在平面上选取3个点,并标出,为了美观,这3个点可以为等边三角形的顶点;
2,在平面上任意选取一个点作为第4个点,作为候选点,在平面上标出;
3,在数字1,2,3中随机选择一个数字。数字1,2,3的分别点1,2,3对应;
4,选中的点和当前候选点的中点作为新的候选点,并在平面上标出;
5,重复步骤3,4;
图示:
image- 科赫雪花曲线
最早出现在海里格·冯·科赫1904年的论文中。
规则:
1,对于一个等边三角形,把每一边都三等分;
2,将每个边的中间一段,向外旋转60度,作为等边三角形的一边,绘制出等边三角形;
3,将中间的这一段去掉;
4,重复上述步骤;
图示:
image点击获得更多趣味谜题以及基于Python3的解决方案代码。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。 image image