我在尝试绘制 Mandelbrot 集时数学有什么问题?

What's wrong with my maths in my attempt to draw the Mandelbrot set?

我目前正尝试在 python 中编写一个程序,这会导致绘制 mandelbrot 集。分形的形状看起来不错,但轮廓一点也不精确。我正在尝试确定问题是来自我的数学还是我的代码

我尝试提高最大迭代次数(我称之为 i)以查看计算是否太低,但变化不大。

import numpy as np
from PIL import Image

taille = 1000
nb_points = 500
centre_x = taille/2
centre_y = taille/2

fractale = np.zeros((taille, taille, 3), dtype = np.uint8)

for x in range(-nb_points,nb_points):
    x = float(x)
    x = x/250

    for y in range(-nb_points,nb_points):
        y = float(y)
        y = y/250

        X = float(0)
        Y = float(0)
        i = 0

        module_carre = 0

        while module_carre < 4 and i <20 :
            X = float(X**2 - Y**2 + x)
            Y = float(2*X*Y + y)
            i += 1 
            module_carre = float(X*X + Y*Y)

        if module_carre < 4:
            i=0

        couleur = liste_couleur[i]

        fractale[centre_x + x*250,centre_y + y*250] = couleur
imgpil = Image.fromarray(fractale, 'RGB')
imgpil.save("resultat.jpg")

我是法国人,所以您可能无法理解所有内容。我没有粘贴所有关于定义不同深浅的蓝色等的行...... 我不明白为什么我的大纲这么糟糕。我相信它来自我的数学,但我没有看到任何错误。 这是我第一次在堆栈溢出上发帖,我还不了解每个工具。我没有设法添加输出图像 对不起我的英语,我希望你能帮助我修复我的代码

主要问题在这里:

X = float(X**2 - Y**2 + x)
Y = float(2*X*Y + y)

Y 的计算中,您想使用 X 的旧值,但它已经更新,不再可用。你可以改为:

new_X = float(X**2 - Y**2 + x)
Y = float(2*X*Y + y)
X = new_X

或者您可以并行更新它们:

X, Y = float(X**2 - Y**2 + x), float(2*X*Y + y)

此外,您不需要调用 float,所以您真正需要的是:

X, Y = X**2 - Y**2 + x, 2*X*Y + y

顺便说一下,Python 确实有一个 built-in 复数 class,因此您可以将 zZ 初始化为 z = complex(x, y)Z = complex(0.0, 0.0)。 那么你的循环体将有:

Z = Z**2 + z

我还建议增加最大迭代次数。将其限制为 20 将得到非常低的分辨率。在生成 high-res 图像时,我通常至少使用 1000,至少对于边界附近的点。