我正在研究牛顿分形的实现,这是我目前所做的:
import numpy as np
import matplotlib.pyplot as plt
f = np.poly1d([1,0,0,0,1,0,-1]) # x^3 - 1
fp = np.polyder(f)
rts = f.r
def newton(z0, f, fp, MAX_IT=1000):
TOL = 1e-8
z = z0
for i in range(MAX_IT):
dz = np.divide(f(z),fp(z))
adz = np.absolute(dz)
if np.any(adz < TOL) :
return z
z -= dz
return False
npts = 1000
x = np.linspace(-1,1,npts)
y = np.linspace(-1,1,npts)
xx, yy = np.meshgrid(x, y)
pic = newton(np.ravel(xx+yy*1j),f,fp)
我从this答案中得到灵感,并修改了牛顿方法的实现。我的问题是pic
有复杂的条目,而plt.imshow
不接受这种类型的数据。
我尝试在pic
上使用2*cos(np.angle(zz))
,得到的结果是:
这是一种工作,但不是真的。这个就是我想要的:
所以我的问题是我可以将我的数据转换成plt.imshow
可以接受的格式而不丢失信息吗?如果不能,我可以使用什么替代方法来获得相同的结果?我更希望保留方法的向量化,因为它更快,更有效(在我看来)。
1条答案
按热度按时间7lrncoxx1#
要回答您的问题,不需要从复杂的数值转换数据,因为您只需要为每个唯一值分配不同的颜色(具有一定的公差)。
以下是一些指导方针,可以帮助您获得预期的结果:
对于每个像素,计算以下值:
之后,您需要为每个根分配不同的颜色,并为每个像素使用按迭代次数缩放的相应颜色。
您的函数当前似乎返回每个像素的收敛根,但是您的实现是不正确的,因为当任何值收敛时,您返回整个数组
z0
。牛顿分形的神奇之处在于每个像素以不同的速度收敛!我强烈建议您查看您链接的answer作为您的灵感,并确保您了解算法。它们的实现计算到达根所需的迭代次数。您可以修改它们的实现,以返回聚合根并创建可视化。