肖寅东,刘 科
(电子科技大学 自动化工程学院,成都 611731)
数值计算软件是数学实验、数学建模、信号与系统实验等实验课程必不可少的工具软件。当前我国高等院校普遍采用Matlab作为这些课程的目标软件进行讲授,设计了一系列实验课程及教材[1-3]。很多高等院校和科研机构都采用 Matlab作为研究和学习过程中的必备软件。Matlab具有功能强大、使用方便、文档齐全、性能优良的特点,是一款成功的商业数值计算软件。可惜Matlab的使用代价十分昂贵。不同课程的实验,需要使用的扩展包各不相同。这意味着建设一个中型实验室用于购买Matlab软件所需的经费将十分巨大,经费问题也阻碍了学生利用课余时间学习该类软件。随着我国高等院校生源的不断扩充及国际化程度不断提高,使用Matlab造成的问题会日益严峻。不仅如此,由于Matlab软件属于私有软件,大部分用Matlab编写的仿真、实验程序和工具包大都不会公开,或者需要进一步缴纳费用,因此在网络上能找到的示例程序较少,不利于学生进行进一步学习和理解。
当前有几类典型的开源免费软件能够替代Matlab完成几乎所有的计算任务,如Octave、Scilab、R等。Octave是一款语法与Matlab兼容的自由软件,不过该软件在Windows系统上安装太复杂,且支持文档也不是很完善。Scilab也采用Matlab类似的语法,原有的Matlab程序仅需要小修改就能够在Scilab上运行,其提供的功能代码也较多。可惜的是该软件还处于开发期,成熟度还不是很高,代码中有一些错误存在,不适合作为长期使用的工具。
R是一种免费开源的交互式运算处理环境,它使用R语言作为编程语言,其最初设计主要用于统计领域[4-5],当前在财经、气象、环境等各个学科都有广泛应用。R具有使用成本低、性能强大、便于获取等优点[6]。特别是在R的专业网站上还包括了3 900多个涵盖各个领域的开源工具包,使用这些工具包不仅不需要任何费用,而且还在不断进行测试和完善,保证了工具包的稳定性。同时,当前统计学界大部分最先进的算法都提供了开源的R语言扩展包,这些扩展包不仅帮助学生学习最先进的统计理论,还给学生的编程习惯树立了优秀的榜样。本文将讨论在统计实验和信号系统实验中使用R替换Matlab的方案。
R语言的免费交互式执行程序R可以在r-project网站下载,也有企业级的Revolution-R学院版可以免费提供高等院校使用。使用R编程需要掌握R语言,它是S语言的一个分支,下面简单介绍R语言中的数据类型。
R语言是一种基于对象的语言,其基本数据类型主要有常量和变量,常量主要分为数值、字符和逻辑三种。数值常量主要用于表示实数和复数,如实数:1,2.0;复数2.0+3.4i。字符常量由“或者”组成,如‘Weight’。逻辑常量包括T或TRUE(真),F或FALSE(假),逻辑常量必须有大写字符表示。无意义的值因比较特殊由NA(Not A number)表示。
可通过“=”和“<-”给变量赋值常量或变量组成的向量、矩阵、列表等数据结构,更复杂的数据由相应的对象保存,如数据框对象、图形对象等[7]。
向量和矩阵是R语言在实验中最常使用的两种数据结构,这两种数据结构与Matlab中的向量和矩阵对应,可以替代Matlab进行矩阵运算。在R语言中构造向量可以使用c()函数进行。利用matrix()可以将向量转换为矩阵。本文给出了常见的矩阵运算在Matlab中命令与R中命令的对比,方便广大学生和教师进行比较学习,如表1所示。
表1 R与Matlab常用命令对比表
由于大部分基本数学函数的名称在R和Matlab中一致,表1中未加入对基本四则运算、三角函数等基本数学函数的对比,其余常见命令可查阅R的帮助文件或Hiebeler维护的文档[8]。
常见的实验课程中,使用上述基本功能与R自带的函数即可完成。
R广泛应用于统计学相关领域,在财经分析、水文估计、环境地理等方向有大量应用,当前学术界几乎所有最新的技术都能在R中找到实现。R在统计实验中的应用是其最基本、最强大的功能之一,不仅如此,R还能在其他领域实验中得到广泛应用。因此,本文设计了两个实验案例,一个是统计实验,另一个是信号与系统实验。
统计实验的主要任务是指导学生理解概率论中各种统计概念的含义,引导学生从整体上把握样本的特征,并通过实验反过来证明常见理论的假设。本实验以正态分布为目标,通过采集样本、绘制样本分布函数、密度函数,对样本进行参数估计及假设检验等环节加深学生对正态分布的理解。
1)采集样本,可要求学生按性别统计参加课程同学的身高并按照R语法输入。如:height=c(1.73,1.60)。该过程可提高课程互动性和趣味性。
2)绘制样本分布函数与密度函数。通过绘图函数完成两类图形的绘制,讲解并引导学生理解分布函数和密度函数的含义。
3)参数估计。采用最大似然估计对样本概率密度函数进行估计,同时得到对应正态分布的参数。
4)假设检验。提出假设检验的基本假设及验证方法,使用R中的nortest包,对样本进行假设检验。
实验所用的代码如下:
其中hist()函数用于绘制样本的直方图[9],该图反应了样本概率密度分布情况。ecdf()用于获取样本的分布函数,plot()用于绘制曲线图形[10],verticals参数用于指定是否需要用垂直线段连接分布函数。lines函数可以在当前绘制的图形中加入新的曲线,其线形由 lty参数给定。mean,var,sqrt的含义与Matlab相同,用于计算样本的均值,方差及开平方函数。正态分布的主要参数都可由均值和标准差进行估计。pnorm函数根据估计的参数创建正态分布的分布函数。ad.test是nortest包中包含的正态分布假设检验函数,其假设样本服从正态分布。其返回值中包括显著性检验参数p-value,这一返回值小于显著值时可以否定假设。nortest包可以使用install.package(‘nortest’,dep=TRUE)安装,使用前需用library()函数载入。
统计实验的结果如图1所示。图1(a)为样本的统计直方图,图(b)中实线为样本分布函数,虚线为带入估计参数的正态分布分布函数。
图1 统计实验结果示意图
上述处理函数的计算方法可以引导学生通过阅读R网站提供的源码进一步加深理解。
R中包含spectrum()函数能够进行频谱图的绘制,也可以使用fft()函数进行快速傅立叶变换。本实验主要任务是对常见波形进行傅里叶变换,引导学生建立频域的概念,能够直观理解频域和时域之间的不同点。该实验以方波为例,分解方波包含的不同频率的分量,结果显示如图2和图3所示。图中分别显示了纯基波,包括直到5次、9次及19次谐波的波形和频谱图。
图2 方波中各频谱波形图
图3 方波中各频谱幅频曲线图
上述代码中f表示各谐波的次数,y矩阵表示各频率分量波形。mapply()函数用于将rep()重复函数应用到向量1∶10上,第一参数为1,第二参数为向量各元素。plotarray和specarray两个函数用于新建多个窗口,并在窗口中显示对应的波形。每一次数据操作的值来源于列表v中指定向量与m矩阵子集的矩阵乘积操作,表示包含x个频率分量的函数波形。
该实验使用R成功替代Matlab绘制了高质量的实验报告图形,并且可加深学生对频域和时域的理解。
本文提出使用R替代Matlab作为统计实验和信号与系统实验的实验软件,并设计了两套实验方案,在降低实验软件成本的同时,加强了将开源软件在学生中的推广应用。
[1]卢莉蓉,周晋阳,牛晓东.MATLAB在传感器教学中的应用[J].实验科学与技术,2010,8(6):36-38.
[2]吴利华.Matlab在大学物理实验教学中的应用[J].实验科学与技术,2009,7(2):101-103.
[3]景小荣,李强,陈前斌,等.基于Matlab的《信号检测与估计》课程教学改革[J].实验科学与技术,2012,10(2):55-57.
[4]奚宁.R语言在统计学教学中的运用[J].科技咨询,2012(1):197.
[5]叶文春.浅谈R语言在统计学中的应用[J].中共贵州省委党校学报,2008,4(106):123-125.
[6]Venables W N,Smith D M,the R Core.Team.An Introduction to R[EB/OL].(2012-6-22)[2012-07-22]http://cran.r - project.org/doc/manuals/R - intro.pdf.
[7]汤银才.R语言与统计分析[M].北京:高等教育出版社,2008:70-86.
[8]Hiebeler D.MATLAB/R Reference[R].cran:r-project.org,2011.
[9]Rossiter D G.Introduction to the R Project for Statistical Computing for use at ITC[EB/OL].(2012-6-14)[2012-07 -22]http://cran.r-project.org/doc/contrib/Rossiter-RIntro-ITC.pdf.
[10]Zuur A F,Ieno E N,Meesters E H,et al.R语言初学者指南[M].西安:西安交通大学出版社,2011:81-93.