而言要方便,所以它可以说是应用最为广泛的维数之一。下面引出盒维数的数学定义。 假设FcR是一个非空有界子集,N。(P是直径最大为6可以覆盖F的最少集合数, 定义F的上、下盒维数为 dima=lim logδ dimB F=lim-OgN(F logs log Ns(F) dim。F=lim 如果这两个极限相等,则称极限为集合F的盒维数,记为 logδ 经过适当的变化和讨论,我们以上面的定义来确定盒维数,对于N(F)的确定可以由 下面的方式等价计算: ①覆盖F的半径为的最小闭球数,对于二维而言就是圆 ②覆盖F的边长为的最小立方体数,对于二维而言就是正方形; ③与F相交的δ-网立方体数,对于二维而言就是矩形网格 ④覆盖F的直径最大为o的最少集合数,就是上面定义中的情况: ⑤球心在F上,半径为的相互不交的球的最多个数。 其实这样的等价计算方法还有很多,根据你所考虑的图形的具体情况来选择实现计算的 方法,这里我们对③的二维分形图形的维数计算提出一个可行的方法—盒维数计算方法: 选取一个合适的正方形,它完全覆盖点集F,并取任意比较小的正数,任意给定一个较小 的正数δ(这个数据讨论的图形而具体确定),以δ为边长对上面的这个正方形进行网格分 割成若干小方格。对这个正方形内的所有像素进行扫描,记录包含F中的点的小方格数,记 logN,(F) N(F),并计算比值dm2F=-10g6。缩小比例6(如取δ=/2),如果前后两个比 值的差大于E,则重复上面操作,否则时的比值就是为集合F的盒维数为dmaF 其实,最后计算盒维数还有方法,就是每次记录算法N。(F和6,多次运行算法后,作 这两个量的对数图,则图形几乎是位于一条直线的旁边,它的斜率的相反数就是盒维数 相似维数 自相似性是 Mande brot对分形研究中经常提到的一个概念,它曾用自相似性来定义分 形。我们后面将要讨论的 Cantor集、 von Kohi曲线、 Sierpinski地毯等等都具有局部图形 和整体相似的特征。对于自相似集合,我们定义相似维数为 In d(F)= In(1/k 其中k是相似比例因子,n是按比例因子组成F的相似子集的个数。举个例子来说:平
11 而言要方便,所以它可以说是应用最为广泛的维数之一。下面引出盒维数的数学定义。 假设 n F R 是一个非空有界子集, N F ( ) 是直径最大为 可以覆盖 F 的最少集合数, 定义 F 的上、下盒维数为 ( ) 0 log dim lim log B N F F → = − ( ) 0 log dim lim log B N F F → = − 如果这两个极限相等,则称极限为集合 F 的盒维数,记为 ( ) 0 log dim lim log B N F F → = − 。 经过适当的变化和讨论,我们以上面的定义来确定盒维数,对于 N F ( ) 的确定可以由 下面的方式等价计算: ① 覆盖 F 的半径为 的最小闭球数,对于二维而言就是圆; ② 覆盖 F 的边长为 的最小立方体数,对于二维而言就是正方形; ③ 与 F 相交的 -网立方体数,对于二维而言就是矩形网格; ④ 覆盖 F 的直径最大为 的最少集合数,就是上面定义中的情况; ⑤ 球心在 F 上,半径为 的相互不交的球的最多个数。 其实这样的等价计算方法还有很多,根据你所考虑的图形的具体情况来选择实现计算的 方法,这里我们对③的二维分形图形的维数计算提出一个可行的方法——盒维数计算方法: 选取一个合适的正方形,它完全覆盖点集 F ,并取任意比较小的正数 ,任意给定一个较小 的正数 (这个数据讨论的图形而具体确定),以 为边长对上面的这个正方形进行网格分 割成若干小方格。对这个正方形内的所有像素进行扫描,记录包含 F 中的点的小方格数,记 为 N F ( ) ,并计算比值 dimB F = log ( ) log N F − 。缩小比例 (如取 = /2 ),如果前后两个比 值的差大于 ,则重复上面操作,否则此时的比值就是为集合 F 的盒维数为 dimB F 。 其实,最后计算盒维数还有方法,就是每次记录算法 N F ( ) 和 ,多次运行算法后,作 这两个量的对数图,则图形几乎是位于一条直线的旁边,它的斜率的相反数就是盒维数。 ⚫ 相似维数 自相似性是 Mandelbrot 对分形研究中经常提到的一个概念,它曾用自相似性来定义分 形。我们后面将要讨论的 Cantor 集、von Kohn 曲线、Sierpinski 地毯等等都具有局部图形 和整体相似的特征。对于自相似集合,我们定义相似维数为 ( ) ( ) ln ln 1/ s n d F k = 其中 k 是相似比例因子, n 是按比例因子组成 F 的相似子集的个数。举个例子来说:平
面上的一个正方形,那么这样一个正方形,可以看作由比例系数1/k的k个小正方形构成的, 这时由上面相便维数得4(f)=2同样,如果对于立方体可以看作由比例系数/k的k个 小正方体,从而相似维数为3。这些正同我们在普通意义的维数一样。 相似维数最适合有自相似结构的规则分形的维数计算,特别适合于后面我们提到的分形 元生成分形的情况。如果在生成分形的各个阶段,生成元的比例因子变化或者不可能寻找到 恰当的生成元,也就是说没有严格的自相似结构的话,这时,相似维数就基本失去了意义。 第2章传统分形 前面己经介绍了关于分形的基本情况已经相关的部分理论,本章和接下来的几章将分析 各种分形以及形成分形的系统,并建立起算法,根据具体问题说明它的实用性。所谓传统分 形,其实是作为数学上的反例而引进的,这些反例大多数违背了传统分析数学关于可微性的 理论,从而它们被称为数学上的“怪物”。然而综合它们的形成过程,恰好能准确反映分形的 所有特点,这些传统意义的分形不仅能为我们的理论形成提供典型的实例,更重要的是它们 作为研究的出发点,所能提供的向导作用。本章就其中三大传统分形进行介绍: Cantor集、 Kohn曲线和 Sierpinski集。首先都是分析它们的形成原理,然后从原理出发建立起它们的构 造,并由此推广一些形成分形的方法。 2.1构造分形专用函数包 在运用 Turbo C进行程序设计时,本文根据大部分分形图形的基本操作过程,建立了 些自定义函数作为函数库存在 fractal.c文件中,在产生分形的程序中只要包含这个文件就 可以调用里边的函数。有些函数只在后面章节中用到,这里只是对一些函数的功能进行简单 介绍,其具体实现代码放在附录里 定义了全局变量: Currentx, urrent;为当前点的位置:ANE为累计旋转角度; 定义结构体类型: Current state表示当前状态(包含当前位置和累计旋转角) StateStack表示一个由当前状态构建的顺序堆栈。 一些自定义功能函数: void initialize;初始化图形系统 void set currentpoint( double x, double y);设置当前点位置: void SetInitangle( double angle);设置当前旋转角度 void circumrotate( double angle);从当前点位置旋转一个角度 void prolong( double length);它是在当前点位置按指定的角度AGHE延长 length长度 void jump( double length);从当前点位置按指定角度跳一个长度 length; void square( double side length);以当前点位置为左上顶点来构造边长为 sidelength的填
12 面上的一个正方形,那么这样一个正方形,可以看作由比例系数 1/ k 的 2 k 个小正方形构成的, 这时由上面相似维数得 d F s ( ) =2;同样,如果对于立方体,可以看作由比例系数 1/ k 的 3 k 个 小正方体,从而相似维数为 3 。这些正同我们在普通意义的维数一样。 相似维数最适合有自相似结构的规则分形的维数计算,特别适合于后面我们提到的分形 元生成分形的情况。如果在生成分形的各个阶段,生成元的比例因子变化或者不可能寻找到 恰当的生成元,也就是说没有严格的自相似结构的话,这时,相似维数就基本失去了意义。 第2章 传统分形 前面已经介绍了关于分形的基本情况已经相关的部分理论,本章和接下来的几章将分析 各种分形以及形成分形的系统,并建立起算法,根据具体问题说明它的实用性。所谓传统分 形,其实是作为数学上的反例而引进的,这些反例大多数违背了传统分析数学关于可微性的 理论,从而它们被称为数学上的“怪物”。然而综合它们的形成过程,恰好能准确反映分形的 所有特点,这些传统意义的分形不仅能为我们的理论形成提供典型的实例,更重要的是它们 作为研究的出发点,所能提供的向导作用。本章就其中三大传统分形进行介绍:Cantor 集、 Kohn 曲线和 Siepinski 集。首先都是分析它们的形成原理,然后从原理出发建立起它们的构 造,并由此推广一些形成分形的方法。 2.1 构造分形专用函数包 在运用 Turbo C 进行程序设计时,本文根据大部分分形图形的基本操作过程,建立了一 些自定义函数作为函数库存在 fractal.c 文件中,在产生分形的程序中只要包含这个文件就 可以调用里边的函数。有些函数只在后面章节中用到,这里只是对一些函数的功能进行简单 介绍,其具体实现代码放在附录里。 定义了全局变量:Currentx,Currenty;为当前点的位置;ANGLE 为累计旋转角度; 定义结构体类型:CurrentState 表示当前状态(包含当前位置和累计旋转角) StateStack 表示一个由当前状态构建的顺序堆栈。 一些自定义功能函数: void initialize();初始化图形系统; void SetCurrentPoint(double x,double y);设置当前点位置; void SetInitAngle(double angle); 设置当前旋转角度; void circumrotate(double angle); 从当前点位置旋转一个角度; void prolong(double length); 它是在当前点位置按指定的角度ANGLE 延长 length 长度; void jump(double length);从当前点位置按指定角度跳一个长度length; void square(double sidelength);以当前点位置为左上顶点来构造边长为sidelength 的填
充正方形 void parallelogram( double sidel, double side2, double angle);根据当前位置构造一个由 sidel和side2为边的,角度为 angle的平行四边形; void Rectangle( double side l, double side2);构造一个由 sidel和side2为边的填充矩形; void triangle( double sidel, double side2, double angle);构造一个由 sidel和side2为 边以及两边的夹角为 angle构成的填充三角形; void hexagon( double length);以当前位置为中心构造一个正六边形; int randRule(intn);产生一个0到n-1的随机数以达到随机效果,并返回生成的随机数 int InitStack( StateStack*S);初始化一个顺序栈,从而构造一个空栈 int push( StateStack*s, Current state e);插入当前状态e为新的栈顶元素; int Pop( StateStack*S, Currentstate*e);若栈非空,则删除S的栈顶状态,用e返回其值 2.2 Cantor集 221 Cantor集的构造 康托集( Cantor set)是由德国数学家G. Cantor构造出来的一个奇异集合。即从单位区间 -1!发,太钟的18的开区间,的几记为=[小小,即它包含 两个闭子区间。接着去掉E两个子区间中间的1/3一段得到E,。这样一直下去,到第k步 的时候,得到E,此时不难看出它由2个长度为3*个小区间组成。如果这样的细分支延 续到无穷的话,这样的极限集合称之为三分 Cantor集。 图2.1三分 Cantor集的前三步构造 其实三分 Cantor集的构造本身就具有严格的自相似的结构,并且具有无穷小的细节,我 们可以说三分 Cantor集就是分形集。当时, Cantor是为了证明级数中的一些定理引进的 由于它的些奇异的性质,被当时看作集合中的另类,从而忽视了 Cantor集的重要性。如今 Cantor集经常在混沌和分形的研究中遇到。既然它是分形,那么它的维数将可以采用前面讲 述的方法进行计算。因为它有严格的自相似结构,如果按比例缩小1/3,则它相当于两个原 来相似整体,从而用相似维数计算为log2/log3=0.6309。 由三分 Cantor集的构造可以得到它具有如下性质:
13 图 2.1 三分 Cantor 集的前三步构造 充正方形; void parallelogram(double side1,double side2,double angle);根据当前位置构造一个由 side1 和 side2 为边的,角度为angle 的平行四边形; void Srectangle(double side1,double side2);构造一个由side1和side2为边的填充矩形; void triangle(double side1,double side2,double angle);构造一个由 side1 和side2 为 边以及两边的夹角为 angle 构成的填充三角形; void hexagon(double length);以当前位置为中心构造一个正六边形; int randRule(int n);产生一个 0到 n-1 的随机数以达到随机效果,并返回生成的随机数; int InitStack(StateStack *S);初始化一个顺序栈,从而构造一个空栈; int Push(StateStack *S,CurrentState e);插入当前状态e 为新的栈顶元素; int Pop(StateStack *S,CurrentState *e);若栈非空,则删除 S的栈顶状态,用 e 返回其值; 2.2 Cantor 集 2.2.1 Cantor 集的构造 康托集(Cantor set)是由德国数学家 G.Cantor 构造出来的一个奇异集合。即从单位区间 E0 = 0,1 出发,去掉中间的 1/3 的开区间,得到的几何记为 1 1 2 0, ,1 3 3 E = ,即它包含 两个闭子区间。接着去掉 E1 两个子区间中间的 1/3 一段得到 E2 。这样一直下去,到第 k 步 的时候,得到 Ek ,此时不难看出它由 2 k 个长度为 3 −k 个小区间组成。如果这样的细分一支延 续到无穷的话,这样的极限集合称之为三分Cantor 集。 其实三分 Cantor 集的构造本身就具有严格的自相似的结构,并且具有无穷小的细节,我 们可以说三分 Cantor 集就是分形集。当时,Cantor 是为了证明级数中的一些定理引进的, 由于它的一些奇异的性质,被当时看作集合中的另类,从而忽视了Cantor 集的重要性。如今 Cantor 集经常在混沌和分形的研究中遇到。既然它是分形,那么它的维数将可以采用前面讲 述的方法进行计算。因为它有严格的自相似结构,如果按比例缩小 1/3,则它相当于两个原 来相似整体,从而用相似维数计算为log 2/log3=0.6309。 由三分 Cantor 集的构造可以得到它具有如下性质:
①E∈E,此时 Cantor集表示为∩E ②Canr集的长度为,因为E的长的E12×3-1(2),当k→时|E→0 ③ Cantor集是有界闭集,因为去掉的E的余集是无穷个开集的并仍是开集 ④ Cantor集是一个不可数集 ⑤ Cantor集是紧致的而且是完全的,因为它的每一个点的领域内包含了 Cantor集的无穷个 点,也就是说 Cantor集所有点都是聚点,没有孤立点 Cantor尘和随机 Cantor集 Cantor其实就是二维平面中的 Cantor集。它的构造过程与三分 Cantor集类似,先把正 方形分成16个小正方形,保留其中的4个把其他的全部去掉,然后再对保留下来的进行同样 的操作,最后得到 Cantor尘。对于保留个数和保留正方形的位置不同,得到的 Cantor尘也 就不一样。对于保留个数为4的时候,相似维数为log4/log4=l;如果保留9个,每两个相 隔一个小正方形,它的维数为log9/log4=1.5850。如果对正方形的进行9等分,保留四个角 上的4个小正方形,则它也是 Cantor尘,维数为log4/log3=1.2619。其实这样的构造很多, 根据等分的数目和保留的情况不同,有各种 Cantor尘产生。 另外我们也可以构造出随机的 Cantor集。也就是说在对直线进行分段时,一方面可以对 直线几等分或者不等分,然后具体去掉那个区间或者留下那几个区间也可以是随机的。这种 随机性可以用掷色子的方法来决定区间的去留。最后,虽然得到的 Can tor集不是严格的自相 似结构,但是从统计意义来说,它具有统计自相似性,从而也可以看成是分形,它把局部放 大与整体有相同的统计分布。它的维数也必须知道这个统计分布才能计算。 2. 2.2 Cantor 集白 三分 Cantor集的构造算法:(假设迭代次数是N) (1)生成区间E=0.,迭代次数为n=0 (2)去掉这个区间中间的1/3;生成两个子区间E,E2,n=m+1 (3)如果nN对E,E2重复(2)操作,否则退出。 从建立的算法来看,三分 Cantor集其实就是一个递归过程,我们采用递归函数来再用 Turbo c计算机实现的时候,对于去掉区间正中的1/3,我采用的方法是把当前画图点位置跳 到其总长度1/3之后。当我们在主程序中设 Set currentpoint(40,200);并调用 Cantor(300,0) 就可以得到上面的图2.1就是三分 Cantor的前三步步迭代图像。 简单的程序如下:
14 ① E E k k +1 ,此时Cantor 集表示为 0 k k E = ②Cantor 集的长度为0,因为 Ek 的长的 2 2 3 3 k k k Ek − = = , , 0 k 当k E → → 时 。 ③Cantor 集是有界闭集,因为去掉的 Ek 的余集是无穷个开集的并仍是开集。 ④Cantor 集是一个不可数集。 ⑤Cantor 集是紧致的而且是完全的,因为它的每一个点的领域内包含了 Cantor 集的无穷个 点,也就是说 Cantor 集所有点都是聚点,没有孤立点。 Cantor 尘和随机Cantor 集 Cantor 其实就是二维平面中的 Cantor 集。它的构造过程与三分 Cantor 集类似,先把正 方形分成 16 个小正方形,保留其中的 4个把其他的全部去掉,然后再对保留下来的进行同样 的操作,最后得到 Cantor 尘。对于保留个数和保留正方形的位置不同,得到的Cantor 尘也 就不一样。对于保留个数为 4 的时候,相似维数为 log4/log4=1;如果保留 9 个,每两个相 隔一个小正方形,它的维数为 log9/log4=1.5850。如果对正方形的进行 9 等分,保留四个角 上的 4 个小正方形,则它也是 Cantor 尘,维数为 log4/log3=1.2619。其实这样的构造很多, 根据等分的数目和保留的情况不同,有各种Cantor 尘产生。 另外我们也可以构造出随机的 Cantor 集。也就是说在对直线进行分段时,一方面可以对 直线几等分或者不等分,然后具体去掉那个区间或者留下那几个区间也可以是随机的。这种 随机性可以用掷色子的方法来决定区间的去留。最后,虽然得到的Cantor 集不是严格的自相 似结构,但是从统计意义来说,它具有统计自相似性,从而也可以看成是分形,它把局部放 大与整体有相同的统计分布。它的维数也必须知道这个统计分布才能计算。 2.2.2 Cantor 集的实现 三分 Cantor 集的构造算法:(假设迭代次数是 N) ⑴ 生成区间 E = [0,1] ,迭代次数为n=0; ⑵ 去掉这个区间中间的 1/3;生成两个子区间 1 2 E E, ,n=n+1; ⑶ 如果 n<N,对 1 2 E E, 重复(2)操作,否则退出。 从建立的算法来看,三分 Cantor 集其实就是一个递归过程,我们采用递归函数来再用 Turbo C 计算机实现的时候,对于去掉区间正中的 1/3,我采用的方法是把当前画图点位置跳 到其总长度1/3之后。当我们在主程序中设SetCurrentPoint(40,200);并调用Cantor(300,0); 就可以得到上面的图 2.1 就是三分Cantor 的前三步步迭代图像。 简单的程序如下:
TME定义为5, i Cantorllength 3, n+1) void Cantor( double length, intn 产生Cmor第的数 ICurentPoinr Cumene+length/3, Currenny /沿着设定的延长kgh单位喇 prolonglength): 我们再来推广一下,如果我们去掉区间中间的两个1/5的子区间,那么又是它的构造又是 什么样子呢?其实只要修改三分 Cantor集当中的算法的第②2)条:去掉这个区间中间的两个 1/5的子区间,其他不变即可。从而得到类似的“五分集”如图2.2。程序也只要修改else 中的部分,其中1 ength/3改成 length/5,在后边再加上两句迭代语句即可,程序如下。同 样利用相似维数可以计算这个五分集的维数为1og3/log5=0.6826。同样我们再可以进行推广 更高分集。 void Cantar (double length, in n) prolongflengthy) 图2.2五分ator集的前三批计算机构造 Setcummen Point( Cuurent+ length, current Cantors(ength/5 n+1) Cantors(length/ m+1) Cantor尘的计算机函数和图形实现: ①9等分正方形,保留角上4个小正方形的情况构造 Cantor尘前N次迭代的算法 (1)生成一个正方形0,迭代次数为n=0; ()保留正方形四角上的4个小正方形生成四个子区间E,E2,E,E,m=m+1 (3)如果nN分别对E,E2,E3,E重复②操作,否则退出。 其程序设计处理办法和三分 Cantor集的处理差不多,其中当前点的变化,只要是移动 方向。也就沿下图中的第一行第二个图形填充正方形的左上角顶点顺时针进行填充生成整体 图,见图2.3。即如果以单位正方形为例:一次完整移动,(x,y)的游动方向为 (00)+20 (0,0)
15 TIMES定义为5, void Cantor(double length,int n) {/*产生 Cantor 集的函数*/ if(n>=TIMES) /*沿着设定的角度延长length单位*/ prolong(length); else { Cantor(length/3,n+1); /*去掉中间的1/3区间*/ SetCurrentPoint(Currentx+length/3,Currenty); Cantor(length/3,n+1); } } 我们再来推广一下,如果我们去掉区间中间的两个 1/5 的子区间,那么又是它的构造又是 什么样子呢? 其实只要修改三分 Cantor 集当中的算法的第(2)条:去掉这个区间中间的两个 1/5 的子区间,其他不变即可。从而得到类似的“五分集”如图 2.2。程序也只要修改 else 中的部分,其中 length/3 改成 length/5,在后边再加上两句迭代语句即可,程序如下。同 样利用相似维数可以计算这个五分集的维数为log3/log5=0.6826。同样我们再可以进行推广 更高分集。 void Cantor5(double length,int n) { if(n>=TIMES) prolong(length); else { Cantor5(length/5,n+1); SetCurrentPoint(Currentx+length/5,Currenty); Cantor5(length/5,n+1); SetCurrentPoint(Currentx+length/5,Currenty); Cantor5(length/5,n+1); } } Cantor 尘的计算机函数和图形实现: ① 9 等分正方形,保留角上4 个小正方形的情况构造Cantor 尘前N 次迭代的算法: ⑴ 生成一个正方形 E0 ,迭代次数为n=0; ⑵ 保留正方形四角上的 4 个小正方形;生成四个子区间 1 2 3 4 E E E E , , , ,n=n+1; ⑶ 如果 n<N,分别对 1 2 3 4 E E E E , , , 重复(2)操作,否则退出。 其程序设计处理办法和三分 Cantor 集的处理差不多,其中当前点的变化,只要是移动x 方向。也就沿下图中的第一行第二个图形填充正方形的左上角顶点顺时针进行填充生成整体 图,见图 2.3。即如果以单位正方形为例:一次完整移动,(x,y)的游动方向为: ( ) ( ) 2 2 2 2 0,0 ,0 , 0, 0,0 3 3 3 3 → → → → 。 图 2.2 五分 Cantor 集的前三步计算机构造