【问题标题】:Newton's Basins of Attraction牛顿的吸引力盆地
【发布时间】:2016-02-20 14:07:46
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 这个问题需要更多细节。你能展示你现有的代码吗?您认为人们可以帮助您解决某个特定问题吗?还是你不了解底层概念(这可能超出了 Stack Overflow 的范围)?
  • @Conor 我觉得我需要采样更多点。问题是,当我尝试采样更多点时,CPU 使用率达到 100%,我的计算机开始滞后,有时会挂起。在普通电脑上生成这样的图需要多长时间?
  • 如果您至少添加了您使用的牛顿循环的代码,这将有所帮助。在这个分辨率下,几分钟的情节几乎是不可接受的,不再暗示编程错误。假设域在两个方向上都是 [-3..3],这是 60x60 点,具有 4-15 次牛顿循环迭代,或者步长 0.05 的 4 倍,这应该非常快。
  • 你使用什么复数实现?在 'cmath' 我没有找到 z.a 方法。
  • 类似stackoverflow.com/q/12486828/3088138这个?如果z.a 代表绝对值,为什么要多出abs?牛顿循环看起来不错,运行时间的质量变化应该有其他原因,可能是用于记住计算点的数据结构。

标签: python newtons-method


【解决方案1】:

你得到的情节看起来“差不多”,除了它缺少更多的点而且它们分布均匀。

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

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

然后您需要迭代 Newton-Raphson 方法,而不是固定数量的步骤,而是直到您的解决方案足够接近 z^3-1 == 0(等效地,直到 z^3-1 足够小)。这样你就可以确定每个点都有一个颜色。

编辑回答您的评论:

当我尝试采样更多点时,CPU 使用率达到 100%,我的计算机开始出现卡顿,有时会挂起

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

【讨论】:

  • 如果我这样做(将控制权交还给 UI 线程)或者可能使用 sleep()(我已经尝试过),情节将花费大量时间。我以 0.1 的步长通过了所有分数,大约在 5-6 秒内完成。如果我将步长减小到 0.05,它甚至不会在一个小时内完成!
  • 另外,我正在使用 matplotlib 绘制图形。因此,在整个过程完成之前,不会显示该图。所以基本上,一切都在后台发生,直到完成。
  • >不过,您并没有绘制所有点。在哪些情况下你不画一个点?
  • 如果您的计算发生在后台线程中,您的 UI 不应挂起。即使情节需要很长时间才能显示出来,您仍然应该能够移动/最小化/最大化您的窗口,关闭它等等。
  • 您的评论清除了一切。我确实没有策划所有这些。我错误地忽略了最初的猜测。合并它们后,现在的情节看起来更像是牛顿的吸引力盆地。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多