Что не так с моей математикой в ​​моей попытке нарисовать сет Мандельброта? - PullRequest
1 голос
/ 25 мая 2019

В настоящее время я пытаюсь кодировать программу на python, что приводит к отрисовке набора Мандельброта. Форма фрактала выглядит хорошо, но контур совсем не точный. Я пытаюсь выяснить, связана ли проблема с моей математикой или моим кодом

Я попытался увеличить максимальное количество итераций (которое я назвал 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 Ответ

3 голосов
/ 25 мая 2019

Основная проблема здесь:

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, по крайней мере для точек около границы, при создании изображений с высоким разрешением.

...