1. 引言
在这个科技时代,计算思维应与阅读、写作和算术一样,被视为教育中的一项基本分析技能。这是对二十一世纪课堂的展望[1]。许多重要的应用研究和纯理论研究问题都涉及计算和理论。计算带来了仅凭理论无法实现的额外见解和理解[2]。计算设备的日益普及必须得到计算思维在学科中广泛传播的支持,并进一步得到大学课程的支持和加强。大部分高等院校的数学专业学生已设置了如MATLAB等专门用于数学计算的编程语言课程,通过一个学期的详细教学后,会设计相应的考核方式对数学专业的学生数学模型编程思维能力进行考察。然而,对于数学专业以外的其他理工科学生而言,由于要学习大量的本专业课程内容,很少有条件进行数学专业软件课程的教学,而且自学这些专业软件难度较大。R语言作为功能强大、操作简单和易于自学的计算平台,更适合于数学专业以外的理工科学生的学习和应用。
本文旨在利用免费计算平台R语言[3],展示可操控的实际算例,用于高等数学和概率统计课程的教学中。目的是让读者领略R所提供的丰富功能,而非对R语言进行全面介绍。鉴于现代技术的日新月异,本文强调了使用R等现代技术来呈现复杂概念的需求。本文关注这些计算项目的数学和编程内容。主要目标是提供一系列经过精心求解和课堂测试的数学问题,使用R语言编写并提供代码,以便将其纳入教学大纲,并能够快速复制和调整,以满足那些有意在课堂上尝试计算思维教学的教育者的需求。
利用现代技术,学生有机会学习如何更好地交流和展示数学知识,这些技能在学术界和工业界都变得越来越重要。引入计算实验还有一个额外的教学益处,那就是可以更好地了解学生掌握所学内容的程度,以及哪些数学概念给他们带来了困难。互动式计算机实验往往能保持学生的学习积极性,并让他们积极参与学习过程。
算例都被分解成许多更小的部分,以便逐步引导学生,使他们能够更有信心地完成整个解决方案。实验的重要特点是,将计算问题和数学问题相结合,这样学生就有机会从数学和计算两个角度来研究相同的问题。这是建立学生自信心的关键组成部分,因为他们可以比较自己的计算结果和数学结果,并确保自己走在正确的轨道上。可视化也是这些实验的关键组成部分,有助于学生建立良好的直觉,并且为学生提供了一种研究问题的方法。编码帮助学生关注细节,真正理解数学问题,并按照正确的数学逻辑实施解决方案。编码是一种计算问题解决的形式,它与纯粹的数学问题解决形式交织在一起。学生能从这些算例中获得的技能和益处。
2. 安装并学习R语言
R是一种开源科学编程语言。R语言可以从[3]下载。R语言提供了适用于Mac、Linux和Windows的预编译二进制文件。R语言附带了一个简单的用户界面。RStudio提供了一个更复杂的集成开发环境(IDE),因其增强的报告生成能力、将计算与R语言统一以及将数学排版与LATEX统一而变得非常流行。RStudio也是免费的,并且提供了适用于Mac、Linux和Windows的二进制文件。RStudio可以从[4]下载。R语言已经发展成为一个强大的计算平台,用于通过图形探索、模拟和动画展示确定性模型和随机模型、统计计算和数据分析,以及最近用于基于网络的交互式应用程序的数学思想实验。让学生接触R语言可以增加他们获得高质量实习和全职工作的机会。
在本文中,提供了所有算例实施所需的所有R代码,并进行了详尽的说明,以便读者能够轻松地将其移植到其他计算环境中。在数学课堂中使用多种技术具有教学价值。关于R语言,有一些优秀的书籍和在线教程,建议感兴趣的读者参考其中的一些,以便更全面地学习R语言在科学编程、可视化和模拟方面的应用[5]-[7]。
3. 在高等数学中的应用
本文展示了两个高等数学的算例。第一个算例(第3.1节)是关于可视化一个处处不可微函数的图像,以建立视觉直觉并深入了解不可微性。第二个算例(第3.2节)应用蒙特卡洛模拟来估计超球面和椭球的体积。
3.1. 放大观察一个处处不可微的函数
在高等微积分课程中,学生会遇到“奇异函数”的例子,这类函数处处连续但处处不可导。除了难以理解和想象这种性质的函数外,学生还经常想知道,具有类似性质的函数是否具有任何实际应用。在影视制作和音乐制作行业中经常采用这种“奇异”、处处不可导的函数来制作特殊音效,利用所谓的谢泼德升调。
可视化处处不可导的连续函数的图形是一项挑战。本文考虑一个具有这种性质的特定示例,即函数f(x),读者可以在[8]中找到更详细的论述。学生可以通过组合更基本的函数,分几步构造f(x),本文使用R语言来实现对f(x)的良好近似,并绘制其图形。
可以先实现三角函数r(x),将其作为构建函数f(x)的第一个基础模块,其定义如下:
(1)
将r(x)实现为一个分段函数,并在图1中绘制了它的图像。
Figure 1. Graph of the function r(x)
图1. 函数r(x)的图形
对应的R代码为:
r<-function(x) x*(x>=0 & x<1)+(2-x)*(x>=1 & x<=2)# 分段函数
x<-seq(from=-1,to=3,by=0.01) # 将区间[-1,3]按步长0.01划分
plot(x, r(x),type="l",lwd=3,col="blue",main="Graph of r(x)")
须注意,(x>=0&x<1)是R语言中的一个逻辑表达式(&表示逻辑与),当参数x为向量时,该表达式会生成一个逻辑值向量,并根据条件是否满足,将其强制转换为由1和0组成的二进制向量,分别对应TRUE和FALSE。最后,表达式x*(x>=0&x<1)会返回一个全为0的向量,并且只包含向量x中满足条件的值。函数r中的两项之和定义了r(x),如式(1)所示。
函数r(x)在所有地方都是连续的,但在x = 0、1、2处不可导。通过平移这个函数,可以定义在任意给定有限集的每个点处都不可导的全局连续函数。因此,我们将r(x)扩展为周期锯齿函数g(x)。
(2)
其中,我们将Floor(x)定义为不大于x的最大整数。可以使用已定义的函数r和内置函数floor(),在R中实现由式(2)定义的g(x),然后绘制锯齿函数g(x),如图2。对应的R代码为:
x<-seq(-6,6,by=0.01) # 将区间[−6, 6]按步长0.01进行划
g<-function(x)r(x-2*floor(x/2)) # 锯齿波函数
plot(x, g(x),type="l",lwd=3,col="blue",main="Graph of g(x)")
Figure 2. Graph of the periodic extension function g(x)
图2. 周期延拓函数g(x)的图形
定义函数序列
,并将
定义为该序列的极限:
其中
(3)
为了更好地理解
的性质,在图3中绘制了
的图像,并将其作为
图像的近似。根据式(3),在R语言中把
定义为函数f20。
f20<-function(x){
k<-0:20 # 幂值向量
return(sum((3/4)^k*g(4^k*x)))} # 返回f20(x)的值
f20<-Vectorize(f20) # 绘图所需的向量化函数
图3中使用for()循环,可以在2 × 2的矩阵图中填充四个不同区间上的f20(x)的图像。最后一张图被放大了100倍。初始区间:[−1, 1],最终区间:[−0.01, 0.01]。对应的R代码为:
zoom<-c(1,0.2,0.04,0.01)# c ()函数将多个数值合并为一个向量
par(mfrow=c(2,2)) #4 幅图布局
for(n in 1:4){ # 用于绘制4幅图表的for循环
x<-seq(-zoom[n],zoom[n],length.out=1e4)
plot(x,f20(x),type="l",lwd=0.5,col="blue",
main=paste("Graph of f20(x) in [",-zoom[n],",",zoom[n],"]"))
}
函数
和
在全体实数上都是连续的。由于
,而
是连续函数的有限线性组合,因此
连续,进而可推得
也是连续的。图3展示了
图像的粗糙形态,它呈现出具有自相似性的类分形结构:即使持续放大,图像的粗糙特征仍会重复出现,这一点在四个子图中清晰可见。对学生而言,理解这一点非常重要:图3仅提供了具有视觉吸引力的直观感受,并非严谨的证明,只是通过放大后观察到图像不会变得平滑这一现象,给出了直观的佐证。
(a) (b)
(a) (b)
Figure 3. Magnified view of the plot of f20(x) approximating f(x)
图3. 对近似f(x)的f20(x)图像进行放大观察
为了说明可导函数与前文函数的区别,绘制函数
的图像,并在
点附近对其进行“显微镜”式放大观察。从图4的子图中可以明显看到:当我们持续放大时,
的图像在点
附近会变得越来越平滑。在最后一张放大100倍的子图中,已经将0点附近的区间放大到了几乎与
在点
处的切线完全重合的程度。
函数
在点
处的切线方程为:
(4)
(a) (b)
(c) (d)
Figure 4. Magnification of the differentiable function h(x)
图4. 放大可微函数h(x)
3.2. 估计三维单位球体的体积
三维球体(半径为
,记为
)的体积可以表示为三重积分:
(5)
其中,该三维球体由所有满足
的点
构成。学生可以通过以下方法估计
中单位球体的体积:在以(0, 0, 0)为中心、边长为2的立方体内随机生成点,然后统计其中落在单位球体内的点的数量。
library(scatterplot3d)# 必须先安装,再加载(该包)
N<-1e4 # 随机点的数量
# 从均匀分布U(−1, 1)中采样得到的x、y、z随机数向量
x<-runif(N,-1,1); y<-runif(N,-1,1); z<-runif(N,-1,1)
scatterplot3d(x,y,z, pch="+", highlight.3d=TRUE,tick.marks=F,
main="Random points inside the cube")
(a) (b)
Figure 5. Generate random points inside a cube and visualize those lying within the unit sphere
图5. 在立方体内生成随机点,并可视化那些落在单位球体内的点
生成一个逻辑值向量
,利用该向量对落在单位球体内的随机点进行索引。
ind<-(x^2+y^2+z^2<=1)# 逻辑值向量
scatterplot3d(x[ind],y[ind],z[ind], pch="+", highlight.3d=TRUE,
tick.marks=F,main="Random points inside the unit ball")
两次调用scatterplot3d()函数生成了图5所示的两个三维散点图,以此可视化蒙特卡洛点采样过程。需要计算落在单位球体内的点的比例,该比例可通过逻辑向量
的均值得到。将该比例与边长为2的立方体体积
相乘,即可得到单位三维球体体积的估计值。
# 在边长为2、中心位于原点的立方体内生成一百万个随机
x<-runif(1e6,-1,1); y<-runif(1e6,-1,1); z<-runif(1e6,-1,1)
frac<-mean(x^2+y^2+z^2<=1)# 单位球内随机点的占比
落在单位球体内的点的比例,可通过计算逻辑值向量
的算术均值得到,计算结果为0.5239。
vol<-2^3*mean(x^2+y^2+z^2<=1)# 单位球的近似体积
计算得到的单位球体积估计值vol ≈ 4.191,与阿基米德在近2000年前发现的精确公式结果非常接近:
(6)
4. 在概率统计中的应用
本文介绍了一个概率统计课程中的算例:从“随机变量的随机和”的分布中模拟生成样本,计算关键的样本统计量与目标概率。
餐厅收入问题
例4.1:每日前往某餐厅的顾客人数N服从泊松分布,平均每天有100名顾客。每位顾客的消费额服从正态分布,平均消费为22元,标准差为4元。顾客的消费额相互独立,且与顾客人数N也相互独立。请模拟顾客总消费额的分布,估算总消费额的期望值与标准差,并计算总消费额至少为2000元的概率。
设
为
名顾客的账单。每张账单
服从正态分布,即
。顾客总人数
服从泊松分布,即
,该分布完全由日均100名顾客的平均值决定。餐厅的总消费额由下式给出:
(7)
目标是模拟总消费额S的分布,其中S是由式(7)定义的随机变量的随机和。实现思路是设计一个随机实验来模拟随机变量S的单次观测值,之后学生需要重复该随机实验多次,以生成S的样本。
spending<-function(){ #用于模拟一次随机实验的函
N<-rpois(1,100) # 单次泊松采样
bills<-rnorm(N,22,4) # N个正态分布样本
return(sum(bills)) # 单次总消费额样本
}
Figure 6. Density histogram of total consumption
图6. 总消费额的密度直方图
随机变量S的单次实现可通过调用函数spending()生成,该函数用于实现随机实验。为了得到总支出的分布,使用R语言的replicate()函数将该随机实验重复106次。replicate()的参数包括:希望重复随机实验的次数,以及用于单次模拟该随机实验的R函数。通过这种方式,可以从总支出的分布中生成一个规模为一百万的样本。还可以得到这些样本统计量的汇总结果。
spending.sample<-replicate(1e6,spending())
summary(spending.sample) # 样本统计量
随机变量S的样本标准差通过sd(spending.sample) 计算,结果为223.44。在图6中,通过绘制模拟样本的密度直方图来可视化S的分布。
hist(spending.sample,breaks=100,freq=F,col="blue",border="white",
xlab="total spending",main="Density histogram of total spending")
从总支出的分布中获取一个大样本,能让学生估算任何感兴趣的统计量。具体来说,总支出至少为2000元的概率可通过公式(7)计算:
(8)
5. 结论
R语言提供了用于模拟、可视化与数据分析的高级编程工具,能够以最小的工作量快速开发复杂问题的简洁解决方案。本文所展示的示例旨在让读者体验R所具备的丰富模拟与可视化能力。学生通过负责任地使用这类技术能获得显著收益。以R为代表的计算工具,能加深学生对复杂问题和抽象概念的洞察与理解。多数学生喜欢并认可这种实践体验的价值,它不仅有助于培养计算、展示与沟通技能,还能提升他们在获取优质实习与就业机会时的竞争力。最后,必须明确:技术不应被用作严谨证明的替代品,而只能作为达成目标的手段。