王際朝,張 健,阮宗利
(中國石油大學(華東) 理學院,山東 青島 266580)
“計算方法”是高等學校理工科各專業的重要基礎課,既有數學類課程中理論上的抽象性和嚴謹性,又與計算機結合密切,兼具實用性和實驗性[1],是培養學生理性思維和實際動手能力的重要載體。將理論與實驗相結合是“計算方法”課程的必然要求,也是當前提高學生創新能力的必然要求[2-6]。當前的“計算方法”課程教學主要存在兩點問題:①課程教學重理論輕實驗。教學過程偏重計算方法理論的講解,弱化了計算方法與計算機技術相結合的特點,大量的復雜公式使學生感到抽象、枯燥、難以理解,使學生學習積極性、主動性得不到發揮[6]。②教學中可視化教學手段運用不充分。算法是“計算方法”課程的本質,教師必須通過對各種算法的詳述,來完成課程整體知識框架的搭建。算法流程構建、檢驗算法精度和比較算法優劣時常常涉及大量的數值計算和各種結果的可視化,需要運用軟件使教學內容更形象化、生動化,以調動學生的學習積極性[7-8]。
Matlab 軟件為“計算方法”的實驗教學和教學過程中的可視化提供了強有力的手段。圖形用戶界面(graphical user interface,GUI)是由窗口、按鈕、文字、圖形、菜單等對象構成的一個用戶視窗,是人機交流信息的有效工具[9],已廣泛應用于高等學校不同課程的實驗教學中[10-15]?;贛atlab GUI 設計和實現的計算方法交互式實驗系統充分考慮人機交互的友好性和可擴展性,每個界面都配備程序設計的流程圖,學生在直觀感受算法效果的同時,可以對算法進行修改和擴展,加深對課程內容的理解及掌握。該實驗系統可提高教學的靈活性,為學生動手能力和創新能力的培養提供沃土。
基于Matlab GUI 的計算方法實驗系統集成了“計算方法”課程的非線性方程求根、線性代數方程組求解、插值與擬合、數值積分、常微分方程初值問題數值解法這5 個經典模塊和1 個數值優化擴展模塊。該實驗系統的主要功能模塊如圖1 所示。

圖1 計算方法交互式實驗系統功能模塊
經典模塊涵蓋了課程大綱要求的所有內容,模塊間既循序漸進又相互獨立。數值優化本屬于“最優化方法”課程的范疇,考慮到部分專業在后續課程中未安排“最優化方法”課程而此內容又非常重要,且“計算方法”與“最優化方法”課程聯系密切,故在計算方法實驗系統中設計了此模塊。每個模塊中均含有不同數值算法的子模塊,在系統的主界面菜單中點擊就可打開相應子模塊界面并進行操作。對于每個模塊,皆可對源程序進行修改,擴展模塊內容。Matlab GUI形成包含 GUI 組件屬性的擴展名為“.fig”的文件和保存程序代碼的擴展名為“.m”的文件[15]。GUI 程序主要包括各控件的初始化函數、輸出函數、布局以及回調函數。
GUI 設計是利用Matlab 提供的不同控件對界面進行設計,回調函數設計是實現界面控件要求實現的功能,對界面中控件的函數進行編程,從而達到預期要求的界面設計效果和程序設計功能。實驗系統的主界面采用經典的菜單模式,主菜單上的 6 個部分對應6個功能模塊,點擊可彈出各子模塊對應的二級子菜單。單擊每個子菜單會調出各個子模塊對應的界面。系統主界面如圖2 所示。

圖2 計算方法交互式實驗系統主界面
子模塊具有人機交互功能,操作簡單,除了顯示執行結果,對每個算法都配備程序設計的流程圖,學生可對照源程序和流程圖,切實理解和掌握計算方法的內容,并進行擴展和改進。
除了簡單的代數方程有求根公式外,對于稍微復雜的非線性方程,一般很難給出根的解析表達式,因此需要研究數值方法求得滿足一定精度要求的根的近似解[16]。非線性方程求根模塊包含3 個子模塊:二分法、牛頓法和割線法。學生可根據自身興趣和知識掌握情況對模塊內容進行擴展。
二分法的思想是逐步將區間分半,通過判別區間端點函數值的符號,進一步搜索有根區間,將有根區間縮小到充分小,從而求出滿足給定精度要求的根的近似值。牛頓法[16]的思想是將非線性方程進行泰勒展開,然后取此泰勒展開式的線性部分作為非線性方程的近似。割線法的基本思想是用差商代替牛頓法中的導數。以二分法為例,此子模塊的界面如圖3 所示。

