【发布时间】:2016-03-16 07:27:49
【问题描述】:
我正在使用牛顿法生成分形,以可视化根和查找根所需的迭代次数。
我对完成该功能的速度不满意。有没有办法加快我的代码?
def f(z):
return z**4-1
def f_prime(z):
'''Analytic derivative'''
return 4*z**3
def newton_raphson(x, y, max_iter=20, eps = 1.0e-20):
z = x + y * 1j
iter = np.zeros((len(z), len(z)))
for i in range(max_iter):
z_old = z
z = z-(f(z)/f_prime(z))
for k in range(len(z[:,0])): #this bit of the code is slow. Can I do this WITHOUT for loops?
for j in range(len(z[:,1])):
if iter[k,j] != 0:
continue
if z[k,j] == z_old[k,j]:
iter[k,j] = i
return np.angle(z), iter #return argument of root and iterations taken
n_points = 1000; xmin = -1.5; xmax = 1.5
xs = np.linspace(xmin, xmax, n_points)
X,Y = np.meshgrid(xs, xs)
dat = newton_raphson(X, Y)
【问题讨论】:
-
for循环在k和j上的目的是什么?这是一种测试收敛性的奇怪方法——而且你根本没有使用eps。 -
不要使用
iter,你正在覆盖一个python构建 -
您想要 z 中每个元素的迭代次数?为什么你需要一个二维数组呢?
标签: python arrays performance numpy newtons-method