刘本虹 申艳玲 郑艳萍
高中数学3是高中数学必修中的五个模块之一,它包括算法初步、统计和概率三章内容。算法是数学与其应用的重要组成部分,是计算科学的重要基础,是连接解决问题方法与计算机能够理解的程序语言之间的桥梁,是现代人必须具有的数学修养[1]。Matlab是Mathworks公司开发的用于概念设计、算法开发、建模仿真、实时实现的集成环境。其广泛运用于生物医学工程、图像信号处理、信号分析、电信、时间序列分析、控制论和系统论等领域[2]。在国内高校数学专业开设的多种课程都涉及到Matlab的应用,比如数学与应用数学专业开设的《数值分析》《数学建模》,信息与计算科学专业开设的《数值逼近》《数值代数》《微分方程数值解》等,许多课程中的数值实验部分都需要用Matlab编程实现。
对于本科生来说,开始接触算法的相关课程不太适应。主要原因在于一方面无法理解算法语;另一方面不太理解程序语言。因此,尽早地让高中生接触一些简单算法,并把算法用Matlab或Mathematica编程实现是非常有必要的,可以很好地实现高中到大学本科相关课程衔接。
本节内容主要选取或改编于[1]中出现的典型算例及其编程实现。
例1.编写程序,使任意输入的n个整数按从大到小的顺序输出。(该例题改编于[1]中第一章的例7)
在Matlab中有现成的命令对数的大小进行排列,本文为了让学生更好地理解算法,从而遵照教材所给的算法分析予以Matlab编程,学生可以看到运算每一步的结果,加深对照程序语言的理解与应用。
算法分析:
把这n个数以向量形式输入,依次比较各分量的大小,进行排序。
以下是比较-1;5;300;3002;-5000;119;-100的大小,且按从大到小的次序输出。其Matlab程序及运行结果如下。
以下算法案例均来自[1]中第一章第3节中的案例。
例2.辗转相除法
辗转相除法是一种古老而有效的求两个正整数的最大公因子的算法之一,这种算法是欧几里得在公元前300年左右首先提出的,因而又叫欧几里得算法[1]。
算法分析:
第一步:给定两个正整数m,n;
第二步:计算m除以n所得到的余数r;
第三步:m=n,n=r;
第四步:若r=0,则m,n的最大公约数等于m;否则,返回第二步。
其Matlab程序如下:
注:Matlab中也有内置命令gcd(x,y)可求两个正整数x,y的最大公因子。
例3.更相减损术
更相减损术是《九章算术》中求两个数的最大公约数的方法,其编程结构类似于辗转相除法,唯一区别是前者做除法,后者做减法。其Matlab程序如下:
分别以m=98,n=63为例,其运算结果如下:
这个运算过程与[1]第一章第3节例1所给的运算过程:
98-96=35;63-35=28;35-28=7;28-7=21;21-7=21;21-7=14;14-7=7是一致的。
例4.秦九韶算法
我国南宋时期的数学家秦九韶(约1202~1261)在《数书九章》中对多项式
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
求多项式值时,首先计算内层括号内一次多项式的值,即
v1=an x+an-1
然后由内向外逐层计算一次多项式的值
v2=an x+an-2
v3=v2x+an-3
L
vn=vn-1x+a0
这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。
据此算法计算f(x)=4x5+2x4+3.5x3-2.6x2+1.7x-0.8当x=5时的值[1]。
Matlab程序及运行结果如下:
例5.进位制
进位制是人们为了计算数和运算而约定的计数系统。下面以[1]中的例题:设计一个算法,把k进制数a(共有n位)化为十进制数b。
算法分析:
第一步:输入a,k,n
第二步:b=0,i=1
第三步:b=b+aiki-1,i=i+1
第四步:判断i>n是否成立。若是,执行第五步;否则,返回第三步。
第五步:输出b。
注:ai为k进制数a右数第i位数。
下面编程把1011001转换为十进制,该例题改编于[1]中第三章第3节的例5。
本文搜集了数学必修3中涉及到的典型算例,结合教材上的算法分析,用matlab进行算法实现,直观呈现运行结果,依此希望对高中生对数学算法的理解有所帮助。