圖3 二分法子模塊界面
圖3 所示界面顯示的內容包括程序流程圖、輸入參數、執行按鈕和計算結果4 部分。用戶輸入非線性方程的表達式、求根區間的左右端點值和所需的求根精度,點擊“執行二分法”按鈕,則在界面下方顯示方程的根以及圖形化的求根過程。
在自然科學和工程技術中很多問題的解決歸結為求解線性代數方程組。理論上,線性代數方程組可通過克萊姆(Cramer)法則進行求解,但是隨著方程組階數的增大,所需的計算量達到驚人的程度。因此,需要研究線性代數方程組的數值解法。線性代數方程組求解模塊包含5 個子模塊:高斯消去法、三角分解法、追趕法、雅克比迭代法和高斯-賽德爾(Gauss-Seidel)迭代法。其中,前3 個屬于求解線性代數方程組的直接解法,后2 個屬于迭代解法。
高斯消去法的基本思想是通過初等變換逐步消去未知元,將原方程組化為同解的三角方程組,包含消元和回帶兩個過程。高斯消去法除了有基本的高斯消去法之外,還有高斯列主元消去法、高斯-約當(Jordan)消去法等。該實驗系統只提供基本的高斯消去法,學生可參考源程序對其他高斯消去法進行編程,擴展系統內容,從而鍛煉動手能力。三角分解法也稱為 LU分解法,是高斯消去法的一種等價變形[16]。由于對矩陣進行一次初等變換就相當于用相應的初等矩陣去左乘原來的矩陣,將高斯消去法用矩陣乘法來表示,即可得到求解線性方程組的三角分解法。追趕法是當方程組的系數矩陣為三對角矩陣時的一種快速矩陣分解法。雅克比迭代法每迭代一次只需計算一次矩陣和向量的乘法,計算公式簡單,但是收斂速度較慢。高斯-賽德爾迭代法是雅克比迭代法的一種改進形式。
以高斯-賽德爾迭代法為例,此子模塊的界面如圖4 所示。用戶可輸入系數矩陣、方程右端項、迭代初值、最大迭代次數和迭代精度后,點擊“執行Gauss-Seidel 迭代”按鈕,查看輸出結果,并可與雅克比迭代子模塊的輸出結果進行對比分析。

圖4 高斯-賽德爾迭代子模塊界面
在科學研究和工程實踐中,要研究的函數往往比較復雜,有時很難直接寫出其數學表達式,但可以通過實驗觀測等手段獲得該函數的一組離散采樣值,然后根據這組數據構造某個簡單的函數去逼近或代替原函數。這種方法稱為數值逼近方法,插值與擬合是最常用的兩種數值逼近方法[16]。插值要求構造的函數精確通過采樣點,擬合要求在某種誤差準則下構造的函數盡可能靠近采樣點。插值與擬合模塊包含4 個子模塊:拉格朗日插值、牛頓插值、龍格現象和最小二乘擬合。
拉格朗日插值和牛頓插值都屬于代數插值的范疇,其基本思想都是給定n+1 個互異節點以及節點上的函數值,構造一個滿足插值條件的次數不超過n的多項式。拉格朗日插值利用插值基函數構造的插值多項式結構對稱、形式簡單,但當插值節點增加時,基函數需要重新計算。牛頓插值利用差商表構造插值多項式。雖然這兩種插值方法構造過程不同,但是根據插值多項式的唯一性,兩種方法構造的是同一多項式。為了提高插值的精度,一般應增加插值節點的個數,但是在等距節點情況下,隨著插值節點個數的增多,插值誤差反而增大,這種現象被稱為龍格(Runge)現象。為了提高插值精度,并且減少龍格現象的發生,可引入分段插值的思想。最小二乘擬合屬于曲線擬合的一種方法,與插值不同,曲線擬合不要求曲線通過所有已知點,而是要求得到的近似函數能反映數據的基本關系。最小二乘擬合采用最小二乘原理,即實驗數據與擬合曲線的偏差的平方和最小,作為擬合的準則。
以龍格現象為例,此子模塊的界面如圖5 所示。此子模塊主要是演示等距節點下,隨著插值節點的增多而產生的龍格現象。學生輸入插值函數、區間端點以及插值節點個數后,點擊“執行Runge 現象”按鈕,界面上就會顯示不同節點數下的插值多項式與真實函數的對比。此演示模塊采用的是拉格朗日插值方法,用戶也可將牛頓插值模塊的源程序與此模塊進行鏈接,兩種插值方法得到的插值多項式是相同的,因此效果圖也相同。

圖5 龍格現象子模塊界面
當被積函數沒有具體的函數表達式或者被積函數的原函數不能用初等函數的有限形式表示時,理論上具有重大意義的牛頓-萊布尼茲公式的應用會受到限制。此時可采用數值方法構造計算公式,即用數值積分的方法來解決定積分的計算問題。數值積分模塊包括 3 個子模塊:牛頓-科特斯(Cotes)公式、復化辛普森(Simpson)公式和龍貝格(Romberg)積分。
牛頓-科特斯求積公式屬于插值型求積公式,其基本思想是在求積節點等距分布的前提下,用插值多項式近似代替被積函數。最常用的牛頓-科特斯公式是等分次數為1、2 和4 時的梯形公式、辛普森公式和科特斯公式。所謂復化辛普森公式,是將積分區間分成若干小區間,在每個小區間上采用辛普森公式計算積分值。龍貝格積分法也稱為逐次分半加速法[16],它是在梯形公式、辛普森公式和科特斯公式的基礎上,通過公式的內在聯系,構造出一種加速計算積分的方法,它在不增加計算量的前提下提高了數值積分的精度。
以龍貝格積分為例,此子模塊的界面如圖6 所示。界面所示的流程圖很清晰地給出了梯形值序列T、辛普森值序列S、科特斯值序列C和龍貝格值序列R的計算關系。學生輸入被積函數、積分上下限以及積分精度后,點擊“執行龍貝格積分”按鈕,界面上就會顯示滿足精度要求的積分的近似值和龍貝格積分計算的步數。

