王際朝,張 健,阮宗利
(中國石油大學(xué)(華東) 理學(xué)院,山東 青島 266580)
“計(jì)算方法”是高等學(xué)校理工科各專業(yè)的重要基礎(chǔ)課,既有數(shù)學(xué)類課程中理論上的抽象性和嚴(yán)謹(jǐn)性,又與計(jì)算機(jī)結(jié)合密切,兼具實(shí)用性和實(shí)驗(yàn)性[1],是培養(yǎng)學(xué)生理性思維和實(shí)際動手能力的重要載體。將理論與實(shí)驗(yàn)相結(jié)合是“計(jì)算方法”課程的必然要求,也是當(dāng)前提高學(xué)生創(chuàng)新能力的必然要求[2-6]。當(dāng)前的“計(jì)算方法”課程教學(xué)主要存在兩點(diǎn)問題:①課程教學(xué)重理論輕實(shí)驗(yàn)。教學(xué)過程偏重計(jì)算方法理論的講解,弱化了計(jì)算方法與計(jì)算機(jī)技術(shù)相結(jié)合的特點(diǎn),大量的復(fù)雜公式使學(xué)生感到抽象、枯燥、難以理解,使學(xué)生學(xué)習(xí)積極性、主動性得不到發(fā)揮[6]。②教學(xué)中可視化教學(xué)手段運(yùn)用不充分。算法是“計(jì)算方法”課程的本質(zhì),教師必須通過對各種算法的詳述,來完成課程整體知識框架的搭建。算法流程構(gòu)建、檢驗(yàn)算法精度和比較算法優(yōu)劣時常常涉及大量的數(shù)值計(jì)算和各種結(jié)果的可視化,需要運(yùn)用軟件使教學(xué)內(nèi)容更形象化、生動化,以調(diào)動學(xué)生的學(xué)習(xí)積極性[7-8]。
Matlab 軟件為“計(jì)算方法”的實(shí)驗(yàn)教學(xué)和教學(xué)過程中的可視化提供了強(qiáng)有力的手段。圖形用戶界面(graphical user interface,GUI)是由窗口、按鈕、文字、圖形、菜單等對象構(gòu)成的一個用戶視窗,是人機(jī)交流信息的有效工具[9],已廣泛應(yīng)用于高等學(xué)校不同課程的實(shí)驗(yàn)教學(xué)中[10-15]?;贛atlab GUI 設(shè)計(jì)和實(shí)現(xiàn)的計(jì)算方法交互式實(shí)驗(yàn)系統(tǒng)充分考慮人機(jī)交互的友好性和可擴(kuò)展性,每個界面都配備程序設(shè)計(jì)的流程圖,學(xué)生在直觀感受算法效果的同時,可以對算法進(jìn)行修改和擴(kuò)展,加深對課程內(nèi)容的理解及掌握。該實(shí)驗(yàn)系統(tǒng)可提高教學(xué)的靈活性,為學(xué)生動手能力和創(chuàng)新能力的培養(yǎng)提供沃土。
基于Matlab GUI 的計(jì)算方法實(shí)驗(yàn)系統(tǒng)集成了“計(jì)算方法”課程的非線性方程求根、線性代數(shù)方程組求解、插值與擬合、數(shù)值積分、常微分方程初值問題數(shù)值解法這5 個經(jīng)典模塊和1 個數(shù)值優(yōu)化擴(kuò)展模塊。該實(shí)驗(yàn)系統(tǒng)的主要功能模塊如圖1 所示。
圖1 計(jì)算方法交互式實(shí)驗(yàn)系統(tǒng)功能模塊
經(jīng)典模塊涵蓋了課程大綱要求的所有內(nèi)容,模塊間既循序漸進(jìn)又相互獨(dú)立。數(shù)值優(yōu)化本屬于“最優(yōu)化方法”課程的范疇,考慮到部分專業(yè)在后續(xù)課程中未安排“最優(yōu)化方法”課程而此內(nèi)容又非常重要,且“計(jì)算方法”與“最優(yōu)化方法”課程聯(lián)系密切,故在計(jì)算方法實(shí)驗(yàn)系統(tǒng)中設(shè)計(jì)了此模塊。每個模塊中均含有不同數(shù)值算法的子模塊,在系統(tǒng)的主界面菜單中點(diǎn)擊就可打開相應(yīng)子模塊界面并進(jìn)行操作。對于每個模塊,皆可對源程序進(jìn)行修改,擴(kuò)展模塊內(nèi)容。Matlab GUI形成包含 GUI 組件屬性的擴(kuò)展名為“.fig”的文件和保存程序代碼的擴(kuò)展名為“.m”的文件[15]。GUI 程序主要包括各控件的初始化函數(shù)、輸出函數(shù)、布局以及回調(diào)函數(shù)。
GUI 設(shè)計(jì)是利用Matlab 提供的不同控件對界面進(jìn)行設(shè)計(jì),回調(diào)函數(shù)設(shè)計(jì)是實(shí)現(xiàn)界面控件要求實(shí)現(xiàn)的功能,對界面中控件的函數(shù)進(jìn)行編程,從而達(dá)到預(yù)期要求的界面設(shè)計(jì)效果和程序設(shè)計(jì)功能。實(shí)驗(yàn)系統(tǒng)的主界面采用經(jīng)典的菜單模式,主菜單上的 6 個部分對應(yīng)6個功能模塊,點(diǎn)擊可彈出各子模塊對應(yīng)的二級子菜單。單擊每個子菜單會調(diào)出各個子模塊對應(yīng)的界面。系統(tǒng)主界面如圖2 所示。
圖2 計(jì)算方法交互式實(shí)驗(yàn)系統(tǒng)主界面
子模塊具有人機(jī)交互功能,操作簡單,除了顯示執(zhí)行結(jié)果,對每個算法都配備程序設(shè)計(jì)的流程圖,學(xué)生可對照源程序和流程圖,切實(shí)理解和掌握計(jì)算方法的內(nèi)容,并進(jìn)行擴(kuò)展和改進(jìn)。
除了簡單的代數(shù)方程有求根公式外,對于稍微復(fù)雜的非線性方程,一般很難給出根的解析表達(dá)式,因此需要研究數(shù)值方法求得滿足一定精度要求的根的近似解[16]。非線性方程求根模塊包含3 個子模塊:二分法、牛頓法和割線法。學(xué)生可根據(jù)自身興趣和知識掌握情況對模塊內(nèi)容進(jìn)行擴(kuò)展。
二分法的思想是逐步將區(qū)間分半,通過判別區(qū)間端點(diǎn)函數(shù)值的符號,進(jìn)一步搜索有根區(qū)間,將有根區(qū)間縮小到充分小,從而求出滿足給定精度要求的根的近似值。牛頓法[16]的思想是將非線性方程進(jìn)行泰勒展開,然后取此泰勒展開式的線性部分作為非線性方程的近似。割線法的基本思想是用差商代替牛頓法中的導(dǎo)數(shù)。以二分法為例,此子模塊的界面如圖3 所示。
圖3 二分法子模塊界面
圖3 所示界面顯示的內(nèi)容包括程序流程圖、輸入?yún)?shù)、執(zhí)行按鈕和計(jì)算結(jié)果4 部分。用戶輸入非線性方程的表達(dá)式、求根區(qū)間的左右端點(diǎn)值和所需的求根精度,點(diǎn)擊“執(zhí)行二分法”按鈕,則在界面下方顯示方程的根以及圖形化的求根過程。
在自然科學(xué)和工程技術(shù)中很多問題的解決歸結(jié)為求解線性代數(shù)方程組。理論上,線性代數(shù)方程組可通過克萊姆(Cramer)法則進(jìn)行求解,但是隨著方程組階數(shù)的增大,所需的計(jì)算量達(dá)到驚人的程度。因此,需要研究線性代數(shù)方程組的數(shù)值解法。線性代數(shù)方程組求解模塊包含5 個子模塊:高斯消去法、三角分解法、追趕法、雅克比迭代法和高斯-賽德爾(Gauss-Seidel)迭代法。其中,前3 個屬于求解線性代數(shù)方程組的直接解法,后2 個屬于迭代解法。
高斯消去法的基本思想是通過初等變換逐步消去未知元,將原方程組化為同解的三角方程組,包含消元和回帶兩個過程。高斯消去法除了有基本的高斯消去法之外,還有高斯列主元消去法、高斯-約當(dāng)(Jordan)消去法等。該實(shí)驗(yàn)系統(tǒng)只提供基本的高斯消去法,學(xué)生可參考源程序?qū)ζ渌咚瓜シㄟM(jìn)行編程,擴(kuò)展系統(tǒng)內(nèi)容,從而鍛煉動手能力。三角分解法也稱為 LU分解法,是高斯消去法的一種等價(jià)變形[16]。由于對矩陣進(jìn)行一次初等變換就相當(dāng)于用相應(yīng)的初等矩陣去左乘原來的矩陣,將高斯消去法用矩陣乘法來表示,即可得到求解線性方程組的三角分解法。追趕法是當(dāng)方程組的系數(shù)矩陣為三對角矩陣時的一種快速矩陣分解法。雅克比迭代法每迭代一次只需計(jì)算一次矩陣和向量的乘法,計(jì)算公式簡單,但是收斂速度較慢。高斯-賽德爾迭代法是雅克比迭代法的一種改進(jìn)形式。
以高斯-賽德爾迭代法為例,此子模塊的界面如圖4 所示。用戶可輸入系數(shù)矩陣、方程右端項(xiàng)、迭代初值、最大迭代次數(shù)和迭代精度后,點(diǎn)擊“執(zhí)行Gauss-Seidel 迭代”按鈕,查看輸出結(jié)果,并可與雅克比迭代子模塊的輸出結(jié)果進(jìn)行對比分析。
圖4 高斯-賽德爾迭代子模塊界面
在科學(xué)研究和工程實(shí)踐中,要研究的函數(shù)往往比較復(fù)雜,有時很難直接寫出其數(shù)學(xué)表達(dá)式,但可以通過實(shí)驗(yàn)觀測等手段獲得該函數(shù)的一組離散采樣值,然后根據(jù)這組數(shù)據(jù)構(gòu)造某個簡單的函數(shù)去逼近或代替原函數(shù)。這種方法稱為數(shù)值逼近方法,插值與擬合是最常用的兩種數(shù)值逼近方法[16]。插值要求構(gòu)造的函數(shù)精確通過采樣點(diǎn),擬合要求在某種誤差準(zhǔn)則下構(gòu)造的函數(shù)盡可能靠近采樣點(diǎn)。插值與擬合模塊包含4 個子模塊:拉格朗日插值、牛頓插值、龍格現(xiàn)象和最小二乘擬合。
拉格朗日插值和牛頓插值都屬于代數(shù)插值的范疇,其基本思想都是給定n+1 個互異節(jié)點(diǎn)以及節(jié)點(diǎn)上的函數(shù)值,構(gòu)造一個滿足插值條件的次數(shù)不超過n的多項(xiàng)式。拉格朗日插值利用插值基函數(shù)構(gòu)造的插值多項(xiàng)式結(jié)構(gòu)對稱、形式簡單,但當(dāng)插值節(jié)點(diǎn)增加時,基函數(shù)需要重新計(jì)算。牛頓插值利用差商表構(gòu)造插值多項(xiàng)式。雖然這兩種插值方法構(gòu)造過程不同,但是根據(jù)插值多項(xiàng)式的唯一性,兩種方法構(gòu)造的是同一多項(xiàng)式。為了提高插值的精度,一般應(yīng)增加插值節(jié)點(diǎn)的個數(shù),但是在等距節(jié)點(diǎn)情況下,隨著插值節(jié)點(diǎn)個數(shù)的增多,插值誤差反而增大,這種現(xiàn)象被稱為龍格(Runge)現(xiàn)象。為了提高插值精度,并且減少龍格現(xiàn)象的發(fā)生,可引入分段插值的思想。最小二乘擬合屬于曲線擬合的一種方法,與插值不同,曲線擬合不要求曲線通過所有已知點(diǎn),而是要求得到的近似函數(shù)能反映數(shù)據(jù)的基本關(guān)系。最小二乘擬合采用最小二乘原理,即實(shí)驗(yàn)數(shù)據(jù)與擬合曲線的偏差的平方和最小,作為擬合的準(zhǔn)則。
以龍格現(xiàn)象為例,此子模塊的界面如圖5 所示。此子模塊主要是演示等距節(jié)點(diǎn)下,隨著插值節(jié)點(diǎn)的增多而產(chǎn)生的龍格現(xiàn)象。學(xué)生輸入插值函數(shù)、區(qū)間端點(diǎn)以及插值節(jié)點(diǎn)個數(shù)后,點(diǎn)擊“執(zhí)行Runge 現(xiàn)象”按鈕,界面上就會顯示不同節(jié)點(diǎn)數(shù)下的插值多項(xiàng)式與真實(shí)函數(shù)的對比。此演示模塊采用的是拉格朗日插值方法,用戶也可將牛頓插值模塊的源程序與此模塊進(jìn)行鏈接,兩種插值方法得到的插值多項(xiàng)式是相同的,因此效果圖也相同。
圖5 龍格現(xiàn)象子模塊界面
當(dāng)被積函數(shù)沒有具體的函數(shù)表達(dá)式或者被積函數(shù)的原函數(shù)不能用初等函數(shù)的有限形式表示時,理論上具有重大意義的牛頓-萊布尼茲公式的應(yīng)用會受到限制。此時可采用數(shù)值方法構(gòu)造計(jì)算公式,即用數(shù)值積分的方法來解決定積分的計(jì)算問題。數(shù)值積分模塊包括 3 個子模塊:牛頓-科特斯(Cotes)公式、復(fù)化辛普森(Simpson)公式和龍貝格(Romberg)積分。
牛頓-科特斯求積公式屬于插值型求積公式,其基本思想是在求積節(jié)點(diǎn)等距分布的前提下,用插值多項(xiàng)式近似代替被積函數(shù)。最常用的牛頓-科特斯公式是等分次數(shù)為1、2 和4 時的梯形公式、辛普森公式和科特斯公式。所謂復(fù)化辛普森公式,是將積分區(qū)間分成若干小區(qū)間,在每個小區(qū)間上采用辛普森公式計(jì)算積分值。龍貝格積分法也稱為逐次分半加速法[16],它是在梯形公式、辛普森公式和科特斯公式的基礎(chǔ)上,通過公式的內(nèi)在聯(lián)系,構(gòu)造出一種加速計(jì)算積分的方法,它在不增加計(jì)算量的前提下提高了數(shù)值積分的精度。
以龍貝格積分為例,此子模塊的界面如圖6 所示。界面所示的流程圖很清晰地給出了梯形值序列T、辛普森值序列S、科特斯值序列C和龍貝格值序列R的計(jì)算關(guān)系。學(xué)生輸入被積函數(shù)、積分上下限以及積分精度后,點(diǎn)擊“執(zhí)行龍貝格積分”按鈕,界面上就會顯示滿足精度要求的積分的近似值和龍貝格積分計(jì)算的步數(shù)。
圖6 龍貝格積分子模塊界面
所謂常微分方程初值問題的數(shù)值解法,就是將一個連續(xù)的微分方程初值問題轉(zhuǎn)化為一個離散的差分方程初值問題,然后通過解差分方程獲得其數(shù)值解。常微分方程初值問題數(shù)值解法模塊包含3 個子模塊:歐拉(Euler)法、龍格-庫塔(Runge-Kutta)法和阿當(dāng)姆斯(Adams)法。
歐拉法是一種簡單、直觀的求解常微分方程初值問題的方法,其公式可由“數(shù)值積分”和“差商代替導(dǎo)數(shù)”導(dǎo)出。根據(jù)積分公式或者差商形式的不同,歐拉法又分為向前歐拉法、向后歐拉法和改進(jìn)歐拉法等,其最高精度為2 階。龍格-庫塔法是在改進(jìn)歐拉法的基礎(chǔ)上,在斜率和步長兩方面進(jìn)行拓展而得到的高階方法,最常用的為四級四階經(jīng)典龍格-庫塔法。阿當(dāng)姆斯法是將區(qū)間劃分為若干小區(qū)間,在小區(qū)間上用更高次的插值多項(xiàng)式近似表示原來的函數(shù)。根據(jù)插值多項(xiàng)式次數(shù)的不同,阿當(dāng)姆斯法得到的公式有很多形式,其中四階的阿當(dāng)姆斯預(yù)測校正方法具有方法簡潔、使用方便和高精度等優(yōu)點(diǎn)。
以龍格-庫塔法為例,此子模塊的界面如圖 7 所示。界面顯示的是四級四階經(jīng)典龍格-庫塔法,雖然推導(dǎo)過程復(fù)雜,但是根據(jù)流程圖編程實(shí)現(xiàn)非常容易。學(xué)生在輸入一階微分方程、自變量范圍、初始條件和積分步長后,點(diǎn)擊“執(zhí)行 Runge-Kutta 方法”按鈕,界面上就會顯示節(jié)點(diǎn)以及節(jié)點(diǎn)上的函數(shù)值。學(xué)生可與其他子模塊執(zhí)行的結(jié)果進(jìn)行對比分析,亦可修改源程序,得到其他形式的龍格-庫塔法計(jì)算結(jié)果。
圖7 龍格-庫塔法子模塊界面
數(shù)值優(yōu)化所屬的“最優(yōu)化方法”,是獨(dú)立于“計(jì)算方法”的其他課程。之所以在該實(shí)驗(yàn)系統(tǒng)中設(shè)計(jì)成一個獨(dú)立的模塊,是基于以下3 點(diǎn)原因的:①數(shù)值優(yōu)化通過迭代的方式解決優(yōu)化問題,是數(shù)學(xué)建模中關(guān)鍵的一環(huán),很多專業(yè)未開設(shè)“最優(yōu)化方法”課程,導(dǎo)致在數(shù)學(xué)建模競賽中的知識缺失。②在近期興起的“機(jī)器學(xué)習(xí)”中,有大量的問題可以歸約為無約束最優(yōu)化問題,學(xué)生對新興事物有極大的興趣。③數(shù)值優(yōu)化和計(jì)算方法有著非常密切的聯(lián)系。此模塊僅起到“簡介”的作用,教師可基于此模塊的設(shè)計(jì)對數(shù)值優(yōu)化的基本思想進(jìn)行講解,感興趣的學(xué)生可借助此模塊對數(shù)值優(yōu)化進(jìn)行較為基礎(chǔ)的了解,增加知識儲備量。數(shù)值優(yōu)化模塊包含4 個子模塊:黃金分割法、最速下降法、共軛梯度法和遺傳算法。
黃金分割法也稱為 0.618 法,其基本思想是根據(jù)單峰函數(shù)的特性,基于試探法搜索函數(shù)局部最小值。最速下降法是求解無約束最優(yōu)化問題的最簡單、最古老的方法之一,是研究其他無約束優(yōu)化算法的基礎(chǔ),許多新算法都是以它為基礎(chǔ)通過改進(jìn)或修正得到的[17]。共軛梯度法是在每一迭代步利用當(dāng)前點(diǎn)出發(fā)的最速下降方向生成關(guān)于二次函數(shù)海塞陣的共軛方向,并求函數(shù)極小點(diǎn)的方法。遺傳算法是一種通過模擬自然進(jìn)化過程搜索最優(yōu)解的方法,它不存在求導(dǎo)和函數(shù)連續(xù)性的限定,能自適應(yīng)地調(diào)整搜索方向。
以最速下降法為例,此子模塊的界面如圖8 所示。界面給出了方法的程序流程圖,學(xué)生在輸入極小化函數(shù)、初始值、精度后,點(diǎn)擊“執(zhí)行最速下降法”按鈕,生成計(jì)算結(jié)果并繪制函數(shù)圖形;勾選“繪制迭代過程”復(fù)選框后,迭代過程會在圖形中清晰顯示,便于直觀地理解最速下降法的尋優(yōu)過程。
圖8 最速下降法子模塊界面
基于 Matlab GUI 設(shè)計(jì)和實(shí)現(xiàn)的計(jì)算方法交互式實(shí)驗(yàn)系統(tǒng)具有以下特點(diǎn):①界面友好,交互簡單。師生輸入算法所需參數(shù)即可觀察可視化實(shí)驗(yàn)結(jié)果并可在不同算法之間進(jìn)行對比分析。②內(nèi)容豐富,可擴(kuò)展性強(qiáng)。“5+1”模塊涵蓋了計(jì)算方法的核心內(nèi)容和擴(kuò)展內(nèi)容,對于系統(tǒng)中未提及的算法可修改源程序進(jìn)行增廣。③流程清晰,演示方便。系統(tǒng)對每個獨(dú)立的算法子模塊都配備程序流程圖,方便教師對算法進(jìn)行講解和演示,學(xué)生亦可對照流程圖和源程序加深對算法的精髓的理解。
計(jì)算方法交互式實(shí)驗(yàn)系統(tǒng)為課程理論教學(xué)和實(shí)驗(yàn)教學(xué)的有機(jī)結(jié)合提供了抓手,為實(shí)驗(yàn)教學(xué)提供了強(qiáng)有力的載體,已經(jīng)應(yīng)用在我校專業(yè)限選課“計(jì)算方法”的輔助性教學(xué)中。該實(shí)驗(yàn)系統(tǒng)提高了數(shù)值實(shí)驗(yàn)效率,改善了課程教學(xué)效果,發(fā)揮了學(xué)生的積極主動性,對學(xué)生動手能力和創(chuàng)新能力的培養(yǎng)有較大幫助。