跳转到内容

Julia 和 Mandelbrot 集/四元数图片

来自维基教科书,开放的书籍,开放的世界

使用更多维度

[编辑 | 编辑源代码]

当然,Julia 和 Mandelbrot 集可以在高于二维的空间中构建,但如果我们让图片成为以通常方式着色的二维截面,那么这样做并没有太多收获。我们应该让截面成为三维的,并将集合看作一个以与我们为分形景观着色相同的方式着色的物体或表面。这里我们将让图形为白色,并将光线设为人工的(具有平行光线),因此图片以灰色色调显示,色调随着距离的增加而变深。

至于函数,我们可以让它成为从空间到自身的一个映射,但如果它不满足与柯西-黎曼微分方程相对应的东西,那么结构将与非复数情况相同。这些方程无法推广到三维空间,但它们可以推广到四维空间,因为在四维空间中(与三维空间相反),我们可以引入计算运算,这些运算是对复数运算的自然扩展。

四元数的性质

[编辑 | 编辑源代码]

复数到四维的扩展是由爱尔兰数学家W.R. Hamilton (1805-65) 在 1843 年发现的。汉密尔顿将他的新数称为四元数。四元数是形式为x + yi + uj + vk的数,其中xyuv 是实数,其中两个新符号jk,与i 一样,满足 = -1,并且三个符号通过ij = k 连接。

从这些关系可以得出jk = iki = j,但也可以得出ji = -k,也就是说,ji = -ij。这意味着四元数的乘法不满足交换律。但除此之外,四元数与实数和复数一样,构成了一个:你可以用它们进行运算,就像你对实数和复数进行运算一样。四元数的斜域 是复数域的扩展,并且四元数具有与复数相同的美妙而简单的性质。例如:对于一个 n 次多项式 p(z),方程 p(z) = 0 恰好有 n 个根(有些可能是重根),如果一个四元数函数 f(z) 在一个开域(在四元数中)的每个点处都可微,那么它可以无限次地微分。

因此,我们可以毫无问题地将 Julia 和 Mandelbrot 集的理论推广到四元数:我们所说的所有内容(临界点、循环、势函数和距离函数,......)几乎没有修改就有效——只有场线需要说明。

渲染四元数分形时的选择

[编辑 | 编辑源代码]
四元数 Mandelbrot 集
四元数 Julia 集

我们需要一个策略来将四维模式转换为二维。我们假设我们的函数z 为四元数)是一个具有实系数的多项式,并且它只包含偶数次幂(例如 ),因为这样,由 1、ij 张成的三维子空间在迭代下保持不变,因此我们可以将自己限制在这个空间中。临界点是围绕 x 轴对称分布的复数,我们从一个有限的临界点和 ∞ 构造 Mandelbrot 集。Julia 集是一个分形表面,我们应该有两种绘制方式:填充的 Julia 集,它是包含 ∞ 的 Fatou 域的补集,以及带有内 Fatou 域中场线的 Julia 集(部分原因是内 Fatou 域中没有什么可看的,并且场线非常装饰性,部分原因是当域填充了场线时,图片绘制得更快,因为这些线停止了绘制过程)。

在空间中,我们想象一个平行于x,y 平面的平面,我们用它来与分形相交,并观察它中位于该平面后方(或“下方”)的部分。光线的强度由“向下”到分形的距离决定。平行于基面(x,y 平面)的交点平面由高度h 给出。对于 Mandelbrot 集,高度必须为正数,因为我们对位于x,y 平面下方的那部分不感兴趣(因为 Mandelbrot 集围绕基面对称,并在另一侧衰减)。颜色的色调通过连续估计到边界距离来计算,并且基于这些估计,以越来越小的步长进行近似。如果边界太薄,则近似序列可能会跳过分形(产生一个黑点)。

计算的细节

[编辑 | 编辑源代码]

我们可以让下一步下降为估计距离的一半,但我们必须安排程序,以便我们可以在图片中出现错误时使步长变小。我们必须选择一个小的数字stepmin,以便如果计算出的步长u 小于这个数字,我们就将u 设为stepmin。对于每一步,我们将计算出的步长添加到一个从 0 开始的数字中,当我们到达边界(或 Mandelbrot 集的内部或填充的 Julia 集或场线)时,我们将距离除以最高允许距离,在 Mandelbrot 集的情况下是平面的高度h,在 Julia 集的情况下是h 加上我们可以在基面下方走的最远距离(例如 2)。结果是 [0, 1] 区间内的数字,我们构建一个由该区间中的数字 t 索引的灰色色调刻度,使得 0 对应于白色,1 对应于黑色。例如,我们可以让颜色具有(相等的)RGB 值,这些 RGB 值是数字 的整数部分,其中有三个参数可以调整色调。

