Возможно, у меня неправильный конец палки, но в Numpy вы можете выполнять векторизованные вычисления. Удалите замкнутую петлю while
и просто запустите эту ...
YD_zero = self.oldYD - ((self.oldYD - self.YD) * self.oldXD) / (self.oldXD - self.XD)
Это должно быть намного быстрее.
Обновление: Итеративный поиск корня по методу Ньютона-Рафсона ...
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:
Этот код является только иллюстративным, но он показывает, как вы можете применить итеративный процесс с использованием векторизованного кода к любой функции f
, которую вы можете найти производной от f_prime
. unconverged_mask
означает, что результаты текущей итерации будут применяться только к тем значениям, которые еще не сходятся.
Обратите внимание, что в этом случае нет необходимости повторять, Ньютон-Рафсон даст вам правильный ответ на первой итерации, так как мы имеем дело с прямыми линиями. То, что у вас есть, является точным решением.
Второе обновление
Хорошо, значит, вы не используете Ньютона-Рафсона. Чтобы вычислить YD_zero
(y-перехват) за один раз, вы можете использовать,
YD_zero = YD + (XD - X0) * dYdX
, где dYdX
- градиент, который в вашем случае выглядит как
dYdX = (YD - oldYD) / (XD - oldXD)
Я предполагаю, XD
и YD
- текущие значения x, y частицы, oldXD
и oldYD
- предыдущие значения x, y частицы, а X0
- значение x диафрагма.
До сих пор не совсем понятно, почему вы должны выполнять итерацию по всем частицам, Numpy может выполнить расчет для всех частиц одновременно.