【问题标题】:What's wrong with my maths in my attempt to draw the Mandelbrot set?我在尝试绘制 Mandelbrot 集时数学有什么问题?
【发布时间】:2019-05-24 21:20:32
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    主要问题在这里:

    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 有一个内置的复数类。我更新了我的答案以描述您如何使用它。
    • @TomKarzes 和fractional escape 你有很好的输出,迭代限制要低得多(即使在高缩放时)。
    • @Spektre 谢谢,是的,我在自己的实现中使用了分数转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2020-07-01
    • 2020-12-26
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多