门格尔海绵分形
门格尔海绵是一种流行的分形,它推广了康托集和谢尔平斯基三角形。其分形维数在2 ~ 3之间。
内容
卡尔·门格尔
卡尔·门格尔(1902-1985)是20世纪奥地利裔美国数学家。他职业生涯的大部分时间都在芝加哥的伊利诺伊理工学院。他对几何学和博弈论做出了贡献。但他最著名的是被称为“海绵”的立方体形分形。
海绵
从一个大的实心立方体开始。这是零级。
把大方块分成3x3x3 = 27个小方块,就像没有标签的魔方一样。从六个面中取出中间的立方体和正中心的立方体。第一级剩下27 - 7 = 20个小方块。
在这20个立方体上重复这个过程,在第2级生成20x20 = 400个更小的立方体。
一次。这是第三层,有800个小方块和很多洞。
下一阶段呢?
在我们的电脑屏幕或印刷页面上都能看到分辨率的情况下,超过第三级的分辨率几乎没有什么好处。每个立方体只占据几个像素,第四级立方体将小20倍。
它们的数量是我们的20倍。这是16万个亚像素大小的立方体。尽管我不能看到它,但我在第四级完成了一次计算。它需要的主存比我笔记本电脑上32g的RAM还要多。它必须使用虚拟存储,并运行了近15分钟。
二维还是三维?
固体体积在每一级减少20/27倍。所以理论上,如果你继续超过三级或四级,体积接近于零。另一方面,表面积变成无限大。其结果是一个介于二维和三维之间的分形。1918年,Felix Hausdorff介绍分形维数.结果表明,门格尔海绵具有Hausdorff维数log(20)/log(3),约为2.727。
这个话题很轻松。
到目前为止,我们一直在黑暗中工作。让我们来解释一下这个问题。我们开始的大立方体实际上是纯金的(模拟)。
光线以不同的角度照射在不同的表面上,产生不同深浅的金色。我们现在可以很容易地看到这些洞。
在第二级,我们已经挖出了几乎一半的金子。
有了光照和阴影,第三关的计算和绘图大约需要5秒钟。它比其他图要暗一些,因为立方体的边缘开始占主导地位。
倾斜
如果你把海绵稍微倾斜一下,你可以看到这些洞都是贯穿其中的通道。
动画
我试着在我所有的博客文章中使用gif动画。
门格尔
这是我的代码。这个函数门格尔让事情开始。有两个输入参数。第一个指定所需的细化级别。一个立方体是水平= 0。增加水平将多维数据集的数量乘以1,因此执行时间和所需的内存都乘以20。任何水平大于3是不切实际的。
第二个输入参数为true或false。True在一个camlight所以你可以看到更多细节。有虚假就没有光明。照明需要更多的时间,特别是如果你希望在计算完之后操作海绵。
8 × 3数组V提供半宽为3的立方体的顶点。从这个宽度开始意味着后续的许多计算都没有舍入错误。当多维数据集的大小接近图形分辨率时,这很重要。
函数门格尔(水平,点燃)分形立方,门格尔海绵。% menger(level)生成20^level的立方体。% menger(等级,为真)显示。% menger(level,false)不亮,所以更快。
V = [-3 -3 -3;-3 -3 3;-3 3 3;-3 3 3;3 -3 -3;3 -3 3;3 3 3;3 3 3];init_fig(lit)海绵(V,level)结束
海绵
这是所有动作发生的地方。这个函数海绵是递归的。它反复调用自身,传递数组v表示小立方体的顶点。的v数组从原始数组中获得V用3的逆幂进行缩放然后用向量进行平移[x y z]由所有可能的组合-2,+ 2而且0.一个典型的v是
[-3 -3 -3;-3 -3 3;-3 3 3;-3 3 3 3 3 -3;3 -3 3;3 3 3;3 3 3]/9 + [0 -2 2]
向量[x y z]的坐标立方体中心.向数组中添加向量是MATLAB的一个例子单例扩张.翻译后的v也许不在附近,但它是的某个地方在海绵里。和所有通过递归得到海绵中的立方体。
现在有一个关键点。这个函数nnz在最里面的循环中,计数向量中非零分量的数量。通过平移得到的立方体Nnz ([x y z])等于0或1被跳过,因为它们正是分形中提供孔的立方体。
函数海绵(v,水平,点燃)如果电平> 0 v = v/3;为X = [-2 0 2]为Y = [-2 0 2]为Z = [-2 0 2]如果Nnz ([x y z]) > 1海绵(v+[x y z],level-1,点亮)结束结束结束结束其他的多维数据集(v,点燃)结束结束
多维数据集
此函数使用补丁画出一个金立方体的六个面。如果照明是必需的一些镜面反射率参数设置材料.
函数立方体(v,点燃)f = [1 5 7 3 3 7 8 4 1 3 4 2 2 4 8 6 1 2 6 5 5 6 8 7];黄金= [1 .85 .60];p = patch(顶点= v,...Faces = f,...FaceColor =金色,...LineWidth = 0.5);如果亮金色= [0.7,0.5,0.3,1.0,0.2];材料(p,金色)结束结束
init_fig
初始化图形、轴,如果需要,初始化一个从观察位置指向立方体的光。这个名字windowbuttonmotionfcn是MATLAB中最长的标识符,也是一个非常方便的函数。我们这里需要一个这样当我们旋转海绵时,光就会跟着旋转。
函数Init_fig (lit)轴(4*[-1 1 -1 1 -1 1])轴平等的从vis3drotate3d在视图(60,15)如果点燃camlight (-45, 10);集(gcf,“windowbuttonmotionfcn”, @wbmf);结束结束
wbmf
函数Wbmf (~,~) a = gca;L = findobj(a,“类型”,“光”);camlight (l, -45, 10);结束
软件
我的代码可用在这里.
了解更多
网上有很多关于门格尔海绵的信息。人们已经建造了一个你可以通过的通道。人们用3D打印机打印了它们。谷歌“门格尔海绵图片”,点击“查看全部”。
维基百科上有一篇好文章。https://en.wikipedia.org/wiki/Menger_sponge.
我特别喜欢这个视频。https://www.youtube.com/watch?v=fWsmq9E4YC0.
的《纽约时报》甚至还有一篇文章。https://www.nytimes.com/2011/06/28/science/28math-menger.html.
谢谢
感谢Ed Angel向我介绍了Menger的作品,感谢Bob Blaine在图像方面提供了非常必要的帮助。
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。