圖6 龍貝格積分子模塊界面
所謂常微分方程初值問題的數值解法,就是將一個連續的微分方程初值問題轉化為一個離散的差分方程初值問題,然后通過解差分方程獲得其數值解。常微分方程初值問題數值解法模塊包含3 個子模塊:歐拉(Euler)法、龍格-庫塔(Runge-Kutta)法和阿當姆斯(Adams)法。
歐拉法是一種簡單、直觀的求解常微分方程初值問題的方法,其公式可由“數值積分”和“差商代替導數”導出。根據積分公式或者差商形式的不同,歐拉法又分為向前歐拉法、向后歐拉法和改進歐拉法等,其最高精度為2 階。龍格-庫塔法是在改進歐拉法的基礎上,在斜率和步長兩方面進行拓展而得到的高階方法,最常用的為四級四階經典龍格-庫塔法。阿當姆斯法是將區間劃分為若干小區間,在小區間上用更高次的插值多項式近似表示原來的函數。根據插值多項式次數的不同,阿當姆斯法得到的公式有很多形式,其中四階的阿當姆斯預測校正方法具有方法簡潔、使用方便和高精度等優點。
以龍格-庫塔法為例,此子模塊的界面如圖 7 所示。界面顯示的是四級四階經典龍格-庫塔法,雖然推導過程復雜,但是根據流程圖編程實現非常容易。學生在輸入一階微分方程、自變量范圍、初始條件和積分步長后,點擊“執行 Runge-Kutta 方法”按鈕,界面上就會顯示節點以及節點上的函數值。學生可與其他子模塊執行的結果進行對比分析,亦可修改源程序,得到其他形式的龍格-庫塔法計算結果。

圖7 龍格-庫塔法子模塊界面
數值優化所屬的“最優化方法”,是獨立于“計算方法”的其他課程。之所以在該實驗系統中設計成一個獨立的模塊,是基于以下3 點原因的:①數值優化通過迭代的方式解決優化問題,是數學建模中關鍵的一環,很多專業未開設“最優化方法”課程,導致在數學建模競賽中的知識缺失。②在近期興起的“機器學習”中,有大量的問題可以歸約為無約束最優化問題,學生對新興事物有極大的興趣。③數值優化和計算方法有著非常密切的聯系。此模塊僅起到“簡介”的作用,教師可基于此模塊的設計對數值優化的基本思想進行講解,感興趣的學生可借助此模塊對數值優化進行較為基礎的了解,增加知識儲備量。數值優化模塊包含4 個子模塊:黃金分割法、最速下降法、共軛梯度法和遺傳算法。
黃金分割法也稱為 0.618 法,其基本思想是根據單峰函數的特性,基于試探法搜索函數局部最小值。最速下降法是求解無約束最優化問題的最簡單、最古老的方法之一,是研究其他無約束優化算法的基礎,許多新算法都是以它為基礎通過改進或修正得到的[17]。共軛梯度法是在每一迭代步利用當前點出發的最速下降方向生成關于二次函數海塞陣的共軛方向,并求函數極小點的方法。遺傳算法是一種通過模擬自然進化過程搜索最優解的方法,它不存在求導和函數連續性的限定,能自適應地調整搜索方向。
以最速下降法為例,此子模塊的界面如圖8 所示。界面給出了方法的程序流程圖,學生在輸入極小化函數、初始值、精度后,點擊“執行最速下降法”按鈕,生成計算結果并繪制函數圖形;勾選“繪制迭代過程”復選框后,迭代過程會在圖形中清晰顯示,便于直觀地理解最速下降法的尋優過程。

圖8 最速下降法子模塊界面
基于 Matlab GUI 設計和實現的計算方法交互式實驗系統具有以下特點:①界面友好,交互簡單。師生輸入算法所需參數即可觀察可視化實驗結果并可在不同算法之間進行對比分析。②內容豐富,可擴展性強。“5+1”模塊涵蓋了計算方法的核心內容和擴展內容,對于系統中未提及的算法可修改源程序進行增廣。③流程清晰,演示方便。系統對每個獨立的算法子模塊都配備程序流程圖,方便教師對算法進行講解和演示,學生亦可對照流程圖和源程序加深對算法的精髓的理解。
計算方法交互式實驗系統為課程理論教學和實驗教學的有機結合提供了抓手,為實驗教學提供了強有力的載體,已經應用在我校專業限選課“計算方法”的輔助性教學中。該實驗系統提高了數值實驗效率,改善了課程教學效果,發揮了學生的積極主動性,對學生動手能力和創新能力的培養有較大幫助。