Python实现多粒子全组合约化质量计算的问题求助
问题描述
给定一个质量数组(例如包含3个元素),需要实现以下逻辑计算约化质量:
- 将第一个元素m₁作为参考粒子,分别与m₂、m₃计算约化质量
- 将第二个元素m₂作为参考粒子,分别与m₁、m₃计算约化质量
- 以此类推,每个粒子都作为参考粒子与其他所有粒子计算约化质量
现有实现代码如下:
def reduced_mass(self,masses): """ Calculate the the reduced mass of two particles each. Parameters ---------- masses : array GIVE MASSES AS AN ARRAY. Returns ------- reduced_masses : array REDUCED MASSES OF A REFERENCE PARTICLE AND REDUCED MASS WITH ALL THE OTHER PARTICLES. """ num_particles = len(masses) reduced_masses = np.empty((num_particles - 1) * num_particles // 2) index = 0 for i in range(num_particles): for j in range(i + 1, num_particles): reduced_masses[index] = (masses[i] * masses[j]) / (masses[i] + masses[j]) index += 1 return reduced_masses
输入3个质量时,期望得到长度为6的约化质量数组,但当前代码生成的数组长度和数值均不符合预期,且未抛出错误,需要修正实现。
问题分析
原代码的核心问题:
- 数组初始化用了组合数公式
(num_particles - 1) * num_particles // 2,仅生成n*(n-1)/2个元素,对应无序的两两粒子组合(比如只算m₁&m₂,不重复算m₂&m₁) - 内层循环
range(i + 1, num_particles)只遍历i之后的粒子,跳过了i之前的粒子,导致每个参考粒子仅和后续粒子计算约化质量,未覆盖所有其他粒子的组合
而需求是每个粒子作为参考,与所有其他粒子(无论顺序)计算约化质量,总元素数应为num_particles*(num_particles-1)(3个粒子对应3*2=6个元素)。
修正后的实现
import numpy as np def reduced_mass(self, masses): """ Calculate the reduced mass for each particle as the reference paired with all other particles. Parameters ---------- masses : array Input array of particle masses. Returns ------- reduced_masses : array Reduced masses where each particle is treated as the reference paired with every other particle. """ num_particles = len(masses) # 初始化数组,长度为n*(n-1),容纳所有有序组合结果 reduced_masses = np.empty(num_particles * (num_particles - 1)) index = 0 for i in range(num_particles): # 遍历所有不等于i的粒子j,包含j < i的情况 for j in range(num_particles): if i != j: reduced_masses[index] = (masses[i] * masses[j]) / (masses[i] + masses[j]) index += 1 return reduced_masses
改动说明
- 数组大小修正:将初始化长度从组合数改为
num_particles*(num_particles-1),确保能容纳所有有序组合的结果 - 循环逻辑调整:内层循环遍历所有粒子,通过
if i != j排除自身,让每个参考粒子i和所有其他粒子j(无论顺序)计算约化质量 - 文档字符串优化:调整描述文字,更清晰匹配功能逻辑
比如输入masses = [m1, m2, m3],返回数组顺序为:[m1&m2的约化质量, m1&m3的约化质量, m2&m1的约化质量, m2&m3的约化质量, m3&m1的约化质量, m3&m2的约化质量],完全符合需求。
内容的提问来源于stack exchange,提问作者Charlotte
相关产品推荐
相关产品推荐

