牛顿的吸引力盆地
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," 除了它缺少更多点而且它们分布均匀。
您如何选择绘制哪些点和不绘制哪些点?
一般来说,您需要将 x
和 y
的整个范围作为初始条件来求解方程。对于 select 所有那些初始的 x
s 和 y
s,你想要一个足够小的步骤让你的图表看起来漂亮(但不要小到你浪费时间计算点最终成为同一像素的一部分)。
然后您需要迭代 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 线程通信以绘制每个像素。
我正在尝试使用 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," 除了它缺少更多点而且它们分布均匀。
您如何选择绘制哪些点和不绘制哪些点?
一般来说,您需要将 x
和 y
的整个范围作为初始条件来求解方程。对于 select 所有那些初始的 x
s 和 y
s,你想要一个足够小的步骤让你的图表看起来漂亮(但不要小到你浪费时间计算点最终成为同一像素的一部分)。
然后您需要迭代 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 线程通信以绘制每个像素。