<p>一般的方法是使用布尔索引来计算那些还没有达到平衡的。你知道吗</p>
<p>我调整了Jonas Adler给出的算法以避免最大递归深度:</p>
<pre><code>def find_fix_point_vector(f,x):
x = x.copy()
x_fix = np.empty(x.shape)
unfixed = np.full(x.shape, True, dtype = bool)
while unfixed.any():
x_new = f(x) #iteration
x_fix[unfixed] = x_new # copy the values
cond = np.abs(x_new-x)>1
unfixed[unfixed] = cond #find out which ones are fixed
x = x_new[cond] # update the x values that still need to be computed
return x_fix
</code></pre>
<p>编辑:
在这里,我回顾了提出的3种解决方案。我将根据它们的提议者来调用不同的函数,<code>find_fix_Jonas, find_fix_Jurg, find_fix_BM</code>。我根据BM修改了所有函数中的不动点条件(见最后更新的Jonas函数)。你知道吗</p>
<p>速度:</p>
<pre><code>%timeit find_fix_BM(f, np.linspace(0,100000,10000),1)
100 loops, best of 3: 2.31 ms per loop
%timeit find_fix_Jonas(f, np.linspace(0,100000,10000))
1000 loops, best of 3: 1.52 ms per loop
%timeit find_fix_Jurg(f, np.linspace(0,100000,10000))
1000 loops, best of 3: 1.28 ms per loop
</code></pre>
<p>根据可读性我认为乔纳斯的版本是最容易理解的,所以应该选择在速度不是很重要的时候。你知道吗</p>
<p>然而,Jonas的版本可能会引发Runtimeerror,当到达fixpoint之前的迭代次数很大时(>;1000)。其他两种解决方案没有这个缺点。你知道吗</p>
<p>然而,B.M.的版本可能比我提出的版本更容易理解。你知道吗</p>
#
<p>使用的Jonas版本:</p>
<pre><code>def find_fix_Jonas(f, x):
fx = f(x)
ind = np.abs(fx-x)>1
if ind.any():
fx[ind] = find_fix_Jonas(f, fx[ind])
return fx
</code></pre>