【问题标题】:understanding fractals and especially mandelbrot set理解分形,尤其是曼德布罗集
【发布时间】:2012-05-25 10:53:51
【问题描述】:

为了理解我在某处读到的一句话:“我们在分形内部放大得越多,我们很可能需要执行的迭代越多”。

到目前为止,我还没有找到任何证明这句话的数学/学术论文。 我还设法找到了一个计算 mandelbrot 集的小代码,取自这里: http://warp.povusers.org/Mandelbrot/ 但是,无法理解缩放如何影响迭代。

double MinRe = -2.0;
double MaxRe = 1.0;
double MinIm = -1.2;
double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
double Re_factor = (MaxRe-MinRe)/(ImageWidth-1);
double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);
unsigned MaxIterations = 30;

for(unsigned y=0; y<ImageHeight; ++y)
{
    double c_im = MaxIm - y*Im_factor;
    for(unsigned x=0; x<ImageWidth; ++x)
    {
        double c_re = MinRe + x*Re_factor;

        double Z_re = c_re, Z_im = c_im;
        bool isInside = true;
        for(unsigned n=0; n<MaxIterations; ++n)
        {
            double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
            if(Z_re2 + Z_im2 > 4)
            {
                isInside = false;
                break;
            }
            Z_im = 2*Z_re*Z_im + c_im;
            Z_re = Z_re2 - Z_im2 + c_re;
        }
        if(isInside) { putpixel(x, y); }
    }
}

谢谢!

【问题讨论】:

  • 我有一个用 Postscript here 编写的交互式 Mandelbrot 生成器。它使您可以通过交互式提示直接控制迭代(值/maxit),还可以缩放迭代作为缩放的副作用。

标签: fractals mandelbrot


【解决方案1】:

这不是一个科学的答案,而是一个有常识的答案。理论上,要确定一个点是否属于 Mandelbrot 集,您应该迭代 infinitely,并检查该值是否曾经达到 Infinity。这实际上是没有用的,所以我们做出假设:

  1. 我们只迭代了 50 次
  2. 我们检查迭代值是否大于 2

当您放大 Mandelbrot 集时,第二个假设仍然有效。然而缩放意味着增加点坐标的有效小数位

假设你以(0.4,-0.2i).开头 反复迭代此值会增加使用的数字,但不会丢失有效数字。现在,当您的点坐标看起来像这样时:(0.00000000045233452235, -0.00000000000943452634626i) 要检查该点是否在集合中,您需要更多的迭代来查看该迭代是否会达到 2 更不用说如果您使用某种 Float 类型,您将失去某些缩放级别的有效数字,您必须切换到任意精度库。

尝试是您最好的朋友 :-) 计算具有低迭代和高迭代的集合,并从第一个图像中减去第二个图像。您总是会在边缘看到变化(黑色像素与彩色像素相遇),但如果您的缩放级别很高(意味着:点坐标有很多小数位),您将获得不同的图像。

【讨论】:

    【解决方案2】:

    您询问缩放如何影响迭代,我的典型缩放与迭代比率是,如果您放大到 9 倍大小,我会将迭代增加 1.7。大小的 9 分之一当然意味着宽度和高度都除以 3。

    为了让这个更通用,我实际上在我的代码中使用了它

    Complex middle = << calculate from click in image >>
    int zoomfactor = 3;
    width = width / zoomfactor;
    maxiter = (int)(maxiter * Math.Sqrt(zoomfactor));
    minimum = new Complex(middle.Real - width, middle.Imaginary - width);
    maximum = new Complex(middle.Real + width, middle.Imaginary + width);
    

    我发现缩放和迭代之间的这种关系非常有效,分形中的细节在深度缩放时仍然很好,而不会因为迭代太快而变得太疯狂。

    如果您愿意,您希望缩放的速度有多快,我喜欢 3 的缩放系数,但什么都可以。重要的是你需要保持缩放因子和交互增加之间的关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      相关资源
      最近更新 更多