尝试绘制Mandelbrot集的数学有什么问题?

时间:2019-05-24 21:20:33

标签: python python-3.x math colors mandelbrot

我目前正在尝试在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")

我是法国人,这就是为什么您可能不了解所有内容的原因。我没有粘贴有关定义蓝色等深浅差异的所有内容... 我不明白为什么我的轮廓这么不好。我相信这来自我的数学,但我看不到任何错误。 这是我第一次发布有关堆栈溢出的信息,我还不了解evey工具。我没有设法添加输出图像 对不起,我的英语,希望您能帮我解决我的代码

1 个答案:

答案 0 :(得分:3)

主要问题在这里:

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确实具有内置的复数类,因此您可以将zZ初始化为z = complex(x, y)Z = complex(0.0, 0.0)。  那么您的循环主体将具有:

Z = Z**2 + z

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