Набор Мандельброта становится расплывчатым около 2 ^ 47 zoom - PullRequest
1 голос
/ 04 февраля 2020

Итак, я создал простой код масштабирования Мандельброта, который увеличивает (lmb) или out (rmb) там, где вы щелкаете. Часть рендера уменьшается вдвое при каждом клике, так как она увеличивается в кривой.

Проблема не в том, насколько велико число максимума и аддитора, фрактал всегда кажется размытым при значении 2 ^ 47. , Вот как это выглядит при увеличении 2 ^ 49.

В любом случае ниже приведен мой код. Может кто-нибудь сказать мне, почему он становится размытым и как я могу решить эту проблему?

import numpy as np
from numba import jit
from matplotlib import pyplot as plt
from matplotlib import colors
from datetime import datetime


width, height, resolution = 8, 8, 100
maxiter = 50    #starting maxiter
additer = 50    #value to add to maxiter upon zoom
xmin, xmax = -2, 1
ymin, ymax = -1.5, 1.5
zoom = 1
color = 'terrain'   #https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html


#--------------------------------------------------------------------------------------------------#

@jit
def mandel(c, maxiter):
    z = c
    for n in range(maxiter):
        if (z.real*z.real + z.imag*z.imag)>4:   #if z diverges
            return n
        z = (z * z) + c
    return 0



@jit
def mandelbrot(xmin, xmax, ymin, ymax, maxiter):
    re = np.linspace(xmin, xmax, width*resolution)
    im = np.linspace(ymin, ymax, height*resolution)
    answer = np.empty((width*resolution, height*resolution))
    for y in range(height*resolution):
        for x in range(width*resolution):
            answer[x,y] = mandel(re[x] + 1j*im[y], maxiter) #iteration count at (re, im)
    return answer



def onclick(event):
    global zoom, xmax, xmin, ymax, ymin, maxiter
    if event.button == 1:
        zoom *= 2
        maxiter += additer
    elif event.button == 3:
        zoom/=2
        if maxiter > additer:
            maxiter -= additer
    #get the re,im coordinate position of mouse
    posx = xmin + (xmax-xmin)*event.xdata/(width*resolution)
    posy = ymin + (ymax-ymin)*event.ydata/(height*resolution)
    print(posx, posy, "iter:", maxiter, "zoom:", zoom)
    #change max and min so the coordinate is at the center
    xmin = posx - (1.5/zoom)
    xmax = posx + (1.5/zoom)
    ymin = posy - (1.5/zoom)
    ymax = posy + (1.5/zoom)
    #recalculate and display
    answer = mandelbrot(xmin, xmax, ymin, ymax, maxiter)
    plt.imshow(answer.T, cmap=color)
    plt.draw()

#for benchmarking
'''a = datetime.now()
mandelbrot(xmin, xmax, ymin, ymax, zoom)
print(datetime.now() - a)'''

answer = mandelbrot(xmin, xmax, ymin, ymax, maxiter)
plt.connect('button_press_event', onclick)
plt.imshow(answer.T, cmap=color)
plt.axis('off')
plt.tight_layout()
plt.show()
...