應用Python程式設計解決機械工程問題


使用Python程式設計解決PDV工作問題

在封閉系統(也稱為質量不變的系統)中,系統與其周圍環境透過熱量或功進行相互作用。在本文中,我們將處理非耗散功相互作用,也稱為PDV或位移功。我們將使用Python程式設計來解決這些問題。

但在我們開始之前,應該瞭解位移功的基本含義。位移功被評估為系統在以下壓力-體積圖中,在兩個端態之間所走路徑的積分。

要評估此功,必須完全指定路徑,這隻有在過程是準靜態的情況下才可能。在圖中,曲線(1-2)下的面積就是所做的功。數學上,它寫成如下:

以下是典型過程1-2的壓力-體積圖:

實現

現在,正如我們已經提到的,要評估PDV功,必須完全指定路徑。因此,要在Python中實現它,需要知道壓力和體積之間的關係。此外,還應預先知道關於壓力或體積的端點資訊。解決問題的步驟如下:

  • 必須開發一個函式來指定p和v之間的關係。
  • 需要提供輸入引數。
  • 必須根據輸入資料計算右側的常數。
  • 需要提供端點之間要建立的資料點數(n)。
  • 計算資料點之間的間距(h)並建立體積陣列。
  • 將使用數值積分來解決問題。
  • 最後,要繪製過程,將使用Pylab(一個用於繪圖的python模組)以及NumPy。

數學公式

對於端點a和b之間的函式f(x),可以使用梯形法則簡單地執行數值積分,如下所示:


這裡,索引i從0開始到n結束。所以,x0=a,xn=b。

過程pv=常數

為了理解這個過程,讓我們首先考慮一個壓力-體積關係由pv=c給出的問題。我們將分段編寫程式碼並在每個部分之後解釋它在做什麼。

# importing modules
from pylab import *
from numpy import *

在本部分程式碼中,分別呼叫了‘pylab’和‘numpy’模組用於資料繪圖和陣列建立。

# defining function for pv relation
def p(v,C):
    return C/v

這裡,定義了一個函式,它接受兩個引數,即體積和常數C(pv=c的右側)。可以根據給定的熱力學過程和初始條件修改此函式。

# input data
#---------------
# Initial and final volume (in m^3)
v1 = 0.1 
v2 = 0.5
# initial pressure (in kPa)
p1 = 100

然後將輸入資料提供給程式。在本問題中,我們假設端點的體積以及初始壓力是已知的。

# Evaluating C
C=p1*v1

# Number of data points between end points
n=5000

# Spacing between data points
h=(v2-v1)/n

# creating array of volume
v=linspace(v1, v2,n)

根據輸入資料計算常數C。需要提供端點之間的資料點數(因為我們使用了梯形法則,所以資料點數越多,精度越高)。計算資料點之間的間距並建立體積陣列。

# Numerical Integration
f_a=p(v1,C)
f_b=p(v2,C)
Sum=0
for i in range(1,n-1):
    Sum=Sum+p(v[i],C)
I=h*((f_a+f_b)/2+Sum)

# work done
Work = I

print(f'Work = {round(Work,3)} kJ')

在此步驟中,使用上一節中提到的公式執行數值積分。然後將積分結果傳遞給變數‘Work’(為簡單起見)並列印結果。為了繪製過程,可以使用以下程式碼段,該程式碼段使用 print()函式執行繪圖任務。

# Data plotting
figure(1,dpi=300)
plot(v,p(v,C),'r',linewidth=2)
xlabel('v (m^3)')
ylabel('P (kPa)')

ylim(0,p1+5)
xlim(0,v2+0.1)
plot([v1,v1],[0,p1],'--k')

p2=C/v2
plot([v2,v2],[0,p2],'--k')
savefig('work.jpg')

程式輸出如下:

Work = 16.091 kJ

過程pv^n=c

假設我們已經計算了pv^n過程中所做的功,其中n對我們已知。這次我們將假設端點的壓力以及初始體積是已知的。這次唯一變化的是我們將為p-v關係和輸入引數建立的函式。

這裡我們假設v1、v2和p1分別為0.1 m3、0.3 m3和200 kPa。另外,假設n=1.4。計算該過程中所做的功以及資料繪圖的Python程式如下:

# importing modules
from pylab import *
from numpy import *

# defining function for pv relation
def p(v,C,N):
    return C/v**N

# input data
#---------------
# Initial and final volume (in m^3)
v1 = 0.1 
v2 = 0.3
# initial pressure (in kPa)
p1 = 200 
# Exponent n
N=1.4

# Evaluating C
C=p1*v1**N


# Number of data points between end points
n=5000

# Spacing between data points
h=(v2-v1)/n

# creating array of volume
v=linspace(v1, v2,n)

# Numerical Integration
f_a=p(v1,C,N)
f_b=p(v2,C,N)
Sum=0
for i in range(1,n-1):
    Sum=Sum+p(v[i],C,N)
I=h*((f_a+f_b)/2+Sum)

# work done
Work2 = I

print(f'Work = {round(Work2,3)} kJ')

# Data plotting
figure(1,dpi=300)
plot(v,p(v,C,N),'r',linewidth=2)
xlabel('v (m^3)')
ylabel('P (kPa)')

ylim(0,p1+5)
xlim(0,v2+0.1)
plot([v1,v1],[0,p1],'--k')

p2=C/v2**N
plot([v2,v2],[0,p2],'--k')
savefig('work2.jpg')

程式輸出如下:

Work = 17.777 kJ

在本文中,您已經觀察到如何藉助Python評估封閉系統的功。上述程式可以輕鬆地應用於不同的過程或不同的初始條件,只需稍微更改函式、陣列和輸入引數即可。


更新於:2024年8月16日

238 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告