记录一下固体物理课程写的作业。
关于体心立方A6与A12的简单计算。
写了几个函数,构造点阵,计算距离排序,记录近邻的距离以及个数,单位换算累加求和。
最后画了两个图(A6/A12的值随近邻数的变化曲线)代码已注释
简单立方也可以使用同样的逻辑。
import numpy,math
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 整体以(0,0,0)点为中心考察
#构造体心立方点阵
def BCC(stage):
point = []
n = stage -1
#体心点
for i in range(-n,n+1):
for j in range(-n,n+1):
for k in range(-n,n+1):
point.append((i,j,k))
pass
pass
pass
pass
#非体心点
for i in numpy.arange(-n-0.5,n+1.5,1):
for j in numpy.arange(-n-0.5,n+1.5,1):
for k in numpy.arange(-n-0.5,n+1.5,1):
point.append((i,j,k))
pass
pass
pass
pass
point.remove((0,0,0))
return point
# 距离储存 获得r和对应的个数,按照r的大小从小到大排列[(r1,num1),(r2,num2)...]
def dis_numstore(point):
dis_and_number = []
dis = []
for i in point:
distance = math.sqrt(i[0] * i[0] + i[1] * i[1] + i[2] * i[2])
# 需要进行一个单位的换算,以及距离储存
dis.append(distance * 2 * math.sqrt(3) / 3)
pass
non_repeat_dis = list(set(dis))
non_repeat_dis.sort()
for i in non_repeat_dis:
dis_and_number.append((i, dis.count(i)))
pass
return dis_and_number
# 计算A6的函数
def A6computing(precision,dis_and_number):
A6 = 0
for i in range(1,precision+1):
r = dis_and_number[i-1][0]
number = dis_and_number[i-1][1]
A6 = A6 + 1/(r**6)*number
pass
return A6
# 计算A12的函数
def A12computing(precision,dis_and_number):
A12 = 0
for i in range(1,precision+1):
r = dis_and_number[i-1][0]
number = dis_and_number[i-1][1]
A12 = A12 + 1/(r**12)*number
pass
return A12
stage = int(input('请输入立方扩展的次数:(扩展得多,可以算的近邻就多)'))
precision = int(input('请输入想算到第几近邻:'))
point = BCC(stage)
dis_and_number = dis_numstore(point)
A6 = A6computing(precision,dis_and_number)
A12 = A12computing(precision,dis_and_number)
print('A6=',A6,'A12=',A12)
# 图像绘制部分
# stage = 8
#
# A6x = []
# A6y = []
# A12x = []
# A12y = []
#
# for precision in range(1,70):
# point = BCC(stage)
# dis_and_number = dis_numstore(point)
# A6 = A6computing(precision,dis_and_number)
# A12 = A12computing(precision,dis_and_number)
# A6x.append(precision)
# A6y.append(A6)
# A12x.append(precision)
# A12y.append(A12)
# pass
# plt.plot(A6x,A6y,linestyle='dashed')
# plt.xlabel('计算到第x近邻')
# plt.ylabel('A6的值')
# plt.title('A6的值随计算近邻数的变化趋势')
# my_y_ticks = numpy.arange(8, 13, 0.3)
# plt.plot(A12x,A12y,linestyle='dashed')
# plt.xlabel('计算到第x近邻')
# plt.ylabel('A12的值')
# plt.title('A12的值随计算近邻数的变化趋势')
# my_y_ticks = numpy.arange(7, 9.5, 0.3)
# plt.yticks(my_y_ticks)
# plt.show()