Я рассчитываю силы взаимодействия между частицами в системе, используя код Python, как показано ниже:
# Step 1: First calculate the interaction force of each pair and store in a dictionary
f0_int_dict = {}
ij_pair = combinations(np.arange(1, self.N_particles + 1), 2)
# ex. list(ij_pair) = [(1, 2), (1, 3), (2, 3)] if self.N_particles = 3
for p in ij_pair:
f0_int_dict[p] = self.interaction_force_ij(coords[p[0] - 1], coords[p[1] - 1])
# Step 2: Complete the dictionary. Note that the f_int(i,j) = -f_int(j,i)
f_int_dict = copy.deepcopy(f0_int_dict)
for i in f0_int_dict:
# ex. f_int_dict[2, 1] = -f0_int_dict[1, 2]
f_int_dict[i[::-1]] = -f0_int_dict[i]
# Step 3: Calculate the total interaction force of the particle i
# (sum_{j=i+1}^{N}(f_int_ij)) and loop over i
f_int_total = np.zeros([self.N_particles, self.dimension])
for i in np.arange(self.N_particles):
# [k for k in f_int_dict if k[0] == i] is [(1, 2), (1, 3)] if i = 1 for 3 particles
for pair in [k for k in f_int_dict if k[0] == i + 1]:
f_int_total[i][:] += f_int_dict[pair][0][:]
По сути, код, приведенный выше, сначала ищет все пары частиц в система и рассчитать взаимодействия между каждой парой. В своем коде я использовал третий закон Ньютона, согласно которому сила, действующая на частицу i частицей j, равна противоположной силе, действующей на частицу j частицей i, а именно: $ f_ {ij} = f_ {ji} $. Я создал словарь f0_int_dict
, ключи которого - пары, а значения - взаимодействия между парами. Однако оказывается, что код довольно медленный, поэтому я думаю, что должен быть гораздо более быстрый способ сделать то же самое. Насколько я знаю, самой медленной частью кода ниже является вторая-последняя строка, которая содержит понимание списка, в частности, for pair in [k for k in f_int_dict if k[0] == i + 1]:
.
Может ли кто-нибудь помочь мне ускорить мой код здесь? Или есть что-то еще, что я должен изменить, чтобы улучшить память или другие? Любой опыт будет высоко оценен!