好的,我已经解决了 Justin Peel 代码中的无限循环,在代码中添加了最大迭代条件,现在代码绘制了 z^4-1 之类的多项式,并且它不会进入无限循环。如果有人知道如何改进此错误,请告诉我们。我的解决方案可能会减慢代码的执行速度,但它可以工作。这是代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import itertools
import matplotlib.pyplot as plt
__author__ = 'Tobal'
__version__ = 1.0
def newton_fractal(f, xmin, xmax, ymin, ymax, xres, yres, tolerance, maxiters):
yarr, xarr = np.meshgrid(np.linspace(xmin, xmax, xres), np.linspace(ymin, ymax, yres) * 1j)
arr = yarr + xarr
ydim, xdim = arr.shape
arr = arr.flatten()
fp = np.polyder(f, m=1)
counts = np.zeros(shape=arr.shape)
unconverged = np.ones(shape=arr.shape, dtype=bool)
indices = np.arange(len(arr))
iters = 0
for i in itertools.count():
f_g = f(arr[unconverged])
new_unconverged = np.abs(f_g) > tolerance
counts[indices[unconverged][~new_unconverged]] = i
if not np.any(new_unconverged) or iters >= maxiters:
return counts.reshape((ydim, xdim))
iters += 1
unconverged[unconverged] = new_unconverged
arr[unconverged] -= f_g[new_unconverged] / fp(arr[unconverged])
pic = newton_fractal(np.poly1d([1., 0., 0., 0., -1.]), -10, 10, -10, 10, 1000, 1000, 0.00001, 1000)
plt.imshow(pic, cmap=plt.get_cmap('gnuplot'))
plt.title(r'$Newton^{\prime} s\;\;Fractal\;\;Of\;\;P\,(z) =z^4-1$', fontsize=18, y=1.03)
plt.tight_layout()
plt.show()
我正在将 Pycharm 5 与 Anaconda Python 3 一起使用,并且此 IDE 在代码中报告了一个警告,而 不是 np.any(new_unconverged)
预期的'type Union [ndarray,iterable]',改为'bool'
这个警告也出现在 Justin Peel 的原始代码中。而且我不知道如何解决它。我对这个问题很感兴趣。