GPU支持对分形的痴迷

Cleve Moler, MathWorks

我是个分形迷。现在我有了一个可以让我上瘾的GPU。gpu最初是用来加速图形的,但是MATLAB®使用它们来加速计算。分形1是需要大量计算的图形。完美的GPU候选人。

GPU重新激起了我对曼德尔勃特集合本身的兴趣,并使用三种分形变体促进了工作:“燃烧的船”、“权力之塔”和牛顿方法的全局收敛行为。

我的GPU是一个NVIDIA®泰坦V被安置在一个比笔记本电脑更大的独立外围设备中,提供独立的电源和冷却系统。它大约比CPU快300倍来计算这些分形,并且完全改变了我与我的曼德布洛特程序。我介绍了gpuArray进入程序,现在可以使用一个网格分辨率可与我的屏幕分辨率和迭代,直到图像中的细节变得可见。

可视化曼德尔布罗特集合

1978年,曼德尔勃特集合的第一张照片在一台行式打印机上打印出来Robert w .布鲁克斯和彼得Matelsk。

曼德尔布罗特集合的行打印机图像。

第一张彩色图片出现在杂志的封面上科学美国人在1985年。这大约是计算机图形显示变得广泛可用的时候。

曼德尔勃特集合的彩色图像。

从那时起,曼德尔勃特集合激发了对数学的深入研究,并成为许多图形项目、硬件演示和web页面的基础。

在曼德尔勃特集合里面

在曼德尔布罗特发生的事情仍然存在于曼德尔布罗特。曼德尔勃特涉及到带有复数的简单迭代,从初始点\(z_0\)开始。曼德尔勃特集合是由轨迹定义的值(z_0)组成的复杂平面中的区域

\[z_{k+1} = z_{k}^2 + z_{0}, k=1, 2,…\]

仍然有界。就是这样。这就是整个定义。如此简单的定义竟能产生如此迷人的复杂性,真是令人惊讶。

上面所示的彩色图像是一个鸟瞰了曼德尔勃特集合。它没有解决显示丰富的外边缘的详细结构的边界集。事实上,曼德尔勃特集合小丝达到到边缘地区,尽管边缘很难看到这一观点。

图1是曼德尔布罗特集合的几何图形。最大的组件是一个心形心形,其边界为带有参数方程的曲线

\[z = e^{it}/2 - e^{2it}/4, -\pi \le t \le \pi \]

图1所示。曼德尔布罗特集合几何的草图。

左边的心形是一个半径为¼的圆盘。心脏线和椎间盘接触在红点处。稍后再详细介绍那个红点。

在这两个部件的周围是无穷多的近似圆形的圆盘,以及圆盘上的圆盘,它们的直径不断减小。最小圆盘的精确位置和形状只能通过计算来确定。

最近已经证明了曼德尔布罗特集合是数学上连接的,但连接区域有时太薄,我们无法在图形屏幕上解析它,甚至无法在合理的时间内计算它。

计算曼德布洛特

我们与曼德尔布罗特联系在一起的迷人的模式来自于集外的边缘区域。

这是计算的核心函数。输入是一个复标量起点z0一个实标量参数深度。输出是一个计数kz。如果迭代终止是因为z那么在半径为2的圆盘外呢z是注定要成为无限和计数吗kz可以用作到colormap的索引。另一方面,如果z幸存了下来深度迭代,然后声明它在Mandelbrot集合内。

函数kz = mandelbrot(z0,depth) z = z0;kz = 0;而(z*conj(z) <= 4) & (kz <= depth) kz = kz + 1;z = z*z + z0;结束结束

让我们在复平面上生成一个点网格,覆盖一个正方形的宽度w,以复点为中心

网格= 512;s = w *(1:1 /网格:1);(u, v) = meshgrid (s +真实(佐),s +图像放大(佐));

现在,在CPU上运行的程序和在GPU上运行的程序之间唯一的区别就来了。要在CPU上生成网格,

z0 = u + i*v;

GPU,

z0 = gpuArray(u + i*v);

然后,对于任意一个处理器,语句

kz = arrayfun (@mandelbrot z0);

应用标量函数曼德布洛特到数组的所有元素z0。在CPU上,这是一个向量化的双精度浮点数在网格上循环。在GPU上,语句被分解成数百个并行运行的独立任务。

现在让我们来看看来自曼德尔勃特边缘的两幅不同寻常的图像。

在边缘上

被称为海马谷的区域位于中央心脏线和它左边的椎间盘之间。实际上有两个谷折,一个在实轴上,一个在实轴下。它们在图1中看到的红点处相遇。只要有点想象力,您就可以想象出生活在图2中的小海洋生物。稍后我们将看到,山谷也包含埋π。

图2。海马谷。

因为Mandelbrot集合是自相似的,所以它包含无限多个微型Mandelbrot,每个Mandelbrot的形状都与大的Mandelbrot相同。如图3所示,其放大倍数为1010

图3。一个微型曼德布洛特。

