摘要根據《數值分析》課程的實踐性特點,在數值積分內容的教學中融入Matlab實現問題的教學,結合問題教學法以提高學生對數值積分方法的理解和應用能力,有利于研究生創新能力的培養。
關鍵詞 數值分析 數值積分 算法 Matlab實現 問題教學法
中圖法分類:G643 文獻標識碼:A
Teaching Research of Matlab Realization of Numerical Integration in
\"Numerical Analysis\" Curriculum for Postgraduate Students
GE Cishui
(Department of Mathematics physics, Anhui University of Architecture, Anhui, Hefei 230022)
AbstractBased on the practical characteristics of numerical analysis curriculum, matlab realizations of numerical integrations are introduced in the teaching procedure. Combined with question-based teaching method, it aims to enhance students' understanding and application capability of numerical integration methods, helpful to train their innovation abilities.
Key wordsnumerical analysis; numerical integration; algorithm; matlab realization; question-based teaching method
0 引言
數值分析也稱為數值計算方法,是研究用計算機求數學問題近似解的方法、過程及其理論的一個數學分支。數值分析可以說是科學計算的基礎和依托,正如我國著名數學家馮康教授所說:數值分析的發展對于提高計算能力的貢獻是與新一代計算機的研制同等重要。在我國,幾乎所有工科院校碩士研究生都開設了《數值分析》課程。
Matlab是一個功能強大的科學計算平臺,它具有強大的數值計算、符號計算和可視化功能,它提供了大量的函數庫、工具箱幾乎涵蓋了所有的工程計算領域,目前Matlab已成為最為普遍的科學計算工具之一。近年來,人們已意識到在《數值分析》課程的課堂教學和實驗教學中引入Matlab科學計算軟件的重要性,Matlab軟件已替代C語言成為輔助數值分析課程教學的首選,事實上,Matlab軟件已成為諸多課程,如:自動控制理論、數字信號處理、動態系統仿真等課程的輔助教學工具,另外掌握Matlab軟件本身也對我們開展科學研究和解決工程問題至關重要。
數值積分是《數值分析》課程的重要內容之一,但各種研究生用《數值分析》教材講解數值積分理論與方法時,對數值積分的軟件實現則不加介紹或介紹較少,且融入不夠,特別對多元函數的數值積分,僅僅以矩形區域上二重積分為例作簡單介紹,這遠遠不能滿足工科研究生的學習和應用需要。
本文根據《數值分析》課程的實踐性特點,在數值積分的教學中融入Matlab實現問題的教學,結合問題教學法,以提高學生對數值積分方法的理解和應用能力,有利于工科研究生創新能力的培養。
1 數值積分Matlab實現的問題教學法
數值積分計算的問題很多,如振蕩積分問題、無界區域上函數積分問題、無界函數積分問題、高維積分問題等等,但從Matlab實現上來說,到目前Matlab系統還沒有直接提供一般區域上的三元及三元以上函數的數值積分指令等。
利用問題教學法來討論和解決數值積分問題的Matlab實現,可以激發學生學習的興趣,從所求解問題的性質上找原因、從算法上找原因,積極思維,努力給出解決實際問題的方案,提高綜合應用來解決實際問題的能力。
下面列舉三個數值積分的Matlab實現問題,來說明問題教學法在課堂教學或實驗教學中的應用。
1.1 定積分exsin(1000x)dx的計算問題
下面三種方法以及獲得的結果
(1)quad(@(x)exp(x).*sin(1000*x),0,pi)
運行該指令后顯示:Warning: Maximum function count exceeded; singularity likely.
顯示結果: -3.917208719625272
(2)quadl(@(x)exp(x).*sin(1000*x),0,pi)
運行該指令后顯示:Warning: Maximum function count exceeded; singularity likely.顯示結果:1.722039000823277
(3)quadgk(@(x)exp(x).*sin(1000*x),0,pi)
顯示結果:-0.022140670492099
提出問題:為什么上面三種方法獲得的結果會不同呢?
問題分析:這是 = 1000的高頻振蕩積分問題,quad指令和quadl指令采用的算法不大適合求振蕩積分,所給結果不正確。由于本定積分的被積函數的原函數是初等函數,所以可用int指令來獲得正確結果:
syms x
vpa(int(exp(x)*sin(1000*x),0,pi),16)
顯示結果:0.02214067049210878
quadgk有一定的求振蕩積分的功能,上述(3)中所給結果精度較高。注意當振蕩頻率再高時,如計算exsin(1000x)dx,此時若用指令
quadgk(@(x)exp(x).*sin(10000*x),0,pi),
計算結果也會出現錯誤,為獲得正確的結果,必須設置較高的“MaxIntervalCount”,如采用指令:quadgk(fun,0,pi,'MaxIntervalCount',10000)。由上可知,求高頻振蕩積分必須選用quadgk指令、設置較高的“MaxIntervalCount”選項值。
1.2 二重積分的計算問題,其中D是由拋物線y = x2,直線x = 10以及x軸所圍成的區域
二重積分的計算問題首先要轉化為累次積分的計算問題,上述問題可轉化為計算,計算此累次積分方法很多,例如下面指令:
(1)dblquad(@(x,y)(x.^2+y).*sin(x+y.^2).*(y>=0 y<=x.^2), 0, 10, 0, 100, ...
1e-6, @quadl)
顯示結果:-70.483695211568843,運行時間:19.962813 秒
(2)quad2d(@(x,y)(x.^2+y).*sin(x+y), 0, 10, 0, @(x)x.^2, 'Abstol',1e-6)
顯示結果:-70.483662809994698,運行時間:0.485997 秒
(3)quad2dggen(@y,x)(x.^2+y).*sin(x+y),@(x), @(x)x.^2, 0, 10, 1e-6)
顯示結果:-70.483662809308356,運行時間:0.105659 秒
問題:為什么上面三種方法所需時間相差數十倍乃至上百倍?
分析:方法(1)是將一般的積分區域“延拓”為矩形區域,利用dblquad指令計算,這樣不可避免地進行了很多0乘運算,費時低效;方法(2)是利用Matlab系統quad2d指令,運行效率尚可,它將一般的積分區域映射到矩形區域,然后利用自適應Lobatton算法來計算,有時需要設置較高的“MaxFunEvals”選項值;方法(3)為NIT數值積分工具箱提供的方法,采用了Gauss算法,精度較高,用時最少。
運行時間的差異與指令所采用的算法有關,同時也與所要求的精度有關。若同一指令,要求的精度較高,可通過設置較小的“tol”值或“Abstol”選項值達到,而這時運行時間則會成倍增加。
1.3 三重積分的計算問題,其中由xoy坐標面與旋轉拋物面z = 16 - x2 - y2所圍成的立體區域
目前Matlab系統尚沒有直接提供一般區域上的三元及以上函數的數值積分指令,下面的方法(1)是將一般積分區域“延拓”為長方體區域,然后利用triplequad指令進行計算
(1)triplequad(@(x,y,z)(x.*z+y.^2).*log(1+x.^2+z).*(x.^2+y.^2<=16) .*...
(z>=0 z<=16-x.^2-y.^2), -4, 4, -4, 4, 0, 16)
運行結果:1.929759987691869e+003,運行時間:234.935393秒
問題:運行時間較長,怎樣高效解決一般立體區域上三重積分的計算問題?
分析:方法(1)是將一般積分區域積分“延拓”為長方體區域積分,這樣不可避免地引入了很多0乘運算,故費時低效。能否用解決二元函數數值積分問題的思路來解決此三重積分的計算問題呢?效果較方法(1)如何?
為此先將上面三重積分轉化為累次積分
然后利用一元函數和二元函數數值積分指令以及Matlab系統提供的函數arrayfun,進行組合來求一般立體區域上三元函數的數值積分,方法如下:
(2)quad2d(@(x,y) arrayfun(@(x,y)quadgk(@(z)(x.*z+y.^2).*log(1+x.^2+z), ...
0,16-x.^2-y.^2),x,y),-4,4,@(x)-sqrt(16-x.^2),@(x)sqrt(16-x.^2))
運行結果:1.930186638624715e+003,運行時間:4.925542秒
(3)quadgk(@(z) arrayfun(@(z)quad2d(@(x,y)(x.*z+y.^2).*log(1+x.^2+z), ... -sqrt(16-z),sqrt(16-z),@(x)-sqrt(16-z-x.^2),@(x)sqrt(16-z-x.^2)),z),0,16)
運行結果:1.930186640541383e+003,運行時間:0.468731秒
方法(2)是利用quadgk+quad2d組合方法,先二重后一重,方法(3)是利用quad2d+quadgk組合方法,先一重后二重,從結果上看這兩種方法不但所獲得的結果精度較高,而且用時顯著減少,其中方法(3)運行效率更高一些。
2 結語
將數值積分的Matlab實現融入《數值分析》課程的教學,通過問題教學法在課堂教學和實驗教學中的應用,有助于學生用數值分析的理論和方法分析計算方法所暴露出的問題,找出失敗的原因和解決問題的辦法,這樣既能加深學生對數值積分方法的理解和記憶,又能提高他們解決實際問題的能力,同時還可以節省時間。
工程上涉及數值積分的問題很多,例如:涉及振蕩積分、高維積分、無界函數的數值積分等實際工程問題,都可以作為大型作業,布置給學生課后思考解答,充分發揮學生學習的自主性,鍛煉學生查閱資料和使用軟件幫助文檔功能,有利于學生綜合解決實際問題的能力和自主創新能力的培養。
基金項目:安徽省高等學校省級教學質量與教學改革工程項目“《數值分析》課程教學內容優化與組合式教學方法的探索研究”[2008jyxm325 ]
參考文獻
[1]孫志忠等.數值分析(第2版)[M].南京:東南大學出版社,2006.
[2]顏慶津.數值分析(第3版)[M].北京:北京航空航天大學出版社,2006.
[3]張志涌等.MATLAB R2010a教程[M].北京航空航天大學出版社,2010.
[4]吳曉勤等.數值分析課程中算法設計的教學[J].湖南工業大學學報,2010.24(2):68-71.
“本文中所涉及到的圖表、公式、注解等請以PDF格式閱讀”