【固体物理】体心立方A6A12常数计算

文章展示了使用Python编程计算体心立方结构中A6和A12参数的过程,包括构造点阵、计算距离、存储和排序、单位换算以及求和。代码实现了从简单立方结构出发,随着近邻数量增加,A6和A12值变化的图形分析。
摘要由CSDN通过智能技术生成

记录一下固体物理课程写的作业。

关于体心立方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()

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值