埋π

1991年,科罗拉多州立大学(Colorado State University)的研究生戴夫·鲍尔(Dave Boll)发现了一个惊人的结果。波尔当时正在研究曼德尔布罗特迭代在海马谷中的行为。当它们接近轴时(-3/4,0),即图1中的红点,山谷变得更窄。

我们可以在一个以-3/4 +点为中心的小网格上重复Boll的计算值很小y和虚数单位

y = 1。0e-07 zc = -3/4 + y*i

使网格刚好足够大,以接触轴。

宽度= 2*y网格= 4

选择深度成反比y,这使它变得巨大。

深度= 4 / y

使用这些参数,运行上面的代码。它产生

kz = 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000 31415926 40000000 31415926 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000

查看网格中心的迭代计数。看到一个熟悉的值了吗?

这不是侥幸。亚伦借阅,于2001年发表的一篇论文“π了曼德尔勃特集合,分析类似的计算在尖端心形的前面。

接下来,曼德尔布罗特迭代的一个奇怪变体。

燃烧的船

燃烧的船来自一个奇怪的迭代:

\[z_{k+1} = F(z_k) + z_{0}, k=1, 2,…\]

在哪里

\[F(z) = (|Re(z)| + i |Im(z)|)^2\]

我说这很奇怪,因为函数(F(z))不是解析的。我对这个迭代很感兴趣,因为在下面的图片中有不可思议的相似之处。

图4所示的初始域是以-0.5-0.5为中心的宽为3.5的正方形。我在船的尾迹处插入了一个指向感兴趣区域的箭头。

图4。燃烧的船,最初的领域。

将船的尾迹放大500倍至-1.861-.002。应用彩色地图,使它看起来是冷的,而不是燃烧。图5显示了分形的结果,旁边是1915年南极探险家欧内斯特·沙克尔顿的船“耐力”号在威德尔海冻结的照片。

https://nla.gov.au/nla.obj-158931586/view.

" data-toggle="lightbox">

图5。左图:燃烧的船的尾迹。右图:赫尔利1915年拍摄的沙克尔顿的船在南极洲被冰冻结的照片。图片来源:澳大利亚国家图书馆,https://nla.gov.au/nla.obj-158931586/view

塔的力量

从任意复数(z)开始,反复取幂。

\[z, z^z, z^{z^z},…]

我们可以将其表示为迭代。从\(y_0 = 1\)和let开始

\ [y_ {k + 1} = z ^求和{k} \]

如果\(z\)太大,则此迭代将膨胀到无穷大。对于某些(z),它会收敛到一个有限的极限。例如,如果\(z = \sqrt 2\), \(y_k\)将收敛到2。最有趣的情况是当\(y_k)接近循环时。例如,如果\(z\)接近2.5+4\(i\),则循环长度为7。

2.4684 + 4.0754i -0.6216 + 0.3634i 0.2603 - 0.0184i 1.4868 + 0.3613i -3.4877 + 6.1054i 7.7632e-06 - 2.6617e-06i 1.0000 + 0.0000i 2.4684 + 4.0755i

这个循环长度是“权力之塔”分形的基础。图6显示了整体的分形。

图6。权力之塔分形。

放大10倍5更改颜色映射将生成如图7所示的图像。

图7。权力塔的分形细节。

牛顿法

当牛顿法的起始点不接近函数的零点时,全局行为会显得不可预测。从复杂平面上一个区域的起始点到收敛点的迭代计数的轮廓图生成发人深省的分形图像。

迭代是熟悉的。选择一个带有导数的函数(f '(z)\)。从\(z_0\)和let开始

\[z_{k+1} = z_{k} - f(z_{k})/f '(z_{k})\]

这最终会收敛到0的\(f\)。计算接近目标所需的迭代次数。

有许多函数(和颜色映射)可供选择。我最喜欢的三次多项式是

\[f(z) = z^3 - 2z - 5\]

图8显示了被划分为三个区域的复杂平面,其中迭代收敛于立方的三个0中的一个。这些区域之间是强烈的分形作用区域,如图中黑色部分所示。

图8。牛顿对z的迭代3.- 2z - 5。

图9显示了牛顿法求0的全局行为

\[f(z) = tan(sin(z)) - sin(tan(z))\]

这个函数有无穷多个零和一个无界的一阶导数。

图9。详细来自牛顿迭代的tan(sin(z)) - sin(tan(z))。

图10的函数是

\[f(z) = z\;sin(1/z) \]

最突出的蓝色区域环绕在±0 1 /π。

图10。细节来自牛顿对zsin (1/z)的迭代。

这里描述的许多图像对我来说都是全新的——我以前从未见过它们。与GPU的交互实验使它们成为可能。

1分形这个术语是由Benoit Mandelbrot(1924-2010)提出的,他是一位波兰/法国/美国的数学家,职业生涯的大部分时间都在位于纽约州约克镇高地的IBM Watson研究中心度过

2019年出版的


参考文献

查看相关功能的文章