牛顿的吸引力盆地

Newton's Basins of Attraction

我正在尝试使用 python 绘制多项式 z^3-1 的牛顿引力盆地。 我正在使用 Newton-Raphson 迭代法绘制图形。

到现在为止,我可以绘制这个:

我想要生成的是这样的:

有人可以建议我该怎么做吗?


更新 1

包括初始点(我错误地省略了)之后:


更新 2

这是 Newton-Raphson 循环的代码。是不是代码有错误导致运行慢?

def newtonraphson(z):
    if z == 0:
        return False
    z1 = 0
    z2 = z
    tolerance = 1.0e-12

    while True:
        z1 = z2
        z2 = z1 - function(z1)/derivative(z1)
        if abs((z2 - z1).a) < tolerance:
            break

    return z2

您得到的情节看起来 "about right," 除了它缺少更多点而且它们分布均匀。

您如何选择绘制哪些点和不绘制哪些点?

一般来说,您需要将 xy 的整个范围作为初始条件来求解方程。对于 select 所有那些初始的 xs 和 ys,你想要一个足够小的步骤让你的图表看起来漂亮(但不要小到你浪费时间计算点最终成为同一像素的一部分)。

然后您需要迭代 Newton-Raphson 方法而不是固定步数,而是直到您的解决方案足够接近 z^3-1 == 0(等效地,直到 z^3-1 很小足够)。这样你肯定会得到每个点的颜色。

编辑以回答您的评论:

when I try to sample more points, the CPU usage reaches 100% and my computer starts lagging and sometimes hangs

您需要每隔一段时间将控制权交还给 UI 线程。这会使您的情节变慢,但会确保它具有响应性。理想情况下,您将在后台线程中执行所有计算,并且只与您的 UI 线程通信以绘制每个像素。