我目前正在尝试用 python 编写一个程序,从而绘制 mandelbrot 集。分形的形状看起来不错,但轮廓一点也不精确。我想弄清楚问题是来 self 的数学还是我的代码
我尝试提高最大迭代次数(我称之为 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")
我是法国人,所以您可能无法理解所有内容。我没有粘贴所有关于定义不同深浅的蓝色等的行...... 我不明白为什么我的大纲这么糟糕。我相信它来 self 的数学,但我没有看到任何错误。 这是我第一次在堆栈溢出上发帖,我还不了解每个工具。我没有设法添加输出图像 对不起我的英语,我希望你能帮助我修复我的代码
最佳答案
主要问题在这里:
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 确实有一个内置的复数类,因此您可以将 z
和 Z
初始化为 z = complex(x, y )
和 Z = complex(0.0, 0.0)
。
然后你的循环体将有:
Z = Z**2 + z
我还建议增加最大迭代次数。将其限制为 20 将得到非常低的分辨率。在生成高分辨率图像时,我通常至少使用 1000,至少对于边界附近的点。
关于python - 我在尝试绘制 Mandelbrot 集时数学有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56299653/