确定宏观态下的微观态排布方式枚举算法

*eg.*以3个一维简谐振子组成的独立的定域子体系为例,体系的总能量$U = \frac{9}{2}h\nu$,体系的体积为$V$,这时体系的宏观态可通过状态参量表示为$(\frac{9}{2}h\nu,V,3)$.有多少种可能的排布方式?

是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

image-20230320130301941

有3个一维简谐振子,即让3个粒子依次分配在能级上。而总能量$U=\frac{9}{2}h\nu$,所以一个粒子的最高处于$E_3=\frac{7}{2}h\nu$上。

从数学上,我们可以通过3层分类讨论实现枚举可能的分布方式,即先枚举第一个粒子的能级,然后枚举第二个粒子的能级,最后枚举第三个粒子的能级。

其枚举路线图实际上是一种树型结构,如图所示。紫色代表合法的排布方式枚举出口,红色代表已经不合法的排布方式,所以没有必要继续枚举了。

枚举树t0320

那么如何去遍历这棵树呢?这里可以考虑最常见的搜索算法-深度优先搜索算法(DFS)。同时,用递归函数去具体实现。

深度优先搜索算法(Depth-First-Search,DFS)是一种用于遍历或搜索算法。这个算法会尽可能深地搜索树的分支。

image-20230320131815647

递归函数是一种具体的编程代码实现方式。编程语言中,函数直接或间接调用函数本身,则该函数称为递归函数。可以类比数列的递推关系式,如下数列的Python递归函数代码实现。 $$ a_n= \begin{cases} 0&,n=1 \ a_{n-1}+1&,n>1 \end{cases} $$

1
2
3
4
def a(n):
	if n <= 1:
		return 0
	return a(n-1)+1

即上述问题的Python代码实现为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
N = 3               # 粒子数目
E = 9/2            # 体系能量
A = []
T = [0]*N
m = int(E-N+1)+1
D = dict()
def f(v):
    return v+1/2
def dfs(x):
    if sum(T) > E:
        return
    if x == N:
        if sum([f(i) for i in T]) == E:
            d = getDist(T)
            if d in D:
                D[d] += 1
            else:
                D[d] = 1
            A.append(T.copy())
        return
    for i in range(m+1):
        T[x] = i
        dfs(x+1)
        T[x] = 0
def getDist(t):
    lst = [0]*(m+1)
    for i in t:
        lst[i] += 1
    return "-".join([str(i) for i in lst])
dfs(0)
with open('answer.txt','w') as f:
    f.write("体系各种可能的能级分布为:\n")
    f.write("|能级\t|")
    dn = len(D)
    for i in range(dn):
        f.write("分布类型%d\t|"%(i+1))
    f.write('\n')
    DT = [x.split('-') for x in list(D.keys())]
    DT = [[int(i) for i in X] for X in DT]
    TB = [[0 for i in range(dn)] for j in range(m+1)]
    for i in range(m+1):
        for j in range(dn):
            TB[i][j] = int(DT[j][i])
    for i in range(m+1):
        f.write("|%d/2hv\t|"%(2*i+1))
        for j in range(dn):
            f.write("%d\t|"%TB[i][j])
        f.write('\n')
    NM = list(D.values())
    f.write('|\t|')
    for i in range(dn):
        f.write("%d\t|"%NM[i])
    f.write('\n')
    O = sum(D.values())
    G = max(D.values())
    f.write("Ω=%d\n"%O)
    f.write("最概然分布出现的数学概率为%d/%d=%d%%"%(G,O,int(G/O*100)))

输出结果

体系各种可能的能级分布为:

能级 分布类型1 分布类型2 分布类型3
1/2hv 2 1 0
3/2hv 0 1 3
5/2hv 0 1 0
7/2hv 1 0 0
3 6 1

Ω=10 最概然分布出现的数学概率为6/10=60%

comments powered by Disqus