◎李 旭 (蘭州理工大學(xué)理學(xué)院,甘肅 蘭州 730050)
計(jì)算科學(xué)已經(jīng)成為科學(xué)研究和工程設(shè)計(jì)的第三種重要手段,被廣泛使用.航空航天、汽車、生物、化學(xué)、半導(dǎo)體等很多工業(yè)領(lǐng)域,越來越多地依靠數(shù)值模擬來提供技術(shù)決策支持.
19世紀(jì)末以來,許多物理現(xiàn)象已經(jīng)得到了很好的解釋,并有精確的模型來描述它們.但在計(jì)算機(jī)廣泛使用之前,科學(xué)家和工程師被迫在模型中做出許多簡化假設(shè),以便用筆算方法來求解它們.然而,隨著計(jì)算能力的提高,人們可以使用高效的數(shù)值方法處理完整的模型,而無須簡化它們.盡管如此,每種方法都有其局限之處,為了高效使用它們,人們必須了解它們是如何工作的.
計(jì)算方法是許多高校工科專業(yè)開設(shè)的一門重要而實(shí)用的課程.本課程旨在教學(xué)生如何運(yùn)用數(shù)學(xué)和計(jì)算機(jī)來解決各種實(shí)際應(yīng)用問題.?dāng)?shù)值計(jì)算被認(rèn)為是數(shù)學(xué)理論與實(shí)際領(lǐng)域目標(biāo)之間的橋梁.因此,本課程的教學(xué)應(yīng)使學(xué)生掌握解決實(shí)際工程應(yīng)用問題的各種計(jì)算方法.
計(jì)算方法是一門數(shù)學(xué)類型課程,但又與在修學(xué)生已學(xué)完的數(shù)學(xué)課(例如微積分、線性代數(shù))不同.從基本的思想方法和思維方式,到課程的學(xué)習(xí)方法,它都有重大的變化.學(xué)生所熟悉的大部分?jǐn)?shù)學(xué)課的共同特點(diǎn)應(yīng)該是抽象和嚴(yán)格的演繹,思維邏輯嚴(yán)密.而計(jì)算方法這門課,除了保持上述的特點(diǎn)之外,“歸納”成為不容忽視的思維方法,討論的核心問題是“誤差”.在以往的數(shù)學(xué)課程中,課后認(rèn)真閱讀教科書和做一定數(shù)量的習(xí)題十分重要;現(xiàn)在學(xué)生除了讀書和做習(xí)題外,使用計(jì)算機(jī)進(jìn)行計(jì)算變得同樣重要.
當(dāng)前,我們必須考慮如何向以技術(shù)為導(dǎo)向的工科專業(yè)學(xué)生教授計(jì)算方法.計(jì)算科學(xué)在研究領(lǐng)域的知名度越來越高,這意味著教師在計(jì)算方法教學(xué)中應(yīng)該提供具體的編程示范,使學(xué)生能夠回到他們的具體的“計(jì)算農(nóng)場”,做出實(shí)際的工作.為此,本文探討了一些利用MATLAB 軟件對(duì)工科專業(yè)學(xué)生進(jìn)行計(jì)算方法課程教學(xué)的若干具體操環(huán)節(jié).
MATLAB 是一個(gè)用于數(shù)值計(jì)算的交互式系統(tǒng).20世紀(jì)70年代末,數(shù)值分析大師Cleve Moler 編寫了MATLAB 最初的Fortran 版本.此版本隨后在教學(xué)和研究中很受歡迎,并演變成了一個(gè)用C 語言編寫的商業(yè)軟件包.多年來,MATLAB在科研和工業(yè)領(lǐng)域中得到了廣泛的應(yīng)用.
與傳統(tǒng)的數(shù)值計(jì)算方法(例如編寫Fortran 或C 程序并調(diào)用數(shù)值庫)相比,MATLAB 有以下優(yōu)勢:
1.它允許用非常高級(jí)的語言快速、輕松地編寫代碼;
2.?dāng)?shù)據(jù)結(jié)構(gòu)不需太多關(guān)注;特別是,在首次使用之前,不需要聲明數(shù)組;
3.交互式界面允許快速實(shí)驗(yàn)和輕松調(diào)試;
4.提供高質(zhì)量的圖形和可視化設(shè)施;
5.MATLAB 的M 文件可在多種平臺(tái)上完全移植;
6.可以添加工具箱來擴(kuò)展系統(tǒng),例如,提供專門的信號(hào)處理設(shè)施和符號(hào)操作能力;
7.在互聯(lián)網(wǎng)上可以免費(fèi)獲得用戶提供的各種M 文件.
此外,MATLAB 是一種現(xiàn)代編程語言和問題解決環(huán)境.它具有復(fù)雜的數(shù)據(jù)結(jié)構(gòu),包含內(nèi)置的編輯和調(diào)試工具,并支持面向?qū)ο缶幊蹋@些因素使MATLAB 成為一種優(yōu)秀的教學(xué)語言,也是研究和解決實(shí)際問題的有力工具.與編譯語言相比,MATLAB 不可避免地會(huì)損失一些效率,但內(nèi)置的性能加速技術(shù)提升了效率,用戶還可以使用MEX 文件鏈接到編譯的Fortran 或C 代碼.
隨著MATLAB 軟件的發(fā)展,它為科學(xué)計(jì)算開創(chuàng)了一個(gè)新時(shí)代.現(xiàn)在,人們可以非常簡潔地、完整詳細(xì)地利用MATLAB 軟件實(shí)現(xiàn)高級(jí)數(shù)值算法,從而提供很多實(shí)際應(yīng)用問題的解決方案.對(duì)于求解應(yīng)用數(shù)學(xué)中的某些問題,現(xiàn)在僅幾頁紙所覆蓋的內(nèi)容甚至比幾十年前的一本書的內(nèi)容都要多.與一些基礎(chǔ)計(jì)算語言(如Fortran 語言或C 語言)相比,MATLAB 軟件在修改已有程序或者編寫新程序方面具有更顯著的工作效率.在編程解決一些新問題方面,利用MATLAB 軟件能夠獲得前所未有的輕松.
我們使用MATLAB 環(huán)境,是因?yàn)樗鼘?duì)初學(xué)者來說比較容易上手,而且它支持通過實(shí)驗(yàn)來處理計(jì)算思想.這是發(fā)展計(jì)算直覺的核心,也就是說通過編寫程序可以建立計(jì)算直覺.如果直覺是一種方向感,那么計(jì)算直覺就是一種計(jì)算方向感.雖然培養(yǎng)良好的計(jì)算直覺是一個(gè)明確的優(yōu)先事項(xiàng),但我們的首要目標(biāo)是將計(jì)算的興奮感與對(duì)其約束條件及其與其他方法的聯(lián)系的欣賞關(guān)聯(lián)起來.計(jì)算、理論和實(shí)驗(yàn)之間的相互作用尤為重要.
通過教授計(jì)算機(jī)編程范例,我們可以促進(jìn)學(xué)生上述計(jì)算直覺的發(fā)展.在教學(xué)、寫作和研究過程中,沒有比精心挑選的算例更能解釋問題的了.另外,除了解釋作用,例子也能引起學(xué)生的興趣,學(xué)生的積極性與學(xué)習(xí)成績之間一般存在正相關(guān)關(guān)系.在每一節(jié)課中,如果在每一個(gè)抽象的算法表述和收斂性結(jié)論之后出現(xiàn)算例,那么就能生動(dòng)地說明問題.無論學(xué)生的之前掌握的程度如何,例子能讓他們真正參與課堂學(xué)習(xí).當(dāng)計(jì)算方法課程完成后,詳細(xì)的、恰當(dāng)定位的例子可以讓這門課程令人難忘.
首先,教師在算法實(shí)現(xiàn)之前,應(yīng)該教給學(xué)生基本的MATLAB 操作、常用命令和代碼.
教師運(yùn)用MATLAB 程序設(shè)計(jì),讓學(xué)生用在理論課學(xué)到的各種數(shù)值算法來解決典型的數(shù)值計(jì)算問題.在具體程序設(shè)計(jì)環(huán)節(jié),教師應(yīng)該通過演示編程過程和程序運(yùn)行結(jié)果,使得學(xué)生進(jìn)一步熟悉所學(xué)算法,同時(shí)能教給學(xué)生一些編程思路和程序語言的編寫規(guī)范.在此過程中,我們最好將所有算法編輯為MATLAB 函數(shù)文件,這樣方便修改,還可以使得程序的適用性和普及性更廣.在程序?qū)崿F(xiàn)過程中,我們對(duì)求解同一問題的各種不同算法在CPU 運(yùn)算時(shí)間、所需迭代次數(shù)、誤差和殘差等方面進(jìn)行比較.
最后,教師可以對(duì)學(xué)生布置一些同類型的程序設(shè)計(jì)作業(yè),并且完成實(shí)驗(yàn)報(bào)告,以測試他們掌握新算法的程度.
以常微分方程初值問題的數(shù)值解為例,說明三種數(shù)值算法的實(shí)現(xiàn)過程.
例用Euler 法、改進(jìn)Euler 法與四階經(jīng)典Runge-Kutta法分別求解如下常微分方程初值問題:
與精確解比較,其中精確解為y=x(ex-e),計(jì)算過程中小數(shù)點(diǎn)后保留4 位.
Euler 法的具體格式為:
yn+1=y(tǒng)n+hf(xn,yn)
Euler 法的具體M 文件代碼為:
取h=0.1,計(jì)算結(jié)果見表1.
表1 Euler 法的計(jì)算結(jié)果
改進(jìn)Euler 法的具體格式為:
改進(jìn)Euler 法的具體M 文件代碼為:
取h=0.1,計(jì)算結(jié)果見表2.
表2 改進(jìn)Euler 法的計(jì)算結(jié)果
四階經(jīng)典Runge-Kutta 法的具體格式為:
四階經(jīng)典Runge-Kutta 法的具體M 文件代碼為:
取h=0.1,計(jì)算結(jié)果見表3.
表3 四階經(jīng)典Runge-Kutta 法的計(jì)算結(jié)果
我們通過比較三種方法的計(jì)算結(jié)果,讓學(xué)生觀察到改進(jìn)Euler 法的精度高于Euler 法的精度,而四階經(jīng)典Runge-Kutta 法的精度明顯高于Euler 法與改進(jìn)Euler 法的精度.在理論分析上,我們已經(jīng)證明Euler 法、改進(jìn)Euler 法與四階經(jīng)典Runge-Kutta 法的精度分別是一階、二階與四階.通過對(duì)比,學(xué)生觀察到數(shù)值結(jié)果和理論分析的一致性.
此算例很好地展示了為解決同一問題所構(gòu)造的不同算法的MATLAB 程序語言之間的差別,使學(xué)生認(rèn)識(shí)到計(jì)算方法的核心任務(wù)就是設(shè)計(jì)、分析和用高效的算法去解決各種重要的數(shù)學(xué)問題.教師通過讓學(xué)生自己編寫程序、檢查計(jì)算結(jié)果,使他們進(jìn)一步熟悉算法格式.
本文討論了在計(jì)算方法教學(xué)中通過具體算例使用MATLAB 進(jìn)行編程實(shí)現(xiàn)的教學(xué)方法.由于計(jì)算方法是工科專業(yè)的一門重要的核心課程,我們通過這種教學(xué)手段可以很好地發(fā)展學(xué)生利用數(shù)值計(jì)算方法解決實(shí)際應(yīng)用問題的能力.
數(shù)學(xué)學(xué)習(xí)與研究2022年32期