1. 引言
《高等数学》[1]-[3]是理工科及经济管理类专业一门至关重要的公共基础课程,其主要涵盖了一元函数与多元函数的微分学、积分学、常微分方程、空间解析几何以及无穷级数等核心内容。该课程通常在大学一年级开设,分上下两册,通常根据不同的专业分为几种不同的学时。例如,面向理工科学生两学期合计开设课时一般为160学时,面向经济管理类两学期合计一般为128学时,面向其他偏文科专业两学期合计一般为96学时。高等数学是一门强大的数学“语言”和“工具”,为后续专业课程的学习提供了不可或缺的理论模型与分析方法。更为深刻的是,高等数学的学习并非仅仅是公式与技巧的机械记忆,其精髓在于对学生理性思维方式的培养[4]-[6]。它致力于培养学生严谨的逻辑推理能力、抽象的数学建模能力,以及将复杂现实问题转化为数学模型并求解的实践能力。因此,熟练掌握高等数学不仅是为专业学习铺路,更是培养一名现代工程师、科研工作者或管理人才科学素养与创新潜力的关键环节。在过去的《高等数学》教学与实践中,长期存在若干突出问题。首先,课程内容本身具有较强的抽象性,常出现教学内容与学生所学专业实际需求相脱节的现象。例如,在极限的学习过程中,学生很难理解数列极限和函数极限的定义;在空间解析几何部分,学生普遍难以凭空想象复杂的空间三维图形,甚至即使掌握了多元函数图像的绘制方法,也很难将多个立体图像合并呈现在同一幅图中,这正体现了抽象内容与直观理解之间的认知差距。此类知识薄弱点将直接影响后续专业课程的学习效果。其次,教学方法较为单一,教师多侧重于基本概念的传授和定理公式的推导,导致学生容易陷入对公式的机械记忆,而缺乏对数学思想与实际意义的深入理解。最后,课程普遍面临课时紧张的问题,部分专业甚至因中途安排专业实训,进一步挤占教学时间,影响知识体系的连贯性与完整性。而且,传统的静态PPT或板书教学方式在此情境下也显得力不从心。
随着计算机技术的快速发展,在高等数学的教学中引入Python绘图和计算[7]-[9]已经成为提升高等数学教学效果的一个关键切入点。Python能够将高度抽象的数学概念与逻辑(例如复杂的三维空间图形、逼近无限的极限过程)转化为生动直观的可视图像,对于复杂的计算问题,可以快速获得结果,从而在学生与抽象知识之间架起一座直观的桥梁。具体而言,在讲解空间解析几何时,教师可利用Python绘制旋转曲面图形,使学生能从任意视角观察其形态,显著改善从二维平面想象三维空间的壁垒;在阐释微积分核心思想时,通过代码快速求导或者求解定积分或者不定积分等,并且能够绘制定积分的矩阵图,让学生“看见”积分的思想本质,而非仅仅记忆公式。这不仅极大地化解了课程的抽象性,更将教学从定理公式的机械推导转向数学思想与应用的深入理解,引导学生从被动接受转为主动探索。通过设计与专业相关的数学建模案例,Python更进一步将高等数学的工具属性凸显出来,强化了与后续课程的衔接。因此,Python融入《高等数学》的教学不仅仅是教学手段的技术升级,更是一种教学范式的深刻变革,它旨在将《高等数学》从一门侧重于演算技巧的孤立学科,转变为一门培养学生利用计算思维进行建模、仿真与解决实际问题的核心能力课程。
2. Python在高等数学教学中的典型案例分析与教学设计深化
2.1. 案例1:Python在极限教学中的应用
2.1.1. 案例回顾
为了生动呈现如何利用Python软件将抽象的数学极限概念转化为直观的视觉认知。本节将围绕高等数学中至关重要的极限公式Ⅱ:
展开分析。
2.1.2. 课堂教学设计(教案节选)
1) 时间点与目的(0~5分钟):回顾极限
的形式,提出问题:“当
趋于无穷大”时,“
”型未定式如何收敛于常数e这一难点,本节将提出了利用可视化方法进行探索。
Figure 1. The graph of function
on the interval
图1. 函数
在区间
的图形
2) 代码演示与互动(5~20分钟):运行附录代码,生成图1,并引导学生观察图像。利用Python软件绘制函数
在区间
的图像,清晰地揭示了函数的动态行为:图1左图中的蓝色曲线在起始段(如
区间)呈现出显著的上升趋势,直观地反映了函数值从初始变化到逐渐增大的过程;右图通过叠加一条醒目的红色水平渐近线
,精准地刻画了当变量
持续增大至
区间乃至更大范围时,函数值没有增长及剧烈波动,而是无限逼近常数e的稳定状态。通过Python软件的绘图,可以很容易理解函数的重要极限公式Ⅱ“无限趋近”的数学思想,也充分证明了Python软件在高等数学中对于深化概念理解的强大辅助作用。
3) 突发情况处理:若现场出现代码报错,则转为讲解代码逻辑,附录中的代码都有相应的解释。鼓励学生课后自主搭建代码,并且更改参数的取值范围再运行代码。
2.2. 案例2:Python在定积分中的应用
2.2.1. 设计意图
在高等数学的定积分学习中,常常会遇到一类难以积分的问题,这类积分往往形式会很复杂,无法通过换元法、分部积分法等方法直接进行积分求解。面对这类问题,可以考虑利用Python软件进行积分。
Figure 2. The definite integral of the function
on the interval
图2. 函数
在
上的定积分
2.2.2. 教学内容
考虑函数
在
上的定积分问题。显然通过利用Python软件可以获得该积分的值为:5.686501309557569。并且,利用Python软件绘制该图形的二维图,如图2所示,其Python代码见附录。
2.2.3. 课堂活动设计
1) 概念回顾:板书定积分定义的数学表达式。
2) 代码解读(10分钟):逐行解释附录中的代码,重点说明如何实现“分割”,以及求和是如何实现的。
3) 动态观察(10分钟):观察图2的定积分结果以及它的几何意义。
2.3. 案例3:Python在空间解析几何绘图中的应用
2.3.1. 设计意图
《高等数学》中的空间解析几何章节往往令人望而生畏,其核心难点在于将抽象的代数方程在脑海中转化为具体的三维图形。这一转化过程在教学中很难通过黑板绘制实现。随着计算机的快速发展,可以利用Python软件将空间直角坐标系中的空间曲面和空间曲线的方程等内容通过计算机软件进行绘制,从而便于观察。
2.3.2. 教学内容
维维安尼曲线是经典的曲线,本文基于Python软件绘制半球面
和圆柱面
的维维安尼曲线,如图3所示,其Python代码见附录。
Figure 3. Curve of the intersection line between hemispherical surface
and cylindrical surface
图3. 半球面
和圆柱面
交线的曲线
2.3.3. 实证
在“空间解析几何”章节,A班(实验组)采用“传统讲解 + Python动态演示与交互旋转”;B班(对照组)采用“传统讲解 + 静态PPT图示”。教学后,使用同一套试卷进行测试。学生成绩如表1所示。从表格中可以看到,显然实验组在使用Python软件后的优秀率比传统教学组的人数要多,并且不及格率也相应降低。
Table 1. Student performance evaluation
表1. 学生成绩评价
班级 |
学生人数 |
等级 |
优秀(90分以上) |
良好(80~89分) |
中等(70~79分) |
及格(60~69分) |
不及格 |
A班(实验组) |
90人 |
9人(10%) |
17人(18.9%) |
24人(26.7%) |
27人(30%) |
13人(14.4%) |
B组(对照组) |
90人 |
3人(3.3%) |
16人(17.8%) |
26人(28.9%) |
25人(27.8%) |
20人(22.2%) |
2.4. 案例4:Python在三重积分计算中的应用
2.4.1. 教学内容
计算三重积分
的问题时,通常计算量非常的大。这里积分区域
由三个坐标面及平面
围成的闭区域。
2.4.2. 课堂活动设计
1) 概念回顾:板书三重积分定义的数学表达式。
2) 代码解读(10分钟):逐行解释附录中的代码。
3) 动态观察(10分钟):可以通过编写Python程序,进而运行Python程序,即可得到结果为
。具体Python代码见附录。
3. 反思技术的双面:挑战与风险
3.1. 挑战与风险分析
Python在《高等数学》教学中的应用,虽然显著提升了学生的直观理解能力与数学建模素养,但其潜在的双刃剑效应仍需我们保持清醒认识。具体而言,主要面临以下两个维度的挑战:第一,过度依赖计算机软件可能导致学生对基础概念的理解浮于表面,削弱其必要的手算和“心算”能力。当学生习惯于直接调用库函数求导、积分时,往往会忽视极限思想的本质内涵和基本运算技巧的训练,将使学生在缺乏软件支持的情况下失去独立解决数学问题的能力,更难以培养严谨的逻辑推理习惯。第二,在教学实施层面存在“师资与内容”的双重压力。作为一门大规模开设的公共基础课,高等数学涉及的教学团队庞大,教师对Python技能的掌握程度可能存在显著差异,这为统一、规范地开展教学带来了挑战。同时,在原本就紧张的课时安排中,既要保证核心知识体系的完整讲授,又要融入Python实践环节,极易造成两方面都浅尝辄止的困境,反而影响教学质量的提升。
3.2. 教学优化策略建议
为最大限度发挥Python的教学价值,我们提出以下针对性策略:在教学模式上,必须确立“数学本体,技术为辅”的基本原则。具体实施中要严格遵循以下三个步骤:首先,通过传统教学确保学生对基本概念、定理证明和典型算例达到深刻理解;其次,引导其进行必要的“笔头”推导,夯实基础;最后,运用Python进行数值验证、可视化呈现或拓展探究,以此彰显技术的赋能作用,而非替代价值。在课程设计上,建议构建“分层混合”的教学体系,一方面保证足够量的传统练习,使学生掌握核心运算能力;另一方面精心设计具有代表性的Python实践项目。这既巩固了基本功,又培养了学生运用计算机工具解决复杂工程问题的能力。
4. 总结
本文通过系统性地将Python引入《高等数学》课程教学。在空间解析几何、函数极限、微积分运算等教学难点环节,借助Python强大的计算和图形可视化功能,将抽象的数学概念转化为直观的图像,有效弥合了理论认知与几何直观之间的鸿沟。特别是通过函数极限绘图、曲面绘制、多重积分计算等典型案例,使学生能够直观观察数学对象的形态特征和变化规律,显著提升了对抽象数学语言的理解深度。基于Python的数值实验与理论推导形成了良好互补,软件计算结果与传统演算结果的高度一致性,验证了数学理论的严谨性,其强大的计算能力使学生从繁琐的手工运算中解放出来,得以将更多精力投入到数学思想的领悟和实际问题的建模中。这种教学方式不仅培养了学生的计算思维,更强化了其运用数学工具解决工程问题的实践能力。将计算机代数系统有机融入高等数学教学,能够有效促进抽象思维与直观理解的有机结合,推动数学教学从“知识传授”向“能力培养”转型。Python在高等数学教学中的应用创新,不仅提升了课程本身的教学效果,更从能力培养、考核评价、课程体系等多个维度支持了工程教育专业认证的要求,为专业建设提供了实质性支撑。未来还将进一步探索如何与Python工具和其他数学软件(例如MATLAB、Maple等)进行优势互补,构建更加完善的数学实验教学体系。
基金项目
四川省哲学社会科学重点研究基地四川省教师教育研究中心高校师德师风建设长效机制创新研究探索课题研究成果,项目编号:TER2024-025。成都大学2024~2026年本科教育教学改革研究项目(项目编号:cdjgb2024219)。
附 录
1. Python在极限教学中的应用
具体的代码如下:
import numpy as np
import matplotlib.pyplot as plt
import math
# 设置中文字体和图形参数
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
def visualize_limit():
"""
可视化函数f(x) = (1 + 1/x)^x在x趋近于无穷大时的极限行为
展示其趋近于自然常数e的过程
"""
# 生成x值:从较小值到较大值,更好地展示极限过程
x_small = np.linspace(1, 10, 100) # 小范围,观察快速变化
x_medium = np.linspace(10, 100, 200) # 中范围,观察趋近过程
x_large = np.linspace(100, 1000, 300) # 大范围,观察稳定趋近
# 计算对应的 y 值
y_small = (1 + 1/x_small)**x_small
y_medium = (1 + 1/x_medium)**x_medium
y_large = (1 + 1/x_large)**x_large
# 创建图形和子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
# 第一个子图:完整范围的视图
ax1.plot(x_small, y_small, 'b-', linewidth=2, label='f(x) = (1 + 1/x)^x')
ax1.plot(x_medium, y_medium, 'b-', linewidth=2)
ax1.plot(x_large, y_large, 'b-', linewidth=2)
# 添加理论极限线
e_value = math.e
ax1.axhline(y=e_value, color='r', linestyle='--', linewidth=2,
label=f'y = e ≈ {e_value:.8f}')
# 添加一些关键点的标注
key_points = [1, 2, 5, 10, 50, 100, 500, 1000]
for x_point in key_points:
if x_point <= 1000:
y_point = (1 + 1/x_point)**x_point
ax1.annotate(f'({x_point}, {y_point:.4f})',
xy=(x_point, y_point), xytext=(10, 10),
textcoords='offset points', fontsize=8,
bbox=dict(boxstyle='round,pad=0.3', facecolor='yellow', alpha=0.7))
ax1.set_xlabel('x')
ax1.set_ylabel('f(x)')
ax1.set_title('函数f(x) = (1 + 1/x)^x的极限行为')
ax1.legend()
ax1.grid(True, alpha=0.3)
ax1.set_xscale('log') # 使用对数坐标更好地展示大范围数据
# 第二个子图:放大视图,关注趋近过程
ax2.plot(x_medium, y_medium, 'g-', linewidth=2, label='f(x)')
ax2.plot(x_large, y_large, 'g-', linewidth=2)
# 添加极限线和误差带
ax2.axhline(y=e_value, color='r', linestyle='--', linewidth=2,
label=f'y = e ≈ {e_value:.8f}')
# 添加误差带(±0.01)
ax2.axhline(y=e_value + 0.01, color='orange', linestyle=':', linewidth=1,
alpha=0.5, label='e ± 0.01')
ax2.axhline(y=e_value - 0.01, color='orange', linestyle=':', linewidth=1, alpha=0.5)
ax2.fill_between(x_large, e_value - 0.01, e_value + 0.01, alpha=0.1, color='orange')
ax2.set_xlabel('x')
ax2.set_ylabel('f(x)')
ax2.set_title('极限趋近过程(放大视图)')
ax2.legend()
ax2.grid(True, alpha=0.3)
ax2.set_ylim(e_value - 0.02, e_value + 0.02) # 放大y轴范围
# 调整布局
plt.tight_layout()
plt.show()
# 打印数值分析结果
print("数值分析结果:")
print("=" * 50)
print(f"理论极限值: e = {e_value:.10f}")
print("-" * 50)
test_points = [1, 10, 100, 1000, 10000, 100000]
for x in test_points:
y_calculated = (1 + 1/x)**x
error = abs(y_calculated - e_value)
error_percent = (error / e_value) * 100
print(f"x = {x:6d}: f(x) = {y_calculated:.10f}, "
f"误差 = {error:.2e} ({error_percent:.6f}%)")
def analyze_convergence_rate():
"""
分析函数收敛到e的速度
"""
print("\n收敛速度分析:")
print("=" * 50)
x_values = [10**i for i in range(1, 7)] # 10, 100, 1000, ..., 1000000
e_value = math.e
prev_error = float('inf')
for i, x in enumerate(x_values):
y = (1 + 1/x)**x
error = abs(y - e_value)
if i > 0:
convergence_ratio = prev_error / error
print(f"x = {x:8d}: 误差 = {error:.2e}, 收敛比 = {convergence_ratio:.2f}")
else:
print(f"x = {x:8d}: 误差 = {error:.2e}")
prev_error = error
# 主程序
def main():
"""
主函数:执行可视化分析和收敛速度分析
"""
visualize_limit()
analyze_convergence_rate()
# 测试用例
def test_functions():
"""
测试函数,验证基本功能
"""
print("测试函数计算结果:")
print("=" * 50)
# 测试几个关键点的函数值
test_points = [1, 2, 5, 10, 100]
for x in test_points:
y = (1 + 1/x)**x
print(f"f({x}) = {y:.8f}")
# 验证极限值
e_value = math.e
large_x = 1000000
y_large = (1 + 1/large_x)**large_x
error = abs(y_large - e_value)
print(f"\n验证极限:")
print(f"数学常数 e = {e_value:.10f}")
print(f"当 x = {large_x} 时,f(x) = {y_large:.10f}")
print(f"误差 = {error:.10f} (相对误差 = {(error/e_value)*100:.8f}%)")
if __name__ == "__main__":
# 运行主程序
main()
# 运行测试用例
print("\n" + "=" * 50)
print("功能测试:")
print("=" * 50)
test_functions()
运行,即可得到图1。
2. Python在定积分中的应用
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
# 1. 定义被积函数
def integrand(x):
« » »定义被积函数:(e^x * sin(x)) / sqrt(1 + x^2) « » »
return (np.exp(x) * np.sin(x)) / np.sqrt(1 + x**2)
# 2. 设置积分下限和上限
a = 0 # 下限
b = np.pi # 上限
# 3. 调用quad函数进行数值积分
# quad 返回两个值:积分结果和一个对误差的估计
result, error_estimate = integrate.quad(integrand, a, b)
# 4. 打印结果
print(“数值积分结果:”)
print(f”积分值I ≈ {result}”)
print(f”误差估计: ± {error_estimate}”)
# (可选)可视化被积函数,理解我们正在积什么
x_vals = np.linspace(a, b, 500)
y_vals = integrand(x_vals)
plt.figure(figsize=(10, 6))
plt.plot(x_vals, y_vals, ‘b-‘, linewidth=2, label=r’$f(x) = \frac{e^x \sin(x)}{\sqrt{1 + x^2}}$’)
plt.fill_between(x_vals, y_vals, alpha=0.3) # 填充积分区域
plt.xlabel(‘x’)
plt.ylabel(‘f(x)’)
plt.title(‘定积分的被积函数’)
plt.grid(True, linestyle=’—', alpha=0.7)
plt.legend()
plt.show()
运行,即可得到图2。
3. Python在空间解析几何绘图中的应用
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 设置参数
a = 2.0 # 半径参数
t = np.linspace(0, 2*np.pi, 200) # 参数t
# 计算交线的参数方程(维维安尼曲线)
x = a/2 * (1 + np.cos(t))
y = a/2 * np.sin(t)
z = a * np.sin(t/2)
# 创建3D图形
fig = plt.figure(figsize=(12, 10))
# 1. 绘制交线曲线
ax1 = fig.add_subplot(221, projection='3d')
ax1.plot(x, y, z, 'r-', linewidth=3, label='交线L (维维安尼曲线)')
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.set_zlabel('Z')
ax1.set_title('半球面与圆柱面的交线')
ax1.legend()
ax1.grid(True)
# 2. 绘制交线 + 半球面
ax2 = fig.add_subplot(222, projection='3d')
# 生成半球面数据
theta = np.linspace(0, 2*np.pi, 50)
phi = np.linspace(0, np.pi/2, 25) # 只取上半部分
theta, phi = np.meshgrid(theta, phi)
X_hemi = a * np.sin(phi) * np.cos(theta)
Y_hemi = a * np.sin(phi) * np.sin(theta)
Z_hemi = a * np.cos(phi)
# 绘制半球面(半透明)
ax2.plot_surface(X_hemi, Y_hemi, Z_hemi, alpha=0.3, color='blue', label='半球面')
ax2.plot(x, y, z, 'r-', linewidth=3, label='交线')
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('Z')
ax2.set_title('交线与半球面')
ax2.set_zlim(0, a)
# 3. 绘制交线 + 圆柱面
ax3 = fig.add_subplot(223, projection='3d')
# 生成圆柱面数据
theta_cyl = np.linspace(0, 2*np.pi, 50)
z_cyl = np.linspace(-0.5, a, 50) # 圆柱的高度范围
theta_cyl, z_cyl = np.meshgrid(theta_cyl, z_cyl)
X_cyl = a/2 * (1 + np.cos(theta_cyl))
Y_cyl = a/2 * np.sin(theta_cyl)
Z_cyl = z_cyl
# 绘制圆柱面(半透明)
ax3.plot_surface(X_cyl, Y_cyl, Z_cyl, alpha=0.3, color='green', label='圆柱面')
ax3.plot(x, y, z, 'r-', linewidth=3, label='交线')
ax3.set_xlabel('X')
ax3.set_ylabel('Y')
ax3.set_zlabel('Z')
ax3.set_title('交线与圆柱面')
ax3.set_zlim(0, a)
# 4. 三者在同一坐标系中
ax4 = fig.add_subplot(224, projection='3d')
ax4.plot_surface(X_hemi, Y_hemi, Z_hemi, alpha=0.2, color='blue')
ax4.plot_surface(X_cyl, Y_cyl, Z_cyl, alpha=0.2, color='green')
ax4.plot(x, y, z, 'r-', linewidth=4, label='交线')
ax4.set_xlabel('X')
ax4.set_ylabel('Y')
ax4.set_zlabel('Z')
ax4.set_title('三者关系总览')
ax4.set_zlim(0, a)
plt.tight_layout()
plt.show()
# 单独绘制更清晰的交线图
fig2 = plt.figure(figsize=(10, 8))
ax = fig2.add_subplot(111, projection='3d')
# 绘制交线曲线
ax.plot(x, y, z, 'r-', linewidth=4, label=f'维维安尼曲线 (a={a})')
# 添加坐标轴上的标记
# 曲线起点和终点
ax.scatter([a], [0], [0], color='blue', s=100, label='起点 (a,0,0)')
ax.scatter([0], [0], [a], color='green', s=100, label='最高点 (0,0,a)')
# 设置视角
ax.view_init(elev=30, azim=45)
ax.set_xlabel('X轴', fontsize=12)
ax.set_ylabel('Y轴', fontsize=12)
ax.set_zlabel('Z轴', fontsize=12)
ax.set_title('维维安尼曲线(半球面与圆柱面的交线)', fontsize=14)
ax.legend()
ax.grid(True)
# 设置坐标轴范围
ax.set_xlim([-0.5, a+0.5])
ax.set_ylim([-a/2-0.5, a/2+0.5])
ax.set_zlim([0, a+0.5])
plt.tight_layout()
plt.show()
# 打印曲线特征点信息
print("=== 维维安尼曲线特征点 ===")
print(f"参数 a = {a}")
print("曲线方程(参数形式):")
print(f" x = {a/2}(1 + cos(t))")
print(f" y = {a/2} sin(t)")
print(f" z = {a} sin(t/2)")
print("\n重要点坐标:")
print(f" t=0: ({a}, 0, 0) # 起点")
print(f" t=π: (0, 0, {a}) # 最高点")
print(f" t=2π: ({a}, 0, 0) # 回到起点")
print(f" t=π/2: ({a/2}, {a/2}, {a/np.sqrt(2):.3f})")
运行,即可得到图3。
4. Python在三重积分计算中的应用
import numpy as np
from scipy.integrate import tplquad
# 定义被积函数 f(x, y, z) = x + y
def integrand(z, y, x):
return x + y
# 积分区域 Ω: 由平面 x + y + z = 1 与坐标面围成的四面体
# x范围: 0到1
# y范围: 对于每个x,y从0到1-x
# z范围: 对于每个(x, y),z从0到1-x-y
result, error = tplquad(
integrand, # 被积函数
0, 1, # x范围[0, 1]
lambda x: 0, # y的下限(关于x的函数)
lambda x: 1 - x, # y的上限(关于x的函数)
lambda x, y: 0, # z的下限(关于x, y的函数)
lambda x, y: 1 - x - y # z的上限(关于x, y的函数)
)
print("数值积分结果:", result)
print("误差估计:", error)
print("解析结果 1/12:", 1/12)
print("两者差值:", abs(result - 1/12))
运行,即可得到结果。