当前位置: 首页 > 知识库问答 >
问题:

理解分形,尤其是mandelbrot集

雍志新
2023-03-14

为了理解我在某个地方读到的一句话,我真的在挠头:“我们在分形中放大的越多,我们最可能需要执行的迭代就越多”。

到目前为止,我还没有找到任何数学/学术论文证明这一说法。我还设法找到了一个计算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); }
    }
}

谢谢!

共有2个答案

蔚宏大
2023-03-14

你问过缩放是如何影响迭代的,我典型的缩放迭代比是,如果你放大到9倍的大小,我会增加1.7次迭代。当然,九分之一的大小意味着宽度和高度都除以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的zoomfactor,但是任何东西都可以。重要的是,您需要保持zoomfactor和交互增加之间的关系。

秦伯寅
2023-03-14

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

  1. 我们只迭代了50次

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

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

尝试是你最好的朋友:-)用低迭代和高迭代计算一个集合,然后从第一个图像中减去第二个图像。您将始终看到边缘(黑色像素与彩色像素相交处)的变化,但如果您的缩放级别较高(意味着:点坐标有许多分数位数),您将获得不同的图像。

 类似资料:
  • 对于复杂变量,我使用以下复杂类文件。 下面的java代码是Mandelbrot集合的迭代计算器示例。 提前谢谢!

  • 我试着制作这个Mandelbrot分形发生器,但当我运行它时,我得到了一个像圆一样的输出。不知道为什么会这样。我想我的颜色可能有问题,但即使如此,形状也不正确。

  • 问题内容: 我搜索了有关Java和编码的信息,但没有找到说明如何处理编码和解码字符串时Java出现的公共问题的资源。关于单个错误,有很多特定的问题,但是我没有找到有关该问题的广泛答复/参考指南。主要问题是: 什么是字符串编码? 为什么在Java中我可以读取带有错误字符的文件? 为什么在处理xml时出现y字节UTF-8序列异常的无效字节x?主要原因是什么,以及如何避免它们? 问题答案: 由于Stac

  • 我开始制作一个mandelbrot集分形查看器。在放大分形时,我遇到了很多问题。如果您尝试缩放,查看器将刚好靠近中心。我已经尽我所能去理解这个困境。我怎样才能放大我的分形,当我放大时,它会放大屏幕的中心,而不是分形的中心?

  • 我一直在做一个渲染Mandelbrot分形的项目。对于那些知道的人,它是通过迭代以下函数生成的,其中c是复杂平面上的点: 迭代该函数将生成以下分形(忽略颜色): 当你把函数改为这个,(z提高到三次方) 分形应该呈现为这样(同样,颜色并不重要): 然而,当我把z提升到3的幂次时,我得到了一个非常类似于把z提升到2的幂次时的图像。如何正确进行分形渲染?这是完成迭代的代码:(实变量和虚变量只是将屏幕从-

  • 迷人可爱的Mandelbrot集箍和卷曲是浮点计算不准确的结果吗? 我编写了各种Mandelbrot集实现,例如动态缩放和回放。一些使用定点算法,另一些使用FPU。 我见过这个问题,它表明每一个芽都是数学上光滑的形状,周围有较小的芽。 海马形状等的游行是计算机浮点运算局限性的副作用,而不是实际的曼德布罗特集吗? 海马?由Spektre添加: 我一直想说的是,浮点运算,无论是定点运算还是固定意义运算