You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
改动说明
  1. 数组大小修正:将初始化长度从组合数改为num_particles*(num_particles-1),确保能容纳所有有序组合的结果
  2. 循环逻辑调整:内层循环遍历所有粒子,通过if i != j排除自身,让每个参考粒子i和所有其他粒子j(无论顺序)计算约化质量
  3. 文档字符串优化:调整描述文字,更清晰匹配功能逻辑

比如输入masses = [m1, m2, m3],返回数组顺序为:
[m1&m2的约化质量, m1&m3的约化质量, m2&m1的约化质量, m2&m3的约化质量, m3&m1的约化质量, m3&m2的约化质量],完全符合需求。

内容的提问来源于stack exchange,提问作者Charlotte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:05:42