Python语言在高等数学积分教学中的应用探析
作者: 宋婷婷 王琳琳
摘要:高等数学是非数学专业的一门公共基础课。积分学是整个高等数学教学内容的重难点之一,内容较多,教师讲课形式比较单一,学生缺少空间想象力。文章结合积分学的实例,利用Python的可视化功能绘制复杂函数的图像,动态演示函数形成过程,有助于快速准确地找到积分区域,确定积分限,培养学生的空间思维能力。再利用其计算功能,进行积分运算,快速高效地计算出结果,帮助学生更好地理解积分过程,提高教与学的效果。
关键词:Python语言;定积分;反常积分;二重积分;三重积分
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2023)25-0118-04
开放科学(资源服务)标识码(OSID)
0 引言
高等数学是理工科类院校的基础课程之一,是学习其他专业课的基础课[1]。高等数学对于很多理工科学生来说,那是一棵高高的“大树”。一方面,教师讲课形式比较单一,以讲授法为主,一笔一板,学生被动学习,不能激起学生的学习兴趣。另一方面,高等数学内容相对较多,主要包括微分学、积分学。对于学生而言,因为高中对微分学涉猎较多,所以学生易于理解,乐于学习。而高中数学虽对积分也有学习,但比较基础。又由于积分学在高等数学整个教学的靠后部分,且内容较多,包括定积分、反常积分、重积分、曲线积分、曲面积分等,导致学生学习时,感觉很难理解,所以很多学生产生放弃学习该部分的想法。介于学生对积分学畏难的想法,教师讲课形式单一等问题,教师需要调整教学思路、教学方法,使用多媒体手段辅助教学,借助Python的可视化功能,可以把复杂抽象的积分变化过程以及计算结果准确地模拟出来,让学生可以更直观地理解积分过程,激发学生的学习兴趣,提升课堂教学效果。
1 Python语言简介
Python语言由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计。Python语言是一种面向对象、解释型、动态型的编程语言。与其他语言相比较,Python语言具有如下特点:第一,简单易学,是一种代表简单思想的语言,优势在于,使用时,专注于解决问题,而不必注重语言本身语法和结构。第二,面向对象,Python即支持面向过程编程,也支持面向对象编程。面向过程,是以过程为中心,思考出每一个步骤,用函数逐一实现。面向对象,是通过定义出函数与数据的名称,把事物对象化,方便使用者再次调用。Python的简洁性使其能够非常方便快捷地实现面向对象和面向过程编程。第三,免费开源,学习者可以自由地发布软件,下载、复制、阅读、修改源代码,抽取部分功能用于其他软件中。第四,可移植性,Python语言编写的程序可以不加修改地在任何平台上运行,不受限制,即兼容众多平台。第五,类库丰富,Python解释器拥有丰富的内置类和函数库,同时通过开源社区又可以找到覆盖各个应用领域的第三方函数库,使学习者能够借助函数库实现某些复杂的功能[2]。基于上述特点,优选Python作为辅助教学软件。
2 Python语言在积分运算中的应用
对于积分的学习,其一,学生缺乏绘图能力,空间想象力,不能绘制出函数图像,导致学生在进行积分运算时,找不到积分区域,进而不能确定积分限。其二,学生对积分的计算方法,积分公式不熟悉,导致学生计算不出结果,认为积分运算太难。基于上述问题,借助Python的可视化功能,快速高效地计算出结果。
2.1 Python语言在定积分运算中的应用
定积分是后面计算其他积分的基础,对于重积分,曲线积分,曲面积分,其计算最终都转化为定积分的计算。定积分计算时,曲线的形成过程仅仅通过教师讲解,板书绘制,学生不能很好理解,利用Python动态演示该过程。下面以心形线为例,利用定积分计算心形线的长度和所围图形的面积[3]。
例1 求心形线[r=1+cosθ]的全长及所围图形面积。
程序代码如下:
##心形线绘制r=1+cos(theta)
fig = plt.figure()
ax = fig.add_subplot(autoscale_on=False, projection="polar")
##设置经向网格
ax.set_rgrids(np.arange(-2, 2, 1))
##经向文本标签在90度反向位置显示
ax.set_rlabel_position(90)
ax.set_rlim(0, 2)
theta = []
r = []
for i in np.arange(1, 361):
x = 2 * np.pi / 360 * i
theta.append(x)
y = 1 + np.cos(x)
r.append(y)
ax.set_title('r = 1 + cos(theta)', fontsize=18)
ax.plot(theta, r, 'r', linewidth=1)
plt.savefig('heart1.png', dpi=600)
plt.show()
程序执行结果:
根据心形线图像,快速准确给出[θ]的取值范围[0,2π]。
##计算心形线的长度
##被积函数
def f1(theta):
return np.sqrt(2 * (1 + np.cos(theta)))
s, err = integrate.quad(f1, 0, 2 * np.pi)
print ('心形线的长度:', s)
程序执行结果:
心形线的长度= 7.999999999999999。
##计算心形线所围图形的面积
##被积函数
def f2(theta):
return 1 / 2 * (1 + np.cos(theta)) ** 2
A, err = integrate.quad(f2, 0, 2 * np.pi)
print ('心形线所围图形的面积:', A)
程序执行结果:
心形线所围图形的面积
=4.712388980384691
2.2 Python语言在反常积分运算中的应用
反常积分通常包含两大类型,第一类为积分区间为无穷的反常积分,第二类为无界函数的反常积分[4]。以积分区间为无穷的反常积分为例。
例2 计算反常积分[0+∞e-x2dx]。
因为该反常积分的被积函数的原函数不能直接用初等函数表示,所以对该积分直接利用牛顿-莱布尼茨公式计算不出来,但可以考虑利用二重积分计算该反常积分。利用二重积分,[De-x2-y2dxdy]其中[D]是由圆心在原点,半径为[a]的圆周所围成的闭区域,其计算结果求解反常积分[0+∞e-x2dx][5]。
虽然通过二重积分可以计算出反常积分,但二重积分属于高等数学下册的内容,仅在学习反常积分时,该问题还不能够被解决。利用Python编程语言的辅助,可以快速计算出结果,利用绘图功能,画出被积函数的图像,帮助学生更好地理解反常积分。
程序代码如下:
##被积函数
def f(x):
return np.exp(- x ** 2)
##绘制被积函数图像
fig, ax = plt.subplots()
x = np.linspace(0, 2, 100)
ax.plot(x, f(x), color = 'blue', linewidth = 2, linestyle = '-', label = 'f(x)=e^(-x^2)')
ax.fill_between(x, f(x), color = 'green', alpha = 0.2)
ax.set_xlabel('x', fontsize = 15)
ax.set_ylabel('y', fontsize = 15)
ax.legend(loc = 'upper right')
ax.set_ylim(0, 2)
plt.show()
##计算反常积分
##积分函数 integrate.quad()
v, err = integrate.quad(f, 0, float(np.inf))
print ('积分结果:', v)
程序执行结果:
积分结果:0.8862269254527579。
从图像上看,该反常积分表示向右无限延伸的图形面积,而积分结果是一有限值。
2.3 Python语言在重积分计算中的应用
重积分的计算对于学生而言,是积分中的难点之一。一方面,找积分区域困难,另一方面,积分的计算也是问题点,导致学生对该部分的学习失去兴趣。通过Python语言绘制出积分区域的图形,让学生直观看到图形,快速找到积分区域,便于学生对二重积分、三重积分的理解。
例3 计算[Dx2-y2dxdy],其中D是以o(0,0) ,A(1,-1) ,B(1,1) 为顶点的三角形区域。
程序代码如下:
##绘制积分区域
fig, ax = plt.subplots()
x = np.linspace(0, 1, 10)
y = np.linspace(-1, 1, 10)
y1 = x
y2 = - x
x1 = y * 0 + 1
##绘制直线
ax.plot(x, y1, color = 'blue', linewidth = 2, linestyle = '-', label = 'y=x')
ax.plot(x, y2, color = 'black', linewidth = 2, linestyle = '-', label = 'y=-x')
ax.plot(x1, y, color = 'red', linewidth = 2, linestyle = '-', label = 'x=1')
ax.fill_between(x, y1, color = 'green', alpha = 0.2)
ax.fill_between(x, y2, color = 'green', alpha = 0.2)
ax.set_xlabel('x', fontsize = 15)
ax.set_ylabel('y', fontsize = 15)
ax.legend(loc = 'upper left')
plt.show()
程序执行结果:
图3给出二重积分的积分区域,进而在计算二重积分时,快速给出积分变量的取值范围,[x]的取值范围[0,1],[y]的取值范围[-x,x]。