这是我写的一个小脚本,用于使用牛顿法来制作分形。如何加速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()
递归的结果,最终返回步数。在复平面中的猜测表示图片中的一个像素,按收敛步骤的数量着色。从一个简单的算法,你会得到这些美丽的分形。
感谢您提出这个问题。这是帮助我了解如何使他们 –