如何对Python LJ势能计算脚本输出的多个ljp(r)浮点数值求和
问题原因
- 你当前的求和逻辑只在单次循环内处理当前的单个
ljp(r)返回值,没有把所有循环的计算结果汇总,每次得到的sum都是单个数值本身,自然和直接打印ljp(r)的输出一致 - 循环内重复定义
ljp、castToList函数属于冗余操作,既影响性能也没有实际作用 - 你当前的两点距离计算公式有误:两点欧氏距离应该是
(x1-x2)² + (y1-y2)² + (z1-z2)²的平方根,不是|x1² - x2²|的和,这个错误会导致你的LJ势能计算结果完全不准,需要优先修正。
修复后的完整代码
import numpy as np import itertools as it import math # 函数定义统一放在循环外,避免重复声明 def ljp(n): # 存在r=0的数据,会导致1/0错误,因此当r=0时跳过LJP计算 if n == 0: return 0 else: # 作业1中的公式 return 4*1*((1/n)**12 - (1/n)**6) filename = 'lj-0200.xyz' xyz_file = np.genfromtxt(fname=filename,skip_header=2,dtype='unicode') xyz = open(filename) atom_quantity = int(xyz.readline()) atom_coordinates = (xyz_file[:,1:]) atom_coordinates = atom_coordinates.astype(float) # 总迭代次数等于2个原子的组合数 # 将坐标数据转换为数组 array = np.array(atom_coordinates) # 对数据中所有原子生成组合 # 所有重复配对均已删除 combinations = it.combinations(array,2) # 初始化总和变量,或者用空列表存储所有值 total_ljp = 0 # 可选:如果需要保留所有单个值,就初始化空列表 # all_ljp = [] for combination in combinations: array_comb = np.array(combination) # 修正距离计算逻辑:先做坐标差再平方 diff = array_comb[0] - array_comb[1] r_sq = np.sum(diff ** 2) r = math.sqrt(r_sq) current_ljp = ljp(r) # 打印当前单个值,不需要可以注释 print(current_ljp) # 累加总和 total_ljp += current_ljp # 可选:追加到列表 # all_ljp.append(current_ljp) # 所有循环结束后打印总和 print("所有LJ势能的总和为:", total_ljp) # 如果你用列表存储的话,求和可以这样写 # print("所有LJ势能的总和为:", sum(all_ljp))
运行说明
运行修改后的脚本,会先逐个打印每对原子的LJ势能值,最后一行输出所有值的总和。如果不需要打印单个势能值,把循环内的print(current_ljp)注释掉即可。
内容的提问来源于stack exchange,提问作者riven
相关产品推荐
相关产品推荐

