張朋 咸慶軍 陳俊旗 曾長女


收稿日期:2023-04-26
基金項目:河南工業大學本科教育教學改革研究與實踐項目(2023GJYJTM16);河南省新工科研究與實踐項目(2020JGLX039);河南省高等教育學會高等教育研究項目(2021SXHLX145);河南省高等教育教學改革研究與實踐重點項目(2021SJGLX144)
DOI:10.19850/j.cnki.2096-4706.2023.22.043
摘? 要:扭轉內力是材料力學的一項重要內容,扭矩圖是扭轉內力的直觀展現,并且是檢驗學生學習效果的一個重要手段。編制繪制扭矩圖的程序,提供了深入理解扭轉內力的另一種方式,也提供了一個編程實踐的機會。文章詳細介紹了利用Python制作交互式扭矩圖繪制程序,加深了學生對利用Python繪制圖形和編制程序的理解,豐富了學生的信息技術知識,也加深了學生對扭轉內力和扭矩圖的理解,進一步增強了學生對材料力學課程的興趣和信心。
關鍵詞:材料力學;扭轉;扭矩圖
中圖分類號:TP39;G434? ? 文獻標識碼:A? ? 文章編號:2096-4706(2023)22-0195-04
Research on the Application of Python in Torsional Internal Force Teaching
ZHANG Peng, XIAN Qingjun, CHEN Junqi, ZENG Zhangnv
(College of Civil Engineering and Architecture, Henan University of Technology, Zhengzhou? 450001, China)
Abstract: Torsional internal force is an important content of mechanics of materials. Torque diagram is an intuitive display of torsional internal force and an important means to test the learning effect of students. Developing a program to plot torque diagrams provides another way to gain a deeper understanding of torsional internal force, as well as an opportunity for programming practice. The interactive torque diagram plotting program made by Python is introduced in detail, which deepens students' understanding of graphing and programming using Python, enriches their knowledge of information technology, deepens their understanding of torsional internal force and torque diagram, and further enhances their interest and confidence in the Mechanics of Materials course.
Keywords: Mechanics of Materials; torsion; torque diagram
0? 引? 言
材料力學是土木工程、機械工程等專業的專業基礎課程[1],是必須掌握的理論課。受扭桿件扭轉內力的計算和分析是受扭桿件強度及剛度計算的基礎,因此扭轉內力是材料力學課程的一項重要內容。扭矩圖的繪制是檢驗學生扭轉內力學習效果的一個重要手段。隨著計算機及信息化技術的快速發展,提升學生的計算機應用能力和編程水平也是教育的一項重要內容[2,3]。但多數學生的編程只是囿于計算機編程課和計算機等級考試[4],缺乏解決實際問題的編程鍛煉。編制一個繪制扭矩圖的程序,則提供了一個編程實踐的機會,并且可以深入理解和掌握扭轉內力。
不少學者采用MATLAB、Maple等國外商業軟件進行了力學教學研究,然而這些商業軟件往往價格昂貴,多數單位及個人難以負擔,且其中某些軟件已經禁止我國部分高校和單位使用。開源免費的Python則不存在這些問題,且其易于學習、功能強大。Python最大的優勢之一是提供了非常完善的基礎代碼庫,覆蓋了網絡、文件、圖形用戶界面等,從而使得Python幾乎無所不能,既適用于傳統的Web開發、PC軟件開發等,也適用于當下熱門的機器學習、大數據分析、網絡爬蟲等。已有學者利用Python進行了力學相關的教學研究[5-7],但其在材料力學方面的研究還不多見。本文將圍繞扭轉內力這一知識點,系統地介紹如何利用Python制作繪制扭矩圖程序。
1? Python基礎知識
Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言,其與其他語言有許多相似之處,但也存在一些差異。Python提供了眾多的基礎代碼庫,可以使用Tkinter庫快速地創建圖形用戶界面(GUI)應用程序,可以使用Matplotlib繪制圖形。
1.1? Python基本語法
Python最具特色的就是用縮進來寫模塊,縮進的空白數量是可變的,但是所有代碼塊語句必須包含相同的縮進空白數量。Python中的標識符(作為變量、函數、類、模塊以及其他對象的名稱)由字母、數字、下劃線組成,區分大小寫并且不能以數字開頭,以下劃線開頭的標識符有特殊含義,一般也不以下劃線開頭。
1.1.1? 數據類型
Python有5個標準的數據類型:Numbers(數字)、String(字符串)、List(列表)、Tuple(元組)、Dictionary(字典)。
Python的字符串有多種表現形式,用單引號(‘)或雙引號(“”)標注。Python的字符串有2種取值順序:從左到右索引默認0開始的,最大范圍是字符串長度減1;從右到左索引默認-1開始的,最大范圍是字符串開頭。使用“變量[頭下標:尾下標]”來截取相應的子字符串,獲取的子字符串包含頭下標的字符,但不包含尾下標的字符。使用“split()”方法將一個字符串按照指定的分隔符切分成多個子串,子串列表是該方法的返回值。
Python的列表是用方括號([])標注,逗號分隔的一組值。列表是Python中使用最頻繁的數據類型,可以完成大多數集合類的數據結構實現。它支持字符、數字、字符串甚至可以包含列表(即嵌套)。也使用“變量[頭下標:尾下標]”來截取相應的子列表。使用“append()”方法向列表添加項,使用“len()”方法獲取列表元素個數。
1.1.2? Python的循環
Python的循環有兩種,for循環和while循環。
Python的for語句迭代列表或字符串等任意序列,元素的迭代順序與在序列中出現的順序一致。內置“range()”函數常用于遍歷數字序列,該函數可以生成算術級數,生成的序列不包含給定的終止數值。
Python的while循環用于處理需要重復處理的相同任務,只要條件滿足,就不斷循環,條件不滿足時退出循環。
1.1.3? Python的函數
Python定義函數使用關鍵字“def”開頭,后跟函數名、圓括號和冒號,函數語句從下一行開始,并且必須縮進。如果有傳入參數則放在圓括號中間,需要返回函數值時使用“return”語句。
1.2? Tkinter工具
Tkinter是Python的標準圖形用戶界面庫,擁有良好的跨平臺性,且語法簡潔、代碼易讀。使用Tkinter可以快速地創建Python的GUI應用程序,使用前需要使用“import tkinter”引入。Tkinter提供了十多種不同類型的窗口控件,如按鈕,標簽和文本框等。
1.2.1? 窗口控件
窗口控件是一切控件的基礎,所有的控件的都需要放置在窗口來顯示。示例代碼如下:
window = tkinter.Tk()
window.title('示例窗口')
window.geometry('530x502')
window.mainloop()
1.2.2? 標簽(Label)
使用“Label”在窗口中創建一個顯示文本或者圖像的標簽。示例代碼如下:
lable = tkinter.Label(window,text=‘示例文本)
lable.config(font=(10))
lable.place(x=10,y=30)
此段代碼在窗口中坐標為(10,30)處創建了一個內容為“示例文本”的標簽,文本字體大小為10號字體。窗口的坐標原點在其左上角。
1.2.3? 多行文本輸入框
使用“Text”在窗口中創建一個多行文本輸入框。示例代碼如下:
text = tkinter.Text(window, width=71, height=4)
text.place(x=15,y=40)
此段代碼在窗口中坐標為(15,40)處創建了一個空白的多行文本輸入框,其寬為71、高為4。文本框中的文本可以通過“get()”方法獲取。
1.2.4? 按鈕(Button)
使用“Button”在窗口中創建一個按鈕。示例代碼如下:
button = tkinter.Button(window,command=lambda:myfunction(),text=‘示例按鈕)
button.config(width=12,height=1,font=(8))
button.place(x=20,y=145)
此段代碼在窗口中坐標為(20,145)處創建了一個內容為“示例按鈕”的按鈕,其寬為12、高為1,文本字體大小為8號字體,點擊其將執行對應的“myfunction()”函數。
1.3? Matplotlib
Matplotlib是一款用于數據可視化的Python庫,支持跨平臺運行,能夠輕松地實現各種圖形的繪制。Pyplot是Matplotlib的子庫,提供了和MATLAB類似的繪圖API,能方便地繪制2D圖表,使用前需要使用“import matplotlib.pyplot as plt”引入。Matplotlib可以配合Python GUI工具在應用程序中嵌入圖形,如通過“FigureCanvasTkAgg”將繪制的圖形顯示到tkinter窗口上,使用前需要使用“from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg”引入。Matplotlib生成的圖形主要由包括:Figure(整個圖形畫布)和Axes(繪圖區域)。示例代碼如下:
fig =plt.Figure(dpi=100)
fig.tight_layout()
ax = fig.add_subplot(1,1,1)
canvas =FigureCanvasTkAgg(fig, master=window)
canvas.draw()
canvas.get_tk_widget().place(x=15, y=185, width=500, height=300)
此段代碼在窗口中坐標為(15,185)處創建了一個寬為500、高為300的Matplotlib圖形。
Matplotlib使用“plot()”函數繪制點和線,其具有可選格式的字符串參數,用來指定線型、標記顏色、樣式以及大小。使用“text()”函數向繪圖區域添加文本。Matplotlib可以根據自變量與因變量的取值范圍,自動設置x軸與y軸的數值大小,也可以使用“set_xlim()”和“set_ylim()”對x、y軸的數值范圍進行設置。
2? 扭轉內力基本理論
受扭桿件(軸)橫截面上的內力為扭矩,扭矩的求解使用截面法。用一假想平面切割桿件后,可以取截面任意一側的部分桿件為研究對象,其在橫截面上的內力和此部分桿件上的外力偶的共同作用下處于平衡狀態。不妨取截面的右側部分桿件作為研究對象,在暴露的橫截面上加上正的內力T,此內力的方向為水平向左(按右手螺旋法則),以水平向右為正方向,列平衡方程,即:
-T + ∑ Mi = 0
整理可得:
T = ∑ Mi
作用在軸上的外力偶多于兩個時,扭矩需要按上述方法分段計算。為了表示橫截面上的扭矩沿軸線的變化情況,以確定最大扭矩及其所在橫截面的位置,可以用平行于軸線的橫坐標表示截面位置,用垂直于軸線的縱坐標表示扭矩的值,從而繪制出表示扭矩與橫截面位置關系的圖形,即扭矩圖。
3? 扭矩圖繪制程序的編程實現
本節將詳細介紹利用Python編程制作交互式扭矩圖繪制程序,有助于教師和學生了解如何將Python這一強大的工具結合到材料力學的教學和學習當中。
3.1? 程序界面的制作
通過Python編程,生成程序窗口,并在窗口界面上布置標簽、多行文本框、按鈕等控件,進行窗口界面的布局和設計,得到如圖1所示的程序界面。
程序界面對應的Python代碼如下:
window = tkinter.Tk()
window.title('扭矩圖繪制程序(編制:河南工業大學 張朋)')
window.geometry('530x502')
lable = tkinter.Label(window,text='力偶數據:')
lable.config(font=(10))
lable.place(x=10,y=10)
text = tkinter.Text(window, width=71, height=4)
text.place(x=15,y=40)
string1='(說明:第i個力偶用“xi,mi”表示,其中xi、mi分別表示'
string1=string1+'第i個力偶的位置和大小,多個力偶間用“;”隔開。)'
lable = tkinter.Label(window,wraplength=500,text=string1)
lable.config(font=(10),justify='left')
lable.place(x=15,y=100)
button = tkinter.Button(window,command=lambda:calculate_plot(),text='畫扭矩圖')
button.config(width=12,height=1,font=(8))
button.place(x=20,y=145)
fig =plt.Figure(figsize=(5,3), dpi=100)
fig.tight_layout()
ax = fig.add_subplot(1,1,1)
ax.axis('off')
canvas =FigureCanvasTkAgg(fig, master=window)
canvas.draw()
canvas.get_tk_widget().place(x=15, y=185, width=500, height=300)
通過該程序界面,可以實現數據的輸入和扭矩圖的繪制。其中,需要輸入的數據有:所有力偶的位置和大小。點擊“畫扭矩圖”按鈕后則根據輸入的數據進行數據處理和扭矩計算并繪制出對應的扭矩圖。
3.2? 輸入數據的處理
通過Python編程,根據輸入的所有力偶的信息,使用字符串函數分割處理后存儲在列表數組“forces”中,第一、第二列分別存儲力偶的位置和大小,具體代碼如下:
forces_input=text.get('1.0','1.end')
data=forces_input.split(";")
n_force=len(data)
forces= []
for xx in data:
xx_list=xx.split(',')
forces.append([float(xx_list[0]),float(xx_list[1])])
3.3? 扭矩的計算
分段計算每一段的扭矩,存儲在列表數組“ts”中,第一、第二、第三列分別存儲扭矩的起始位置、終止位置和大小,Python代碼如下:
ts= []
for index in range(0,n_force):
t_i=0
for i in range(index,n_force):
t_i=t_i+forces[i][1]
ts.append([0,forces[index][0],t_i])
for index in range(1,n_force):
ts[index][0]=ts[index-1][1]
3.4? 扭矩圖的繪制
根據各段扭矩圖的起始終止位置和扭矩值繪制各段的扭矩圖,Python代碼如下:
l_bar=ts[n_force-1][1];
l_frac0=l_bar/20;
t_max_abs=abs(ts[0][2]);
for m in range(1,n_force):
if t_max_abs t_max_abs=abs(ts[m][2]) ax.cla() ax.axis('off') for m in range(0,n_force): x0_m=ts[m][0] x1_m=ts[m][1] y_m=ts[m][2] ax.plot([x0_m,x0_m,x1_m,x1_m,x0_m],[0,y_m,y_m,0,0],color='k') y_off=-t_max_abs*0.1; if ts[m][2]>0: y_off=t_max_abs*0.02; ax.text((x0_m+x1_m)/2,y_m+y_off,str(round(ts [m][2],3)),horizontalalignment='center') x01_m=x0_m+l_frac0; while(x01_m ax.plot([x01_m,x01_m],[0,y_m],color='k') x01_m=x01_m+l_frac0; canvas.draw() 繪制圖2所示的扭矩圖,則填入數據“1,4.775; 2,-15.917;3,6.367”,點擊“畫扭矩圖”,得到了正確的扭矩圖。 4? 結? 論 本文主要研究了Python在扭轉內力教學中的應用,詳細介紹了利用Python制作扭矩圖繪制程序,既加深了學生對扭轉內力和扭矩圖的理解,也使學生初步掌握了圖形界面制作及繪制圖形等Python編程知識。將編程內容引入材料力學課程,使傳統理論課程與現代信息技術交叉融合,豐富了學生的信息技術知識,也進一步增強了學生對所學課程的興趣和信心。 參考文獻: [1] 孫訓方,方孝淑,關來泰.材料力學(Ⅰ):第6版 [M].北京:高等教育出版社,2019. [2] 朱利娜.注重加強非計算機專業大學生計算機應用能力的培養 [J].高等教育研究學報,2007(2):60-61. [3] 徐亞平.高校非計算機專業學生計算機應用能力培養方案 [J].計算機教育,2012(6):4-7. [4] 許楊劍,阮洪勢,沈倩倩,等.材料力學教學中的編程實踐——應力狀態分析 [J].力學與實踐,2018,40(4):446-450. [5] 李曉明.Python軟件庫在大學力學教學中的應用 [J].科教文匯,2022(8):69-73. [6] 郭子灃.理論力學動力學作業在線平臺的建立及其應用研究 [D].南昌:南昌大學,2020. [7] 錢寧偉.彈性力學計算的程序化及其在作業平臺上的應用研究 [D].南昌:南昌大學,2022. 作者簡介:張朋(1986—),男,漢族,河南南陽人,講師,博士,研究方向:計算力學。