对于 Mandelbrot 集,当达到最大迭代次数或迭代点在半径非常大的球体之外时,迭代停止。在这种情况下,我们计算到边界的距离,并让这个数字决定下一步下降。填充的 Julia 集也是如此。对于内 Fatou 域,当序列中的一个点在给定的小距离内与循环中的一个(给定)点相同时,迭代停止。由于我们没有计算实际迭代次数,因此我们不需要计算循环的吸引力,但我们必须知道循环的阶数,并且(由于场线)必须知道对应于复数情况中旋转角度的单位四元数。

四元数与复数分形的关联

[编辑 | 编辑源代码]

曼德勃罗集与复数平面(即基面)的交集是相应的复数曼德勃罗集,它关于 x 轴对称(因为我们公式中的系数都是实数)。四元数曼德勃罗集(在三维空间中)是通过绕 x 轴旋转复数曼德勃罗集得到的。因此,曼德勃罗集的边界是一个以 x 轴为生成器的旋转对称分形表面,它因此由围绕 x 轴的圆组成。与复数平面中(即高度为 0)的点相关的朱利亚集也由围绕 x 轴的圆组成。但对于复数平面之外的点,朱利亚集由与 x 轴成一定角度的封闭曲线或曲线段组成。在这些分形表面中,结构仅在一个方向上是分形的:在垂直于此方向的方向上,它将具有曲线的真实特征——我们在非复数分形中看到的现象。

场线
场线

四元数 z = x + yi + uj + vk 的范数是实数 |z| = z 可以写成范数和单位四元数(范数为 1 的四元数)的乘积,这个单位四元数是 z幅角

在我们第四个坐标为 0 的情况下,幅角是单位球面上的一个点。而循环中某个点的周围的小圆,在复数情况下停止迭代,现在必须用一个小球代替,场线是基于这个球面上规则分布的域构建的。因此,我们可以选择由赤道圆的规则分解以及投影到赤道圆得到的域。

计算的细节

[编辑 | 编辑源代码]

然而,用于绘制场线的方法有点复杂。绘制是通过以尽可能大的步长向下走来完成的,但现在必须检查是否击中了场线。由于最初的步长很大,我们有跳过场线的风险,因此我们必须(通过试迭代)检查是否有场线挡住我们的路,如果有,则修改进一步的过程。如果场线挡住了我们的路,我们必须以更小的步长向前走,当它被击中时,我们必须以越来越小的步长向后和向前走,以找到与场线的精确交点。我们向下走的步长通常(即,当我们忽略场线时)是估计距离的一半,现在我们可能需要减小步长。

如果我们设置 ,并且如果吸引循环的阶数为 r 并且 z* 是循环中的一个点,则 z*r 次复合)的一个不动点,并且在 z* 附近,该映射(与场线有关)具有旋转的特征,其幅角为 的四元数 = 四元数 的乘积,对于循环中的 r 个点。

给定方向 (= 范数为 1 的四元数)从 *z* 出发,确定一条场线,它由所有满足以下条件的点 *z* 组成:如果 的幅角为 = 迭代的最后一个点),那么 。因此,我们必须知道单位四元数的 *k'* 次方,这可以通过以下公式计算

其中 是一个角度,使得 ,其中 t 是通过以下操作递归计算的:执行 *k* 次,从 *t* = 0 和 *i* = 0 开始

以及 .

设 *n* 为场线的数量,设 *t* 为它们的相对厚度(区间 [0, 1] 中的一个数字)。对于点 *z*,我们已经计算了 ,它是一个单位四元数,因此对应于单位球面上的一个点。由于决定场线的域选择为赤道圆的正则分解的结果,因此条件仅取决于该四元数在复平面上的投影的幅角。如果 *v* 是这个角度(在区间 [0, 2[) 中选择)除以 2,那么如果对于某个整数 *i* = 0, 1, ..., *n*,*|v - i/n| < t/(2n)*,则 *z* 属于一条场线。

然而,由于我们想知道是否有场线阻挡了我们的去路,我们首先执行一个预计算,计算到边界的距离并确定相关的场线,这条场线具有数字 *i*,使得 *|v - i/n| < 1/(2n)*。我们计算数字 *d = 2n|v - i/n| - t*。如果 d 为负数,则点 *z* 实际上属于场线,并且该点被涂成白色。否则,我们将 *d* 视为到场线距离的度量,并用 *d* 乘以计算的步长,以便当我们靠近一条场线时步长变小。

我们必须找到我们向下走时场线被击中的精确点。因此,我们以越来越小的步长来回走动。我们将当前的高度称为 *h1*,并将旧的高度称为 *h2*。当我们第一次进入一条场线时,我们设置 *h3 = h1* 和 *h1 = (h1 + h2)/2*,并再次计算我们是否在场线内部。如果不是,我们设置 *h2 = h1* 和 *h1 = (h1 + h3)/2*,如果是,我们设置 *h3 = h1* 和 *h1 = (h1 + h2)/2*。我们这样做,直到 *h2 - h1 < stepmin*。然后到场线的距离为 *h - h1*(*h* 是平面的高度)。

华夏公益教科书