
分形几何是几何数学中的一个分支,也称大自然几何学,由著名数学家本华曼德勃罗( 法语:BenoitB.Mandelbrot)在 1975 年构思和发展出来的一种新的几何学。分形几何是对大自然中微观与宏观和谐统一之美的发现,并且揭示的部分只是冰山之一角,相信在人类认知的进步下,会开出一朵接一朵的美丽花朵。
美国杰出的物理学家( 两弹元勋 、现代广义相对论之父)、物理学思想家、物理学教育家惠勒( Wheeler )断言: “ 可以相信,明天谁不熟悉分形,谁就不能被认为是科学上的文化人。”可以看出分形强大的影响力,当然个人也比较喜欢分形,因为利用分形可以画出很多美丽的图形,利用分形我们可以描绘出 树叶的纹路、画出完整的一棵树、形状酷似病毒的图形,混沌 ( chaos )、孤立子( solitons )和分形 ( fractals )是非线性科学 ( nonlinear science ) 中三个最重要的概念。
分形(英语:fractal,源自拉丁语:frāctus,有“零碎”、“破裂”之意),又称碎形、残形,通常被定义为:
“一个零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”[2],即具有自相似的性质。
分形在数学中是一种抽象的物体,用于描述自然界中存在的事物。人工分形通常在放大后能展现出相似的形状[3]。 分形也被称为扩展对称或展开对称。如果在每次放大后,形状的重复是完全相同的,这被称为自相似。自相似的一个例子是门格海绵[图1]。 分形在不同的缩放级别上可以是近似相似的。曼德博集合的【图2】放大图像中显示了这种模式[2][5][6][7]。 分形也包有图像的细节重复自身的意味。
如果一个物体自我相似(Self-similarity),表示它和它本身的一部分完全或是几乎相似。若说一个曲线自我相似,即每部分的曲线有一小块和它相似。自然界中有很多东西有自我相似性质,例如海岸线。
由波兰数学家瓦茨瓦夫·谢尔宾斯基(Wacław Sierpiński)于1916年提出的一种分形,是自相似集的一种。它的豪斯多夫维是 log 8/log 3 ≈ 1.8928。门格海绵是它在三维空间中的推广。
将一个实心正方形划分为3X3的9个小正方形,去掉中间的小正方形,再对余下的小正方形重复这一操作便能得到谢尔宾斯基地毯。

门格海绵(英语:Menger sponge、英语:Menger universal curve)是分形的一种。它是一个通用曲线,因为它的拓扑维数为一,且任何其它曲线或图都与门格海绵的某个子集同胚。它有时称为门格-谢尔宾斯基海绵或谢尔宾斯基海绵。它是康托尔集和谢尔宾斯基地毯在三维空间的推广。它首先由奥地利数学家卡尔·门格在1926年描述,当时他正在研究拓扑维数的概念。
是基于复平面的分形典范。曼德博集合可以用复二次多项式来定义:
,其中c 是一个复数参数。
从z = 0开始迭代:

不同的参数c可能使序列的绝对值逐渐发散到无限大,也可能收敛在有限的区域内。曼德博集合M 就是使序列不延伸至无限大的所有复数c的集合。
科赫雪花是由瑞典数学家科赫在 1904 年提出的一种不规则几何图形,也称为雪花曲线。

分形图形的特点是整体几何图形是由一个微图形结构自我复制、反复叠加形成,且最终形成的整体图案和微图形结构一样。在编写分形算法时,需要先理解微图案的生成过程。

科赫雪花的微图案生成过程:
- # importing necessary modules
- import numpy as np
- from PIL import Image
-
- # total number of times the process will be repeated
- total = 7
-
- # size of the image
- size = 3 ** total
-
- # creating an image
- square = np.empty([size, size, 3], dtype=np.uint8)
- color = np.array([255, 255, 255], dtype=np.uint8)
-
- # filling it black
- square.fill(0)
-
- for i in range(0, total + 1):
- stepdown = 3 ** (total - i)
- for x in range(0, 3 ** i):
-
- # checking for the centremost square
- if x % 3 == 1:
- for y in range(0, 3 ** i):
- if y % 3 == 1:
- # changing its color
- square[y * stepdown:(y + 1) * stepdown, x * stepdown:(x + 1) * stepdown] = color
-
- # saving the image produced
- save_file = "sierpinski.jpg"
- Image.fromarray(square).save(save_file)
-
- # displaying it in console
- i = Image.open("sierpinski.jpg")
- i.show()

