迭代函数系统 - iterated function system是一种创建分形图案的简单算法。下面我们用迭代函数系统来凭"空"生成一片树叶。下面的4组线性函数均可以根据一个二维平面点的点坐标(xi,yi)计算得到一个新的点坐标(xi+1,yi+1)。
本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频
函数组0,选择概率0.01:
函数组1,选择概率0.07:
函数组2,选择概率0.07:
函数组3,选择概率0.85:
整个计算过程也是迭代的,我们首先选择坐标原点(0,0)作为(xi,yi),选择上述函数组中的一个生成新坐标(xi+1,yi+1),然后再把新坐标作为(xi,yi),选择上述函数组中的一个计算得到下一个平面坐标点。在重复10万次后,我们就得到了平面上10万个点,将这10万个点在平面上画出来,即得该迭代函数系统的分形图案。
那么,在迭代时,选择哪个函数组进行迭代计算呢?答案是在符合概率要求的条件下随机选择。我们为每个函数组指定了选择概率,分别是1%,7%,7%和85%。可以看到,函数组3被选择的概率最高。
这次我们先看看绘图结果,如下。Amazing! 在只有数个参数的情况下,IFS成功地构造了树叶。读者可以点击左下方的放大镜,然后按住鼠标左键框选放大,可以看到,树叶中的某片子树叶,跟整片树叶一模一样!图像表现出高度的自相似性。
接下来分析代码。下面使用到的numpy是用C语言书写的多维数组模块,它是scipy等科学计算模块的基础。读者可以把numpy简单看作是多维的速度更快的列表(list)。numpy包可以在Windows命令行或者Linux终端中使用pip install numpy命令进行安装。
#IfsLeaf.py
import numpy as np
from matplotlib import pyplot as plt
def ifs(p,eq,n):
p = np.cumsum(p) #对概率列表进行累加运算
rands = np.random.rand(n) #生成n个值域为[0,1)的随机数
select = np.searchsorted(p,rands) #生成方程组选择数组
result = np.zeros((n,2),dtype=np.float) #n行2列的结果数组,元素值初始化为0
c = np.zeros(n,dtype=np.float) #n个0值构成的c数组,用于表示点的颜色
#值为[0,0,1]的当前点坐标数据,可以视为3行1列的矩阵
pos = np.array([0,0