资讯动态

零基础用 Python 学高等数学:sympy/numpy 可验证脚本实践

发布时间:2026/9/17 22:44:51 来源:尧图企业网站定制
简介这份 PDF 文档面向零基础备考高等数学的学习者尤其适合自考高数一、二的考生以及被微积分、线性代数、概率统计入门门槛困扰、担心及格率偏低的自学者。全文围绕“抓住微积分这一核心”展开先讲清导数和积分的含义及微积分对概率统计理论的作用再拆解基本概念、基本理论、基本运算与应用四个学习环节并给出听课、整理笔记与做题、阶段总结、全课程总结等可执行方法还穿插了作者参加自考高数的复习计划与应试体会。压缩包内仅含 1 个 PDF 文件体积约 43KB轻量便携适合打印或在移动设备上随时翻阅。目前已有 390 人学习读者可据此建立学习框架、明确复习顺序、缓解畏难情绪并借助历年考题研究与时间规划提升通过率对初次接触高等数学的人具有明确的入门参考价值。1. 零基础啃高等数学.pdf先把「看得见」的学习回路搭起来很多人拿到《零基础如何学好高等数学.pdf》这份材料从第一章极限开始读读得挺顺到了多元函数那一章突然卡死。回头一看前面所有内容都只是「看懂了」没有一条结论是自己独立推出来的。问题不在智商在于缺一个反馈回路手算完不知道对不对错了也不知道错在哪一步。对 IT 从业者来说这件事有解。写代码的人手里本来就有一套验证工具sympy 做符号计算、numpy 做数值逼近、matplotlib 把 ε-δ 语言画成能看的图。把教材里的每个结论换成一条能跑的命令对错立刻有反馈零基础也容易坚持。后面按极限、一元微分、一元积分、级数与多元微分四块推进每块给出环境命令、可抄的脚本、参数含义和典型报错。会一点 Python 就能跟上完全没写过代码先花两小时补变量、循环、函数三件事再回来。2. 极限与连续用 sympy 把 ε-δ 语言跑成可验证的命令2.1 为什么极限是整份 .pdf 的栈底导数是用差商的极限定义的定积分是用黎曼和的极限定义的级数收敛是部分和数列的极限函数连续是函数在该点极限等于函数值。这四个概念全部挂在「极限」上。零基础最常见的失误是跳过 ε-δ 直接背公式表短期内能做对题一旦遇到分段函数、无穷小比阶、振荡函数判断依据就没了。更实用的做法是把「极限存在」当成一个可判定的谓词来对待左右极限分别存在、有限、且相等。凡是能写成这三条判定的题都可以用一条命令验证不需要靠感觉。2.2 最小可运行环境venv 里装 sympy 与 numpy先在项目目录里建一个隔离环境避免和系统 Python 的包互相污染。命令行依次执行python3 -m venv .venv source .venv/bin/activate # Windows 下换成 .venv\Scripts\activate pip install sympy numpy matplotlib scipy python -c import sympy, numpy; print(sympy.__version__, numpy.__version__)sympy负责符号运算返回精确表达式numpy负责数值逼近用来画图和交叉验证scipy里的quad在符号积分失败时兜底。激活环境后所有命令都在.venv内生效退出用deactivate。2.3 三类极限的验证命令与参数对照把教材里常见的极限按类型分组每类给一条命令跑通再往下走# limit_check.py import sympy as sp x sp.Symbol(x, realTrue) # 声明实变量避免 sympy 走进复数分支 n sp.Symbol(n, integerTrue, positiveTrue) print(sp.limit(sp.sin(x) / x, x, 0)) # 双侧极限 - 1 print(sp.limit(sp.Abs(x) / x, x, 0, dir)) # 右极限 - 1 print(sp.limit(sp.Abs(x) / x, x, 0, dir-)) # 左极限 - -1 print(sp.limit(x * sp.sin(1 / x), x, 0)) # 0 乘有界量 - 0 print(sp.limit(sp.sin(1 / x), x, 0)) # 振荡无极限 print(sp.limit((1 1 / n) ** n, n, sp.oo)) # 重要极限 - Elimit的第三个参数是趋近点dir取或-分别表示单侧不写就是双侧。sp.oo表示无穷正负无穷写在趋近点位置即可例如-sp.oo。Symbol上的realTrue不是可有可无的装饰不加这句sqrt(x**2)不会化简成Abs(x)后面的化简结果会跟手算对不上。极限类型手算结论sympy 写法关键参数sin x / xx→01limit(sin(x)/x, x, 0)默认双侧|x|/xx→0不存在分别用dirdir-必须分侧(11/n)^nn→∞elimit((11/n)**n, n, oo)变量声明integerTruex·sin(1/x)x→00limit(x*sin(1/x), x, 0)有界量乘无穷小sin(1/x)x→0无极限返回AccumBounds或nan需人工判断2.4 ε-δ 定义的可视化脚本符号计算只给答案不给「为什么这个 δ 够用」。用 numpy 把 ε 带和对应的 δ 画出来直观程度远超手画草图# epsilon_delta.py import numpy as np import matplotlib matplotlib.use(Agg) # 无图形界面环境下也能出图 import matplotlib.pyplot as plt eps 1e-3 xs np.linspace(-0.5, 0.5, 20001) ys np.sinc(xs / np.pi) # numpy 的 sinc 是 sin(pi x)/(pi x)此处等价于 sin(x)/x mask np.abs(ys - 1.0) eps delta np.abs(xs[mask]).max() # 满足 |f(x)-1|eps 的最大 |x| print(eps %g, delta ≈ %.6f % (eps, delta)) fig, ax plt.subplots(figsize(6, 4)) ax.plot(xs, ys, lw1, labelsin(x)/x) ax.axhspan(1 - eps, 1 eps, colororange, alpha0.3) ax.axvline(-delta, ls--, cr) ax.axvline(delta, ls--, cr) ax.set_xlim(-0.01, 0.01) ax.set_ylim(0.998, 1.0005) fig.savefig(epsilon_delta.png, dpi150)这段脚本做的是数值估计不是证明。它的价值在于把「对任意 ε 都存在 δ」这句话变成一张图缩小eps重跑几次看 δ 怎么随之变化就能体会 δ 是 ε 的函数而不是一个固定常数。2.4.1 四个高频坑第一个坑是符号域。Symbol(x)默认是复数sqrt(x**2)不会化简加realTrue、positiveTrue后结果才符合预期。第二个坑是浮点误差手算里的 1/3 要写成sp.Rational(1, 3)写成1/3会被 Python 先算成浮点数后面的化简和因式分解都可能失败。第三个坑是单侧极限涉及绝对值、取整、分段函数时忘记加dir双侧结果返回nan却以为是软件坏了。第四个坑是把nan和AccumBounds当成「极限不存在」的证明它们只是「sympy 没算出来」真正的判定仍要回到左右极限是否存在且相等。3. 一元微分导数定义、隐函数与分段点可导性的脚本化验证3.1 导数的定义式在 sympy 里怎么写才不会算错导数定义是差商的极限但直接在代码里写(f(xh)-f(x))/h再取极限很容易因为没化简而在h→0时得到nan。稳妥写法是先把差商化简再取极限# derivative_def.py import sympy as sp x sp.Symbol(x, realTrue) h sp.Symbol(h, realTrue) def derivative_by_definition(expr, var, point): quotient (expr.subs(var, point h) - expr.subs(var, point)) / h return sp.simplify(sp.limit(quotient, h, 0)) print(derivative_by_definition(x**2, x, 3)) # 6 print(derivative_by_definition(sp.sin(x), x, 0)) # 1 print(sp.diff(sp.sin(x) * sp.exp(x), x)) # exp(x)*(sin(x) cos(x))subs负责代入simplify负责约掉分子分母里公共的 hlimit最后把 h 推向 0。三步缺一不可省掉simplify时含 h 的分子分母同时趋零limit 会返回nan。sp.diff(expr, x)是求导的快捷入口和定义式的结果应当一致两套结果对不上时先怀疑定义式里的化简没做干净。3.2 隐函数与参数方程求导两种映射到代码的写法隐函数求导不需要解出 y直接用-F_x / F_yx, y sp.symbols(x y, realTrue) F x**2 y**2 - 1 # 单位圆求 dy/dx dydx -sp.diff(F, x) / sp.diff(F, y) print(sp.simplify(dydx)) # -x/y t sp.Symbol(t, realTrue) xt, yt sp.cos(t), sp.sin(t) # 参数方程 print(sp.simplify(sp.diff(yt, t) / sp.diff(xt, t))) # -cot(t)隐函数公式里F_y必须不为零代码上没法自动替你检查求完之后要手工补一句「在y≠0的区间成立」。参数方程的链式写法是dy/dx (dy/dt)/(dx/dt)分母dx/dt为零的点是曲线的奇点那里切线可能垂直或者不存在属于需要单独讨论的情况。3.3 分段点可导性判定的三步流程分段函数在分界点可不可导是考试里区分度最高的一类题也是零基础最容易含糊过去的地方。用代码把三步固定下来先算函数值再分别算左右导数最后比较。# piecewise_diff.py import sympy as sp x sp.Symbol(x, realTrue) h sp.Symbol(h, positiveTrue) # 只取正数天然表示单侧趋近 f sp.Piecewise((x**2, x 0), (x, x 0)) f0 f.subs(x, 0) right sp.limit((f.subs(x, h) - f0) / h, h, 0) # 右导数 left sp.limit((f.subs(x, -h) - f0) / (-h), h, 0) # 左导数 print(left , left, right , right) # 0 和 1不可导3.3.1 为什么用正数符号 h把h声明成positiveTrueh→0就等价于h→0写单侧极限时不用再折腾dir参数也不容易写错符号。计算左导数时自变量取-h分母也必须是-h两者保持同号否则左右导数会算反。这是手工推导也很容易出错的一步代码把它固定下来之后结论就稳定了。三个步骤对应三层判断分界点处函数值必须存在且有限左右导数必须各自存在两者必须相等。任何一层不满足结论都是不可导而不是「导数为零」。3.4 五类题型的练习顺序与求导法则对照表按难度排练习顺序建议是幂指对基本求导、四则与复合、隐函数、参数方程、高阶与分段点判定。前两类练到不用想后三类每类挑十道题全部用脚本对答案。求导法则手写形式sympy 写法乘积法则(uv) uv uvdiff(u*v, x)商法则(u/v) (uv - uv)/v²diff(u/v, x)链式法则dy/dx dy/du·du/dxdiff(f(u), x)u 需是 x 的表达式隐函数F_x F_y·y 0-diff(F,x)/diff(F,y)参数方程dy/dx (dy/dt)/(dx/dt)diff(y,t)/diff(x,t)常见误判有两种。一种是看到Abs(x)就以为原点是极小值所以导数存在实际上左右导数分别是 -1 和 1原点不可导。另一种是求完隐函数导数后忘了把y回代成x的表达式答案形式不统一被扣分。用simplify之后再用subs回代两步分开做方便定位是哪一步出的问题。4. 一元积分从黎曼和脚本到换元法的参数对照4.1 黎曼和用 numpy 把定积分算成面积定积分的定义是分割、近似、取极限。把这三步写成函数三种取点方式对应三种精度差异一眼可见# riemann.py import numpy as np def riemann(f, a, b, n, modemid): dx (b - a) / n if mode left: xs np.linspace(a, b, n, endpointFalse) # 取每个小区间的左端点 elif mode right: xs np.linspace(a, b, n 1)[1:] # 取右端点 else: xs np.linspace(a, b, n, endpointFalse) dx / 2 # 取中点误差最小 return dx * np.sum(f(xs)) for n in (10, 100, 1000, 10000): print(n, riemann(lambda x: np.sin(x), 0, np.pi, n))被积函数sin(x)在[0, π]上的积分值是 2。左端点法随 n 增大从上方逼近右端点法从下方逼近中点法收敛速度大约是前两者的平方量级n 取到 1000 时误差已经在 1e-6 附近。这段代码的意义在于让你亲手确认定积分是一个极限值不是一个近似值近似只是它的计算手段。4.2 sympy integrate 的三种调用形态与参数integrate的调用形态取决于你要的是不定积分、定积分还是广义积分# integrate_check.py import sympy as sp x sp.Symbol(x, positiveTrue) # positive 假设能避免很多分段讨论 print(sp.integrate(1 / x, x)) # 不定积分 - log(x) print(sp.integrate(x * sp.exp(-x), (x, 0, sp.oo))) # 广义积分 - 1 print(sp.integrate(sp.exp(-x**2), x)) # - sqrt(pi)*erf(x)/2 print(sp.integrate(sp.exp(-x**2), (x, -sp.oo, sp.oo))) # - sqrt(pi)参数形态的差别要记牢第二个参数是变量本身时求不定积分结果是函数族sympy 不会替你加常数 C第二个参数写成(x, a, b)时求定积分端点可以是sp.oo。positiveTrue的符号假设在积分里比在求导里更重要很多返回分段函数的结果加上假设之后会坍缩成一个简洁表达式。4.3 换元法与分部积分手工步骤怎么映射成代码换元法在代码里没有专门函数做法是手工把新变量表达式写出来验证它和原式一致x sp.Symbol(x, realTrue) expr x * sp.exp(x**2) print(sp.integrate(expr, x)) # exp(x**2)/2直接可积 # 手工换元u x^2, du 2x dx验证被积式等价 u sp.Symbol(u, realTrue) manual sp.integrate(sp.exp(u) / 2, u) # exp(u)/2 print(sp.simplify(manual.subs(u, x**2))) # exp(x**2)/2与上面一致分部积分同理∫u dv uv - ∫v du代码里先算u*v再算integrate(v*diff(u,x), x)两项相减。用代码复核的价值在于手算错的是符号还是系数两次结果一减就能看出来不用重头再推一遍。4.4 无初等原函数、奇点与数值验证的三条退路符号积分失败有三种典型信号处理方式各不相同。第一种是integrate原样返回Integral(...)说明原函数不在初等函数范围内例如exp(-x**2)。这时结果通常会以erf、Si、Ei这类特殊函数出现属于正常现象不是软件算不出来而是答案就该写成那样。第二种是奇点导致的发散print(sp.integrate(1 / x, (x, -1, 1))) # 跨过 x0 的奇点返回 nan 或保留未求值形式遇到这种情况先手动画出被积函数确认奇点位置再决定是拆区间还是改用柯西主值。第三种是符号结果太复杂转数值兜底from scipy.integrate import quad val, err quad(lambda t: np.exp(-t**2), -np.inf, np.inf) print(val, err) # 约 1.77245误差估计 1e-8 量级quad返回两个值第一个是积分近似值第二个是误差上界估计。误差量级不合理时比如 1e-2说明被积函数在积分区间上有尖锐峰或者振荡需要分段积分或者提高epsabs参数。符号解和数值解同时存在时用数值解对符号解做一次代入检验是性价比最高的一步。5. 级数与多元微分进阶把 .pdf 读薄成一张可复查的错题表5.1 泰勒展开与级数求和series 与 Summation 的用法一元部分的最后一站是级数判断收敛和求和方法杂但验证手段很直接import sympy as sp x sp.Symbol(x, realTrue) n sp.Symbol(n, integerTrue, positiveTrue) print(sp.series(sp.exp(x), x, 0, 6)) # 展开到 x^5末尾带 O(x^6) print(sp.summation(1 / n**2, (n, 1, sp.oo))) # pi^2/6 print(sp.summation(x**n, (n, 0, sp.oo))) # 1/(1-x)series的第三个参数是展开点第四个是阶数返回结果末尾的O(x**6)表示余项removeO()可以去掉它。summation的第二个参数是求和区间上界写sp.oo就是无穷级数。第二个例子里的x必须先声明为实数否则结果会带上收敛半径的分段讨论。级数判敛法比值、根值、比较、交错手算练的是选取方法而求和结果可以直接用summation核对。5.2 多元偏导与 Hessian用矩阵行列式判断极值多元部分最容易出错的是极值判定。把偏导方程组解出来只是第一步第二步要用 Hessian 矩阵x, y sp.symbols(x y, realTrue) f x**3 y**3 - 3*x*y H sp.hessian(f, (x, y)) # 二阶偏导矩阵 crits sp.solve([sp.diff(f, x), sp.diff(f, y)], (x, y), dictTrue) for p in crits: Hp H.subs(p) print(p, det , Hp.det()) # (0,0) det-9(1,1) det27判定规则是驻点处 Hessian 行列式小于零是鞍点大于零时再看对角线元素正的是极小值负的是极大值等于零则失效需要另找方法。这个例子里(0,0)的行列式为 -9是鞍点(1,1)为 27 且对角线为正是极小值。sp.solve的dictTrue让返回值是字典列表方便直接喂给subs。5.3 错题闭环LaTeX 笔记加间隔重复的最小配置学到这个阶段真正卡住你的不是新知识是重复犯的旧错误。做法很简单每道做错的题只记三列题目、错因、正确思路写成 UTF-8 的 CSV直接导入通用的间隔重复工具cat errors.csv EOF 题目,错因,正确思路 lim_{x\to 0} sin(1/x),误用无穷小乘有界,振荡无极限需取两列子列说明 \int_{-1}^{1} dx/x,忽略奇点直接套公式,区间跨过 x0必须拆区间或取主值 EOF题目列用行内 LaTeX 写例如\lim_{x\to 0}\frac{\sin x}{x}1重看时能直接渲染成公式比截图更容易搜索和修改。错因列强制自己写一句话写不出来说明还没找到问题所在这道题就该回到第 2 章或第 4 章重算。把第 2 到第 4 章的验证脚本串成一个总入口每周日跑一次python limit_check.py python derivative_def.py python piecewise_diff.py \ python integrate_check.py python riemann.py任何一条抛异常或者输出跟预期不符就回到对应章节重算那一节不要往后翻新内容。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价