用 Python 模擬熱力學熵
熵是熱力學系統的一個屬性,在可逆絕熱過程中保持恆定。此外,我們還可以說它是系統中隨機性或無序性的程度。如果一個系統在其周圍環境中以溫度 T 交換 dQ 熱量,則熵的變化可以寫成 -
$$\mathrm{ds \: = \: \frac{dQ}{T} \dotso \dotso \: (1)}$$
根據克勞修斯不等式,$\mathrm{\frac{dQ}{T}}$ 沿可逆路徑的迴圈積分要麼小於或等於零。數學上,它可以寫成 -
$$\mathrm{\oint\frac{dQ}{T} \: \leq \: 0\dotso \dotso \: (2)}$$
等式適用於可逆迴圈,不等式適用於不可逆迴圈。任何不遵循公式 2 的發動機迴圈都是不可能的。
對於不同型別的過程,熵變的計算方式不同。在顯熱相互作用期間,由於沒有相變,只有溫度變化,則從狀態 1 到狀態 2 的熵變可以寫成 -
$$\mathrm{\triangle S \: = \: mc_{p} \: In \: (\frac{T_{2}}{T_{1}})\dotso \dotso \: (3)}$$
其中,$\mathrm{c_{p}}$ 是恆壓比熱容。而如果存在相變,則溫度不會發生變化,因此熵的計算方法只是潛熱除以相變溫度,如下所示 -
$$\mathrm{\triangle S \: = \: \frac{mL}{T}\dotso \dotso \: (4)}$$
其中,L 是比潛熱。公式 3 和 4 中提到的熵是總熵,即單位為 kJ/K,但在大多數情況下,我們處理的是比性質,因此比熵(kJ/kg-K)用小寫 s 表示,定義為 -
$$\mathrm{s \: = \: \frac{ds}{dm}\dotso \dotso \: (5)}$$
在某個過程中,如果氣體狀態從壓力和溫度 $\mathrm{p_{1} \: , \: T_{1}}$ 變為 $\mathrm{p_{2} \: , \: T_{2}}$,則比熵的變化可以寫成 -
$$\mathrm{\triangle s \: = \: c_{p} \: In \: (\frac{T_{2}}{T_{1}}) \: − \: R \: In \: (\frac{p_{2}}{p_{1}})\dotso \dotso \: (6)}$$
在許多情況下,使用熵可以很容易地解決問題。這些特殊情況包括 -
當兩個相同系統分別在溫度 $\mathrm{T_{1}}$ 和 $\mathrm{T_{2}}$ 下透過可逆發動機連線時,從這些有限物體中獲得的最大功及其最終平衡溫度將由下式給出 -
$$\mathrm{W_{max} \: = \: C \: \times \:(\sqrt{T_{1}} \: − \: \sqrt{T_{2}})^{2}\dotso \dotso \: (7)}$$
$$\mathrm{T_{eq} \: = \: \sqrt{T_{1} \: \times \: T_{2}}\dotso \dotso \: (8)}$$
其中,C 是系統的熱容量,是質量和比熱的乘積。
在相同熱容量 (C) 但不同溫度 $\mathrm{T_{1} \: and \: T_{2}}$ 的兩種流體混合期間,整個系統的熵變將由下式給出 -
$$\mathrm{\triangle S \: = \: C \: In \:(\frac{(T_{1} \: + \: T_{2})/2}{\sqrt{T_{1}T_{2}}})\dotso \dotso \: (9)}$$
從系統(在溫度 T 下)和熱能儲庫(在溫度 $\mathrm{T_{0}}$ 下)透過可逆發動機進行通訊獲得的最大功為 -
$$\mathrm{W_{max} \: = \: C \:((T_ \: − \: T_{0}) \: − \: T_{0} \: In \: (\frac{T}{T_{0}})\dotso \dotso \: (10)}$$
用於模擬熱力學熵的 Python 程式
以下函式是用 Python 編寫的,用於對不同情況下的熵進行計算 -
相變過程中的熵變
def s_pc(T,L): return L/T
顯熱傳遞過程中的熵變
def s_se(c,T1,T2,m=1): return m*c*log(T2/T1)
克勞修斯不等式的建模
def clausius_inequality(Q,T): Sm=sum(Q/T) if Sm<0: print("The cycle is irreversible and possible") elif Sm==0: print("The cycle is reversible and possible") else: print("The cycle is not possible")
從有限熱容量物體中獲得的最大功
def max_work_fb(T1,T2,c): Tf=sqrt(T1*T2) work=c*(sqrt(T1)-sqrt(T2))**2 return work,Tf
從與熱能儲庫相互作用的有限熱容量物體中獲得的最大功
def max_work_fb_TER(T,T0,c): return c*((T-T0)-T0*log(T/T0))
給定壓力和溫度變化的情況下,氣體在過程中的熵變。
def s_process(T1,T2,p1,p2,R,cp): return cp*log(T2/T1)-R*log(p2/p1)
繪製相變過程 (液體到蒸汽) 的 T-S 圖的函式
def plot_pc(Δs1,Δs2,Δs3,Ti,Tpc,Tf): # Plotting cycle s1=0 s2=s1+Δs1 s3=s2+Δs2 s4=s3+Δs3 # 1-2 s=linspace(s1,s2,10) T=empty(len(s)) T[0]=Ti for i in range(1,len(s)): T[i]=T[i-1]/(1-(s[1]-s[0])/ci) plot(s,T,'r-') # 2-3 s=linspace(s2,s3,20) T=zeros(20)+Tpc plot(s,T,'b-') # 3-1 s=linspace(s3,s4,20) T=empty(len(s)) T[0]=Tpc for i in range(1,len(s)): T[i]=T[i-1]/(1-(s[1]-s[0])/cw) plot(s,T,'g-') xlabel('S') ylabel('T') savefig("Entropy_pc_jpg") show()
除了這些之外,還有一個非常有用的函式是過程中的熱量互動量(包括顯熱和潛熱)
#----------------------------------------------- # Heat transfer during phase change #----------------------------------------------- def q_mel_sol(m,Ti,Tf,T_pc,c_bpc,c_apc,L): """ Function for the evaluation of heat transfer during phase change Input : mass (m), initial temp (Ti), final temp (Tf), phase change temp (T_pc),sp. heat below phase change (c_bpc), sp. heat above phase change (c_apc), latent heat (L) Output: heat interaction """ if Ti>Tf: print('Process is either freezing or condensation') return m*(c_bpc*(T_pc-Ti)-L+c_apc*(Tf-T_pc)) else: print('Process is either melting or vaporization') return m*(c_bpc*(T_pc-Ti)+L+c_apc*(Tf-T_pc))
現在讓我們舉一些例子來演示上述函式的使用。
示例 1
一臺發動機在 400 K 時接收 105 kJ 熱量,並在 200 K 時向外排放 42 kJ 熱量。檢查該發動機是否可行。
解決方案
我們將使用函式 clausius_inequality() 來檢查過程的有效性。
程式及其輸出如下所示 -
程式碼 |
輸出 |
---|---|
from numpy import * Q=array([105,-42]) T=array([400,200]) clausius_inequality(Q,T) |
迴圈不可行 |
示例 2
1 千克 268 K 的冰透過從 298 K 的大氣中吸收熱量轉化為 293 K 的水。冰和水的比熱分別為 2.093 和 4.187 kJ/kg-K。如果冰的熔點為 273 K,則計算冰、周圍環境和宇宙的熵變。同時,在 T-s 圖中繪製該過程。(相變過程中的潛熱為 333.3 kJ/kgK)
解決方案
from pylab import * # Initial ice temp. T1=268 # Phase change temp. T2=273 # Final water temp. T3=T0=293 # Specific heat of ice ci=2.093 # specific heat of water cw=4.187 # Latent heat during melting L=333.3 # 1-2 Ice Δs1=s_se(ci,T1,T2,m=1) # 2-3 Phase Change Δs2=s_pc(T2,L) # 3-4 Water Δs3=s_se(cw,T2,T3,m=1) # Entropy change of system Δs_ice=Δs1+Δs2+Δs3 # Heat transfer from the atmosphere Q=q_mel_sol(1,T1,T3,T2,ci,cw,L) # Entropy change of surrounding Δs_atm=-Q/T0 # Entropy change of universe Δs_uni=Δs_ice+Δs_atm print("Δs_system = ",round(Δs_ice,4)) print("Δs_surr = ",round(Δs_atm,4)) print("Δs_uni = ",round(Δs_uni,4)) # Plotting T-S Diagram plot_pc(Δs1,Δs2,Δs3,T1,T2,T3)
輸出
程式輸出將為 -
Process is either melting or vaporization Δs_system = 1.5556 Δs_surr = -1.4591 Δs_uni = 0.0965
它還將生成以下圖表 -

結論
在本教程中,我們使用 Python 程式設計對熱力學熵進行了建模,並對開發的函式進行了數值問題的實現和測試。