- import turtle
-
- def draw_tree(length):
- if length>=5:
-
- #设定颜色
- if length <=15:
- turtle.color('green')
- else:
- turtle.color('black')
-
- '''
- 先画右侧树枝
- '''
-
- #向前
- turtle.forward(length)
- #右转25度
- turtle.right(25)
- #递归draw_tree
- draw_tree(length - 15)
-
- '''
- 画左侧树枝
- '''
-
- #左转50度
- turtle.left(50)
- #递归draw_tree
- draw_tree(length - 15)
-
- '''
- 回退
- '''
- #设定颜色
- if length <=15:
- turtle.color('green')
- else:
- turtle.color('black')
-
- #右转25度
- turtle.right(25)
- #回退
- turtle.backward(length)
-
- def main():
- #起始点往下移100
- turtle.pensize(4)
- turtle.left(90)
- turtle.penup()
- turtle.backward(100)
- turtle.pendown()
- draw_tree(100)
- turtle.exitonclick()
-
- if __name__ == '__main__':
- main()

- from PIL import Image
- import colorsys
- import math
- import os
-
- #frame parameters
- width = 1000 #pixels
- x = -0.65
- y = 0
- xRange = 3.4
- aspectRatio = 4/3
-
- precision = 500
-
- height = round(width / aspectRatio)
- yRange = xRange / aspectRatio
- minX = x - xRange / 2
- maxX = x + xRange / 2
- minY = y - yRange / 2
- maxY = y + yRange / 2
-
- img = Image.new('RGB', (width, height), color = 'black')
- pixels = img.load()
-
- def logColor(distance, base, const, scale):
- color = -1 * math.log(distance, base)
- rgb = colorsys.hsv_to_rgb(const + scale * color,0.8,0.9)
- return tuple(round(i * 255) for i in rgb)
-
- def powerColor(distance, exp, const, scale):
- color = distance**exp
- rgb = colorsys.hsv_to_rgb(const + scale * color,1 - 0.6 * color,0.9)
- return tuple(round(i * 255) for i in rgb)
-
- for row in range(height):
- for col in range(width):
- x = minX + col * xRange / width
- y = maxY - row * yRange / height
- oldX = x
- oldY = y
- for i in range(precision + 1):
- a = x*x - y*y #real component of z^2
- b = 2 * x * y #imaginary component of z^2
- x = a + oldX #real component of new z
- y = b + oldY #imaginary component of new z
- if x*x + y*y > 4:
- break
- if i < precision:
- distance = (i + 1) / (precision + 1)
- rgb = powerColor(distance, 0.2, 0.27, 1.0)
- pixels[col,row] = rgb
- index = row * width + col + 1
- print("{} / {}, {}%".format(index, width * height, round(index / width / height * 100 * 10) / 10))
-
- img.save('output.png')
- os.system('open output.png')

- import turtle
- turtle.speed(100)
- def ke_line(line_, n):
- if n == 0:
- turtle.fd(line_)
- else:
- line_len = line_ // 3
- for i in [0, 60, -120, 60]:
- turtle.left(i)
- ke_line(line_len, n - 1)
- # 原始线长度
- line = 300
- # 移动小海龟画布左下角
- turtle.penup()
- turtle.goto(-150, -150)
- turtle.pendown()
- # 几阶科赫雪花
- di_gui_deep = int(input("请输入科赫雪花的阶数:"))
- while True:
- # 当多少科赫雪花围绕成一个圆周时,就构成一个完整的雪花造型
- count = int(input("需要几个科赫雪花:"))
- if 360 % count != 0:
- print("请输入 360 的倍数")
- else:
- break
- for i in range(count):
- ke_line(line, di_gui_deep)
- turtle.left(360 // count)
- turtle.done()

有专门的理论教学《分形几何》,其中的内容更加丰富, 我们将在以后的博客中继续介绍。