Python 对内能的波矢进行求和

Python 对内能的波矢进行求和,python,physics,Python,Physics,我的代码要执行的任务是计算波矢上的和,一个遵循玻色-爱因斯坦分布的谐振子的内能。这是h*w(k)*n(k)的和,其中w^2(k)=4*sin^2(k/2),n(k)=1/(exp(hw/kbT)-1),h是约化普朗克常数,kb是玻尔兹曼常数。该系统是一个长度为L的一维振荡器链,因此N-1个可能的振荡器,具有固定的边界条件,因此可能的波矢量为pi\L到(N-1)*pi/L。下面给出了实现该求和的代码。问题是它产生了线性内能,但我们在课堂上证明了温度依赖性必须是二次的,至少在低温下,使用德拜模型 i

我的代码要执行的任务是计算波矢上的和,一个遵循玻色-爱因斯坦分布的谐振子的内能。这是h*w(k)*n(k)的和,其中w^2(k)=4*sin^2(k/2),n(k)=1/(exp(hw/kbT)-1),h是约化普朗克常数,kb是玻尔兹曼常数。该系统是一个长度为L的一维振荡器链,因此N-1个可能的振荡器,具有固定的边界条件,因此可能的波矢量为pi\L到(N-1)*pi/L。下面给出了实现该求和的代码。问题是它产生了线性内能,但我们在课堂上证明了温度依赖性必须是二次的,至少在低温下,使用德拜模型

import numpy as np 
import matplotlib.pyplot as plt
from scipy.constants import hbar, Boltzmann
L_ = np.array([5,10,20,50,100]) #Possible lengths of the chain
#N=L-2 # N-1 is the number of oscillating particles in the chain of length L=(N+1)*a
T= np.array(np.arange(0.00001,1000,0.01)) ## Temperature in Kelvin
Constant = Boltzmann/np.sqrt(4*pow(hbar,2))
Y =hbar/Boltzmann 
def U(T,L): 
    U =0
    for m in range(1,L-1): ## k range for excitations
        w = 2*abs(np.sin((m*np.pi/L)/2))
        n = 1/(np.exp(Y*w/T)-1)
        U += hbar*w*n 
   return U
def Debye(T,L):
     return L*(Boltzmann*T)**2 *(np.pi/6)
for L in L_:
    plt.figure()
    plt.plot(T,Debye(T,L),label="Debye L="+str(L))
    plt.plot(T,U(T,L))
    plt.title("Internal Energy for L=" +str(L))
    plt.xlabel("$k_B$T/$\sqrt{4C\hbar^2/M}$")
    plt.ylabel("$U(T)$")
    plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

您的温度范围不合适-1000 K通常不被视为“低温”。试试像10K或1K这样的东西。这解释了为什么您看到的行为是线性的

(文章还说低温关系是立方的,而不是二次的,但这对于这个问题来说并不重要。)