<p>也许我弄错了,但在Numpy中,你可以执行向量化计算。删除封闭的<code>while</code>循环,然后运行这个。。。在</p>
<p><code>YD_zero = self.oldYD - ((self.oldYD - self.YD) * self.oldXD) / (self.oldXD - self.XD)</code></p>
<p>应该快得多。在</p>
<p><strong>更新:</strong>使用Newton-Raphson方法迭代求根。。。在</p>
<pre><code>unconverged_mask = np.abs(f(y_vals)) > CONVERGENCE_VALUE:
while np.any(unconverged_mask):
y_vals[unconverged_mask] = y_vals[unconverged_mask] - f(y_vals[unconverged_mask]) / f_prime(y_vals[unconverged_mask])
unconverged_mask = np.abs(f(y_vals)) > CONVERGENCE_VALUE:
</code></pre>
<p>这段代码只是说明性的,但是它展示了如何使用向量化代码对任何函数<code>f</code>应用迭代过程,您可以找到<code>f_prime</code>的导数。<code>unconverged_mask</code>表示当前迭代的结果将只应用于那些尚未收敛的值。在</p>
<p><em>注意,在这种情况下不需要迭代,Newton Raphson将在第一次迭代中给出正确答案,因为我们处理的是直线。你得到的是一个精确的解。</em></p>
<p><strong>第二次更新</strong></p>
<p>好吧,你没有用牛顿·拉斐逊。要一次性计算<code>YD_zero</code>(y截距),可以使用</p>
<p><code>YD_zero = YD + (XD - X0) * dYdX</code></p>
<p>其中<code>dYdX</code>是梯度,在你的例子中</p>
<p><code>dYdX = (YD - oldYD) / (XD - oldXD)</code></p>
<p>我假设<code>XD</code>和<code>YD</code>是粒子的当前x,y值,<code>oldXD</code>和{<cd13>}是粒子先前的x,y值,<code>X0</code>是光圈的x值。在</p>
<p>仍然不完全清楚为什么要迭代所有粒子,Numpy可以一次计算所有粒子。在</p>