侯成
廣西師范大學(xué)化學(xué)與藥學(xué)學(xué)院,廣西 桂林 541004
結(jié)構(gòu)化學(xué)是本科化學(xué)課程中最為重要的理論課程,在化學(xué)專業(yè)課程體系中扮演著承上啟下的作用[1]。在過去的教學(xué)過程中,學(xué)生學(xué)習(xí)困難的地方主要表現(xiàn)為兩個方面,第一個是公式的推導(dǎo)涉及較多復(fù)雜運(yùn)算,而數(shù)學(xué)一直是部分同學(xué)學(xué)習(xí)過程中的“攔路虎”,另一方面,對于課程中所涉及復(fù)雜函數(shù)的圖像較為抽象,不少同學(xué)在理解上還有所欠缺。
針對這兩方面的問題,除了積極補(bǔ)充數(shù)學(xué)基礎(chǔ)知識以外,在授課中融合計算機(jī)編程語言,可以有效消除學(xué)生對數(shù)學(xué)的恐懼,加深學(xué)生對物理圖像本質(zhì)的理解。對于公式的推導(dǎo)所涉及的符號運(yùn)算和函數(shù)圖像繪制,常見的科學(xué)計算軟件如Matlab、Mathmatica、Maple等均可以實(shí)現(xiàn)[2]。然而這些軟件也有著以下缺點(diǎn):其均為商業(yè)性收費(fèi)軟件;運(yùn)行對計算機(jī)配置有要求;每一種軟件都有各自的編程語言,增加學(xué)習(xí)難度。近年來,Python語言已經(jīng)成為目前最為流行的編程語言,其優(yōu)勢主要表現(xiàn)在以下幾個方面:免費(fèi)開源;語言簡潔,易學(xué)易懂; 相關(guān)程序運(yùn)行輕盈,占用內(nèi)存資源較少;配合科學(xué)計算庫SymPy,可以集符號計算與圖像繪制功能為一體,適合課堂教學(xué)演示和計算化學(xué)實(shí)驗(yàn)的開展[3]。
本文介紹了Python開源庫SymPy的特點(diǎn)及安裝方法,通過具體案例介紹其在結(jié)構(gòu)化學(xué)課程授課過程的應(yīng)用,并給出代碼以供參考。
Sympy庫是基于Python語言的開源庫(圖1(a)),主要針對于科學(xué)計算過程中的符號計算,如微積分運(yùn)算,微分方程求解,因式分解和矩陣運(yùn)算等。它安裝非常簡便,對于已經(jīng)安裝了Python運(yùn)行環(huán)境的計算機(jī),直接在cmd命令行中運(yùn)行pip install sympy命令即可完成安裝。對于沒有安裝python環(huán)境的計算機(jī),筆者推薦直接安裝Python環(huán)境管理工具Anaconda,在該套裝軟件中,包含了常用的Python科學(xué)計算庫,同時提供了 Web交互式編程程序 Jupyter Notebook以及強(qiáng)大的集成開發(fā)環(huán)境Spyder,特別是Jupyter Notebook僅僅通過瀏覽器就可以編寫運(yùn)行Python代碼(圖1(b)),非常適合課堂教學(xué)演示,接下來我們將通過具體實(shí)例介紹其基本功能,實(shí)例運(yùn)行環(huán)境為Python 3.7.4版本。
圖1 SymPy庫介紹頁面(a)以及Jupyter Notebook運(yùn)行界面(b)
在結(jié)構(gòu)化學(xué)課程中,微分方程的求解是反復(fù)出現(xiàn)的內(nèi)容。SymPy強(qiáng)大的符號計算功能可以輕松完成微分方程通解的計算,我們以一維勢箱模型薛定諤方程求解為例[4],在Jupyter Notebook介紹其求解微分方程的功能,一維勢箱模型中勢箱內(nèi)的薛定諤方程為:
若設(shè) k2= 2mE/?2= p2/?2,則方程可簡化為:
利用SymPy求解該微分方程代碼如下,
在 Jupyter Notebook中點(diǎn)擊運(yùn)行,即可直接得到微分方程的復(fù)數(shù)形式通解 y(x) = c1exp(?ikx) +c2exp(ikx),運(yùn)行結(jié)果如圖2(a)所示。
圖2 SymPy符號計算功能應(yīng)用示例
除了微分方程以外,積分運(yùn)算也是結(jié)構(gòu)化學(xué)的公示推導(dǎo)和習(xí)題練習(xí)中常常出現(xiàn)的內(nèi)容,在這里我們以求一維勢箱粒子位置的期望值為例[5],對SymPy積分運(yùn)算過程進(jìn)行介紹。
對于一維勢箱,其不含時的波函數(shù)為:
其中n為正整數(shù),位置期望值可以利用期望值公式求得:
利用SymPy求解該微分方程代碼如下,
在Jupyter Notebook中點(diǎn)擊運(yùn)行,即可直接得到積分值為l/2,運(yùn)行結(jié)果如圖2(b)所示。
結(jié)構(gòu)化學(xué)課程中涉及分子軌道理論的課程章節(jié)中,涉及行列式以及矩陣的運(yùn)算較多,和常見的科學(xué)計算軟件一樣,SymPy也可以進(jìn)行矩陣運(yùn)算和行列式展開的操作,我們以苯分子的久期行列式為例,對這一功能進(jìn)行簡要說明。對于苯分子,在休克爾分子軌道近似條件下,其久期行列式為:
該六階行列式其展開過程較為繁瑣,在授課過程中我們通常利用對稱性進(jìn)行簡化,減少計算量。利用SymPy可以直接將其展開,其代碼如下:
點(diǎn)擊運(yùn)行后,可以直接給出其展開式x6? 6x4+ 9x2? 4 = 0,進(jìn)一步利用solve函數(shù)以x為變量求解方程 x6? 6x4+ 9x2? 4 = 0,可得方程的根為[?2, ?1, 1, 2],運(yùn)行結(jié)果如圖 2(c)所示。
波函數(shù)的繪制對于理解粒子的波動性以及能量的量子化等抽象概念有著重要的意義[6]。我們首先以一維、二維勢箱的波函數(shù)圖像繪制,其具體代碼如下,
一維勢箱波函數(shù)繪制代碼如下:
點(diǎn)擊運(yùn)行后,即可繪制對應(yīng)波函數(shù)圖像,如圖3所示。
圖3 SymPy繪制波函數(shù)圖像
對于復(fù)雜函數(shù)的圖像繪制而言,Sympy庫中已經(jīng)內(nèi)置了物理上常見的特殊函數(shù)和氫原子軌道波函數(shù),可以方便調(diào)用,調(diào)用球諧函數(shù)的運(yùn)行代碼如下:
點(diǎn)擊運(yùn)行后,即可輸出球諧函數(shù)Y1,0表達(dá)式,也是Pz軌道波函數(shù)的角度部分,見圖4(a)。
調(diào)用氫原子軌道波函數(shù)代碼如下:
點(diǎn)擊運(yùn)行后,即可輸出氫原子2Pz軌道波函數(shù)y2,1,0表達(dá)式,見圖4(b)。
不可否認(rèn)的是,SymPy庫和專業(yè)科學(xué)計算軟件在作圖上還有一定差距,譬如無法做軌道等高線圖和等值面圖,但由于其基于Python語言,可以配合其它的Python計算繪圖庫,對原子軌道的復(fù)雜波函數(shù)圖形進(jìn)行繪制,我們以Pz軌道等高線圖為例,基于matplotlib和numpy庫進(jìn)行繪制,具體代碼如下:
點(diǎn)擊運(yùn)行后,即可輸出Pz軌道波函數(shù)的等高線圖,見圖4(c)。
圖4 SymPy特殊函數(shù)調(diào)用和氫原子軌道波函數(shù)等高線繪制
本節(jié)段為結(jié)構(gòu)化學(xué)多原子分子電子結(jié)構(gòu)章節(jié),屬于量子化學(xué)部分最為重要的內(nèi)容,主要介紹基于休克爾分子軌道理論近似處理共軛分子體系電子結(jié)構(gòu)的具體方法。該部分知識點(diǎn)主要為理論的基本內(nèi)容和具體計算方法介紹,是學(xué)生進(jìn)一步學(xué)習(xí)高階課程如計算化學(xué)的基礎(chǔ)。
本節(jié)課授課對象為大學(xué)三年級學(xué)生,開設(shè)時間為大三下學(xué)期,前節(jié)內(nèi)容已經(jīng)講授了休克爾分子軌道理論的主要內(nèi)容,以及對丁二烯電子結(jié)構(gòu)處理的具體步驟,本節(jié)課將對上次內(nèi)容進(jìn)行簡要復(fù)習(xí),并介紹通過SymPy求解類似問題的具體步驟,幫助學(xué)生理清思路,消除疑惑,開拓視野,教學(xué)過程見表1。
表1 利用SymPy處理丙烯自由基分子的教學(xué)設(shè)計
(續(xù)表 1)
a) 掌握休克爾分子軌道內(nèi)容實(shí)質(zhì),具體運(yùn)算步驟;
b) 掌握SymPy在矩陣運(yùn)算,求解線性方程組等數(shù)學(xué)問題的具體方法;
c) 提高學(xué)生學(xué)習(xí)興趣,培養(yǎng)舉一反三的能力。
4.3.1 內(nèi)容綱要
a) 復(fù)習(xí)休克爾分子軌道基本內(nèi)容以及處理丁二烯電子結(jié)構(gòu)的方法;
b) 介紹SymPy中矩陣運(yùn)算,線性方程組求解方法;
c) 基于休克爾分子軌道理論,利用SymPy處理丙烯自由基分子的電子結(jié)構(gòu)。
4.3.2 教學(xué)重點(diǎn),
a) 休克爾分子軌道理論;
b) SymPy處理該問題的具體方法。
4.3.3 教學(xué)難點(diǎn)
數(shù)學(xué)運(yùn)算以及代碼編寫。
a) 板書標(biāo)示教學(xué)法;
b) 遷移教學(xué)法。
本節(jié)課從已學(xué)知識出發(fā),復(fù)習(xí)休克爾分子軌道的主要內(nèi)容,理清計算流程,在此基礎(chǔ)上介紹利用SymPy處理丙烯電子結(jié)構(gòu)的具體操作方法,該方法操作方便,學(xué)生通過實(shí)際動手操作,加深了對于休克爾分子軌道理論的理解,也對計算機(jī)在處理量子化學(xué)問題有了初步的了解,為后續(xù)開展計算化學(xué)等相關(guān)課程打下了基礎(chǔ)。
在學(xué)生反饋中,主要存在的問題主要是以下幾個方面,一個是代碼運(yùn)行環(huán)境的安裝,另外是python數(shù)學(xué)運(yùn)算符號的意義和作用先后順序,在進(jìn)一步了解了這些知識后,由于python語言易學(xué)易用的特點(diǎn),以及所見即所得的程序運(yùn)行環(huán)境,大部分同學(xué)都可以完成布置的作業(yè),有了程序設(shè)計語言作為有力工具,不少同學(xué)也由此對計算化學(xué)以及分子模擬等產(chǎn)生了濃厚的興趣。
本文通過SymPy對結(jié)構(gòu)化學(xué)課程中進(jìn)行符號運(yùn)算和函數(shù)圖像繪制進(jìn)行了介紹和實(shí)例分析。在具體的教學(xué)過程中,可以有效降低學(xué)生的畏難情緒,提高學(xué)生的學(xué)習(xí)興趣,讓學(xué)生把注意力放到具體的科學(xué)問題和物理圖像上,不僅對抽象的公式推導(dǎo)和函數(shù)圖像有了進(jìn)一步的認(rèn)識,也接觸了編程語言,為以后學(xué)習(xí)更加復(fù)雜的課程內(nèi)容教學(xué)打下了基礎(chǔ)。筆者將在未來的教學(xué)過程中繼續(xù)探索Python在結(jié)構(gòu)化學(xué)和物理化學(xué)課程中復(fù)雜問題的應(yīng)用。