Вот небольшой скрипт, который я написал для создания фракталов с использованием метода Ньютона.Как ускорить фрактальную генерацию с помощью массивов numpy?
import numpy as np
import matplotlib.pyplot as plt
f = np.poly1d([1,0,0,-1]) # x^3 - 1
fp = np.polyder(f)
def newton(i, guess):
if abs(f(guess)) > .00001:
return newton(i+1, guess - f(guess)/fp(guess))
else:
return i
pic = []
for y in np.linspace(-10,10, 1000):
pic.append([newton(0,x+y*1j) for x in np.linspace(-10,10,1000)])
plt.imshow(pic)
plt.show()
Я использую Numpy массивы, но тем не менее, цикл по каждому элементу 1000-по-1000 linspaces применять функцию newton()
, которая действует на одной догадке, а не весь массив.
Мой вопрос: Как я могу изменить свой подход, чтобы лучше использовать преимущества массивов numpy?
P.S .: Если вы хотите попробовать код, не дожидаясь слишком долго, лучше использовать 100 на 100.
Дополнительный фон:
См. Метод Ньютона для нахождения нулей полинома.
Основная идея фрактала - проверить догадки в комплексной плоскости и подсчитать количество итераций, чтобы сходиться к нулю. Это то, что рекурсия происходит в newton()
, что в конечном итоге возвращает количество шагов. Догадка в комплексной плоскости представляет собой пиксель на картинке, окрашенный числом шагов к конвергенции. Из простого алгоритма вы получаете эти красивые фракталы.
благодарит за вопрос. это помогает мне понять, как сделать их –