迷人可爱的Mandelbrot集箍和卷曲是浮点计算不准确的结果吗?
我编写了各种Mandelbrot集实现,例如动态缩放和回放。一些使用定点算法,另一些使用FPU。
我见过这个问题,它表明每一个芽都是数学上光滑的形状,周围有较小的芽。
海马形状等的游行是计算机浮点运算局限性的副作用,而不是实际的曼德布罗特集吗?
海马?由Spektre添加:
我一直想说的是,浮点运算,无论是定点运算还是固定意义运算,都不能保持迭代步骤的真实结果。Mandelbrot集有趣的部分在边界附近,在这个区域,迭代坐标可以在最终“逃逸”之前在循环的近重复中抖动数千次。
我的问题是:算术失败到导致模式吗?据我所知,完美的Mandelbrot套装实际上是围绕其他芽排列的光滑形状的芽,无穷无尽。评论者说,算术越好,著名的海马等形状越好,这可以在糟糕的实现产生模糊的图像时看到。但这只会强化我的问题:算术越精确,算术就越精确和有规律地失败,直到随着坐标的变化,出现不连续性,并以稍微不同的方式发展到失败。
不管怎样,这里有一个C函数,它使用x87 FPU迭代一个点。这段代码不是最近的,通过利用方块之间的差异,还有改进的余地,这仍然在我古老的“待办事项”列表上。
int MAXRAD = 4;
int K_LIMIT = 5000;
double REAL8, IMAG8;
int iterate (void)
// calculate Mandelbrot iterations of REAL8, IMAG8
// return iterations
{
int iters;
__asm {
FILD DWORD PTR MAXRAD ;MAX R^2
FLD QWORD PTR IMAG8 ;INIT Y VALUE
FLD QWORD PTR REAL8 ;INIT X VALUE
FLD ST(1) ;WORKING Y = IMAG
FLD ST(1) ;WORKING X = REAL
MOV ECX,DWORD PTR K_LIMIT
MOV BX,0100h ;MASK FOR C0 FLAG
ALIGN 4
MLOOPB: ;ITERATE ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7
; X Y REAL IMAG 4.0
FLD ST(0) ;PUSH X X X Y REAL IMAG 4.0
FMUL ST(1),ST ;X * X X X^2 Y REAL IMAG 4.0
FMUL ST,ST(2) ;X * Y XY X^2 Y REAL IMAG 4.0
FADD ST,ST(0) ;2 * XY 2XY X^2 Y REAL IMAG 4.0
FADD ST,ST(4) ;2XY+IMAG Y' X^2 Y REAL IMAG 4.0
FXCH ST(2) ;Y', Y Y X^2 Y' REAL IMAG 4.0
FMUL ST,ST(0) ;Y * Y Y^2 X^2 Y' REAL IMAG 4.0
FLD ST(0) ;PUSH Y^2 Y^2 Y^2 X^2 Y' REAL IMAG 4.0
FADD ST,ST(2) ;Y^2 + X^2 R^2 Y^2 X^2 Y' REAL IMAG 4.0
FCOMP ST(6) ;TEST & POP Y^2 X^2 Y' REAL IMAG 4.0
FNSTSW AX ;STATUS
FSUB ;X^2 - Y^2 ... Y' REAL IMAG 4.0
FADD ST,ST(2) ;X' X' Y' REAL IMAG 4.0
TEST AX,BX ;CHECK C0
LOOPNZ MLOOPB ;LOOP IF (ITERS > 0) and (RADIUS^2 < 4)
FNINIT ;INIT COPROCESSOR TO CLEAR STACK
MOV EAX,DWORD PTR K_LIMIT
SUB EAX,ECX ;DONE, LOOP WAS COUNTED DOWNWARD
MOV DWORD PTR iters,EAX
}
return iters;
}
请注意,迭代循环中没有内存加载/存储操作。
我还问了一个关于StackExchange数学的问题。
在Mandelbrot集合中看到的卷发、海马形状、花蕾以及所有其他令人惊奇的东西都是真实的,不是计算的结果。事实上,计算中的数字越重要——舍入误差越小——计算出的形状就越复杂。个人警告:Mandelbrot集合的编码可能会上瘾!
对于复杂变量,我使用以下复杂类文件。 下面的java代码是Mandelbrot集合的迭代计算器示例。 提前谢谢!
为了理解我在某个地方读到的一句话,我真的在挠头:“我们在分形中放大的越多,我们最可能需要执行的迭代就越多”。 到目前为止,我还没有找到任何数学/学术论文证明这一说法。我还设法找到了一个计算mandelbrot集的小代码,取自这里:http://warp.povusers.org/Mandelbrot/但是,我们无法理解缩放是如何影响迭代的。 谢谢!
虽然可视化曼德布洛特(Mandelbrot)集合与机器学习没有任何关系,但这对于将TensorFlow应用在数学更广泛的领域是一个有趣的例子。实际上,这是tensorflow一个非常直截了当的可视化运用。(我们最终也许会提供一种更加精心设计的运用方式来生成真正更加美丽的图像。) 说明:本教程使用了IPython的notebook。 基本步骤 首先,我们需要导入一些库。 # 导入仿真库 import
我制作了一个程序来计算mandelbrot集合中的点。对于不属于mandelbrot集的点,我会记录起点发散到震级大于2的地方所需的迭代次数。基本上,对于mandelbrot集合之外的每一点,我都有一个计数器,可以显示它在1到256的范围内发散的速度。我想做的是根据每个点发散的速度给它一个颜色。例如,在255次迭代中发散的点可能是白色的,发散越快,着色越多。我已经做了一个简单的调整,在20步以上的
虽然可视化曼德布洛特(Mandelbrot)集合与机器学习没有任何关系,但这对于将TensorFlow应用在数学更广泛的领域是一个有趣的例子。实际上,这是tensorflow一个非常直截了当的可视化运用。(我们最终也许会提供一种更加精心设计的运用方式来生成真正更加美丽的图像。) 说明:本教程使用了IPython的notebook。 基本步骤 首先,我们需要导入一些库。 # 导入仿真库 import
有一个简单的JS代码,可以呈现非常基本的Mandelbrot分形。 任务是沿其轴以随机角度旋转此分形。它不应该是画布旋转或它的图像数据,但我必须调整初始的分形公式来做到这一点。 例如,如果角度为45度或以弧度为单位的PI/4,则输出应如下所示 我试过玩没有任何成功。