gpt4 book ai didi

python - 如何加速马德隆常数的三维求和?

转载 作者:太空宇宙 更新时间:2023-11-04 00:45:37 27 4
gpt4 key购买 nike

对于我的计算物理课,我们必须计算 Madelung Constant对于氯化钠。我执行此操作的代码使用了三个嵌套的 for 循环,因此运行速度非常慢。我想知道是否有办法使用数组或其他方法来提高计算速度。谢谢

from math import sqrt 
l= int(input("The lattice size is :"))
M = 0.0
for i in range(-L,L+1):
for j in range(-L,L+1):
for k in range(-L,L+1):
if not (i==j==k==0):
M += ((-1)**(i+j+k+1))/sqrt(i*i +j*j +k*k)

print("The Madelung constant for NaCl with lattice size",l,"is",M)

最佳答案

既然您在评论中提到您可以使用 numpy,我建议您这样做。您可以为您的整数构造一个 3d 网格,并同时计算每一项,从而向量化您的计算。您只需要注意每个整数都为 0 的奇异情况,例如使用 numpy.where :

import numpy as np

ran = np.arange(-L,L+1)
i,j,k = np.meshgrid(ran,ran,ran)
M = np.where((i!=0) | (j!=0) | (k!=0),
(-1)**(i+j+k+1)/np.sqrt(i**2+j**2+k**2),
0).sum()

ran 是一个 numpy 数组,其元素与 range() 中的元素相同(如果在 python 3 中转换为列表)。 meshgrid 然后构造三个 3d 数组,它们一起跨越您需要执行求和的 3d 空间。

请注意,对于大型域,此方法需要更高的内存。这在矢量化中很常见:您可以以增加内存需求为代价来节省 CPU 时间。

关于python - 如何加速马德隆常数的三维求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com