numpy 我可以将复值网格数据转换为真实的值数据而不丢失信息吗?

yqhsw0fo  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(96)

我正在研究牛顿分形的实现,这是我目前所做的:

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可以接受的格式而不丢失信息吗?如果不能,我可以使用什么替代方法来获得相同的结果?我更希望保留方法的向量化,因为它更快,更有效(在我看来)。

7lrncoxx

7lrncoxx1#

要回答您的问题,不需要从复杂的数值转换数据,因为您只需要为每个唯一值分配不同的颜色(具有一定的公差)。
以下是一些指导方针,可以帮助您获得预期的结果:
对于每个像素,计算以下值:

  • 牛顿法收敛到的根
  • 需要多少次迭代才能到达根

之后,您需要为每个根分配不同的颜色,并为每个像素使用按迭代次数缩放的相应颜色。
您的函数当前似乎返回每个像素的收敛根,但是您的实现是不正确的,因为当任何值收敛时,您返回整个数组z0。牛顿分形的神奇之处在于每个像素以不同的速度收敛!
我强烈建议您查看您链接的answer作为您的灵感,并确保您了解算法。它们的实现计算到达根所需的迭代次数。您可以修改它们的实现,以返回聚合根并创建可视化。

相关问题