Я пытаюсь получить сюжет из набора Мандельброта, но у меня возникают проблемы с построением ожидаемого сюжета.
Как я понимаю, множество Мандельброта состоит из значений c, которые бы сходились, если бы повторялись с помощью следующего уравнения z = z ** 2 + c. Я использовал начальное значение z = 0.
Изначально я получал прямую линию. Я ищу решения онлайн, чтобы увидеть, где я ошибся. В частности, используя следующую ссылку, я попытался улучшить свой код:
https://scipy-lectures.org/intro/numpy/auto_examples/plot_mandelbrot.html
Вот мой улучшенный код. Я не очень понимаю причину использования np.newaxis и почему я строю окончательные значения z, которые сходятся. Я неправильно понимаю определение множества Мандельброта?
# initial values
loop = 50 # number of interations
div = 600 # divisions
# all possible values of c
c = np.linspace(-2,2,div)[:,np.newaxis] + 1j*np.linspace(-2,2,div)[np.newaxis,:]
z = 0
for n in range(0,loop):
z = z**2 + c
plt.rcParams['figure.figsize'] = [12, 7.5]
z = z[abs(z) < 2] # removing z values that diverge
plt.scatter(z.real, z.imag, color = "black" ) # plotting points
plt.xlabel("Real")
plt.ylabel("i (imaginary)")
plt.xlim(-2,2)
plt.ylim(-1.5,1.5)
plt.savefig("plot.png")
plt.show()
и получил следующее изображение, которое выглядит ближе к набору Мандельброта, чем все, что я получил до сих пор. Но это больше похоже на звезду sh с разбросанными точками вокруг него. Изображение
Для справки, вот мой исходный код до улучшения:
# initial values
loop = 50
div = 50
clist = np.linspace(-2,2,div) + 1j*np.linspace(-1.5,1.5,div) # range of c values
all_results = []
for c in clist: # for each value of c
z = 0 # starting point
for a in range(0,loop):
negative = 0 # unstable
z = z**2 + c
if np.abs(z) > 2:
negative +=1
if negative > 2:
break
if negative == 0:
all_results.append([c,"blue"]) #converging
else:
all_results.append([c,"black"]) # not converging