劉本虹 申艷玲 鄭艷萍
高中數(shù)學3是高中數(shù)學必修中的五個模塊之一,它包括算法初步、統(tǒng)計和概率三章內(nèi)容。算法是數(shù)學與其應用的重要組成部分,是計算科學的重要基礎(chǔ),是連接解決問題方法與計算機能夠理解的程序語言之間的橋梁,是現(xiàn)代人必須具有的數(shù)學修養(yǎng)[1]。Matlab是Mathworks公司開發(fā)的用于概念設(shè)計、算法開發(fā)、建模仿真、實時實現(xiàn)的集成環(huán)境。其廣泛運用于生物醫(yī)學工程、圖像信號處理、信號分析、電信、時間序列分析、控制論和系統(tǒng)論等領(lǐng)域[2]。在國內(nèi)高校數(shù)學專業(yè)開設(shè)的多種課程都涉及到Matlab的應用,比如數(shù)學與應用數(shù)學專業(yè)開設(shè)的《數(shù)值分析》《數(shù)學建?!罚畔⑴c計算科學專業(yè)開設(shè)的《數(shù)值逼近》《數(shù)值代數(shù)》《微分方程數(shù)值解》等,許多課程中的數(shù)值實驗部分都需要用Matlab編程實現(xiàn)。
對于本科生來說,開始接觸算法的相關(guān)課程不太適應。主要原因在于一方面無法理解算法語;另一方面不太理解程序語言。因此,盡早地讓高中生接觸一些簡單算法,并把算法用Matlab或Mathematica編程實現(xiàn)是非常有必要的,可以很好地實現(xiàn)高中到大學本科相關(guān)課程銜接。
本節(jié)內(nèi)容主要選取或改編于[1]中出現(xiàn)的典型算例及其編程實現(xiàn)。
例1.編寫程序,使任意輸入的n個整數(shù)按從大到小的順序輸出。(該例題改編于[1]中第一章的例7)
在Matlab中有現(xiàn)成的命令對數(shù)的大小進行排列,本文為了讓學生更好地理解算法,從而遵照教材所給的算法分析予以Matlab編程,學生可以看到運算每一步的結(jié)果,加深對照程序語言的理解與應用。
算法分析:
把這n個數(shù)以向量形式輸入,依次比較各分量的大小,進行排序。
以下是比較-1;5;300;3002;-5000;119;-100的大小,且按從大到小的次序輸出。其Matlab程序及運行結(jié)果如下。
以下算法案例均來自[1]中第一章第3節(jié)中的案例。
例2.輾轉(zhuǎn)相除法
輾轉(zhuǎn)相除法是一種古老而有效的求兩個正整數(shù)的最大公因子的算法之一,這種算法是歐幾里得在公元前300年左右首先提出的,因而又叫歐幾里得算法[1]。
算法分析:
第一步:給定兩個正整數(shù)m,n;
第二步:計算m除以n所得到的余數(shù)r;
第三步:m=n,n=r;
第四步:若r=0,則m,n的最大公約數(shù)等于m;否則,返回第二步。
其Matlab程序如下:
注:Matlab中也有內(nèi)置命令gcd(x,y)可求兩個正整數(shù)x,y的最大公因子。
例3.更相減損術(shù)
更相減損術(shù)是《九章算術(shù)》中求兩個數(shù)的最大公約數(shù)的方法,其編程結(jié)構(gòu)類似于輾轉(zhuǎn)相除法,唯一區(qū)別是前者做除法,后者做減法。其Matlab程序如下:
分別以m=98,n=63為例,其運算結(jié)果如下:
這個運算過程與[1]第一章第3節(jié)例1所給的運算過程:
98-96=35;63-35=28;35-28=7;28-7=21;21-7=21;21-7=14;14-7=7是一致的。
例4.秦九韶算法
我國南宋時期的數(shù)學家秦九韶(約1202~1261)在《數(shù)書九章》中對多項式
f(x)=anxn+an-1xn-1+L+a1x+a0
的求值提出如下算法:
把多項式f(x)改寫為:
f(x)=an xn+an-1xn-1+L+a1x+a0
=(anxn-1+an-1xn-2+L+a1)x+a0
=((an xn-2+an-1xn-2+L+a2)x+a1)x+a0
=L
=(L(an x+an-1)x+an-2)x+L+a1)x+a0
求多項式值時,首先計算內(nèi)層括號內(nèi)一次多項式的值,即
v1=an x+an-1
然后由內(nèi)向外逐層計算一次多項式的值
v2=an x+an-2
v3=v2x+an-3
L
vn=vn-1x+a0
這樣,求n次多項式f(x)的值就轉(zhuǎn)化為求n個一次多項式的值。
據(jù)此算法計算f(x)=4x5+2x4+3.5x3-2.6x2+1.7x-0.8當x=5時的值[1]。
Matlab程序及運行結(jié)果如下:
例5.進位制
進位制是人們?yōu)榱擞嬎銛?shù)和運算而約定的計數(shù)系統(tǒng)。下面以[1]中的例題:設(shè)計一個算法,把k進制數(shù)a(共有n位)化為十進制數(shù)b。
算法分析:
第一步:輸入a,k,n
第二步:b=0,i=1
第三步:b=b+aiki-1,i=i+1
第四步:判斷i>n是否成立。若是,執(zhí)行第五步;否則,返回第三步。
第五步:輸出b。
注:ai為k進制數(shù)a右數(shù)第i位數(shù)。
下面編程把1011001轉(zhuǎn)換為十進制,該例題改編于[1]中第三章第3節(jié)的例5。
本文搜集了數(shù)學必修3中涉及到的典型算例,結(jié)合教材上的算法分析,用matlab進行算法實現(xiàn),直觀呈現(xiàn)運行結(jié)果,依此希望對高中生對數(shù)學算法的理解有所幫助。