ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

微积分预备:多项式与有理函数的化简、定义域及Python验证

微积分预备:多项式与有理函数的化简、定义域及Python验证 微积分很多人刚接触时第一反应是去背导数表、记积分公式结果一上手练习就卡在化简这一步。尤其是当题目里出现分式、零点、公因式相消这一类结构时真正拦住你的往往不是极限概念本身而是初等代数里那些“以为会了、其实没吃透”的部分。多项式和有理函数就是微积分预备中最重要、也最容易被低估的一块地基。这篇文章想说的核心判断很直接微积分能不能学得顺取决于你能不能快速判断一个表达式的结构而不是能不能盲目套公式。只有清楚多项式的次数、零点、因式与有理函数定义域之间的关系你在求极限、求导和积分时才能一眼看出哪个因子可以约掉、哪个点会导致分母为零、哪个函数该用部分分式处理。读完这篇文章你至少能解决四件事一是理解多项式的代数结构二是掌握有理函数的化简规则三是避开“约分导致定义域丢失”这类的经典误区四是会用 Python 做符号验证和可视化检查。这是《微积分预备》系列第二讲关于多项式与有理函数的上半部分下一讲会继续围绕函数性质与极限展开。1. 为什么先补多项式与有理函数再学微积分很多教材会把多项式当成“已知内容”一笔带过但真正进入微积分后你会发现多项式与有理函数贯穿了几乎所有计算环节。先看极限。初学者最常见的困境是当 (x \to a) 时分子分母都趋向 0得到一个 (\frac{0}{0}) 形式。这时候不能直接代值需要把分子和分母的多项式都做因式分解然后约去公因式。比如[ \lim_{x \to 1} \frac{x^2 - 1}{x - 1} ]分母在 (x1) 处为零直接代入没有意义。把分子分解成 ((x-1)(x1)) 之后约掉 (x-1)极限值就变得非常清晰。这个步骤看起来简单但背后要求你对二次三项式分解非常熟练。再看导数。用定义求导时(f(xh)-f(x)) 这一项通常可以整理成多项式然后除以 (h)。如果分子展开错误、缺项漏项后面的极限必然跟着错。积分更是如此有理函数的积分几乎都依赖“部分分式分解”而分解的前提是能把分母做完整因式分解并且能判断分子分母的次数关系。除了微积分本身多项式和有理函数在工程计算中也非常常见。控制系统里的传递函数、信号处理中的频率响应、数值分析中的插值与逼近本质上都在处理有理函数结构。所以这一块不是“考试专用”是后续大量应用的共同基础。2. 多项式的基本概念次数、首项系数与零点先给出正式定义。形如[ P(x) a_n x^n a_{n-1} x^{n-1} \cdots a_1 x a_0 ]的表达式叫作关于 (x) 的一元多项式其中 (a_n \neq 0)。这里有几个判断表达式的关键概念。第一是次数。上面这个多项式的次数是 (n)记作 (\deg P n)。次数决定了函数在 (x \to \pm \infty) 时的增长趋势。一次函数是直线二次函数是抛物线三次以上的函数形态更复杂但“次数最高项”主导了远端的走向。第二是首项系数。(a_n) 叫作首项系数。当 (x \to \infty) 时如果 (a_n 0)那么 (P(x) \to \infty)如果 (a_n 0)那么 (P(x) \to -\infty)。判断极限时首项系数和次数一起决定了有理函数在无穷远处的行为。第三是零点。如果 (P(r)0)就说 (r) 是多项式的一个零点也叫根。代数学基本定理告诉我们复系数 (n) 次多项式一定有 (n) 个复根但如果只讨论实数根和实数因式情况会复杂一些。因式分解和零点本质上是一回事(r) 是 (P(x)) 的零点当且仅当 (x-r) 是 (P(x)) 的因式。这个等价关系是后面化简有理函数的钥匙。比如 (x^2 - 5x 6) 的零点是 2 和 3因此可以写成 ((x-2)(x-3))。还有一个容易混淆的概念是重根。如果 ((x-r)^k) 能整除 (P(x))但 ((x-r)^{k1}) 不能就说 (r) 是 (k) 重根。函数图像上单根处曲线会穿过 x 轴二重根处曲线只是与 x 轴相切但不穿过。这个信息在画图、判断符号变化时非常有用。3. 有理函数的核心分母不能为零有理函数是两个多项式的比值[ R(x) \frac{P(x)}{Q(x)} ]其中 (P(x)) 和 (Q(x)) 都是多项式且 (Q(x)) 不是零多项式。理解有理函数最重要的不是背诵公式而是养成“看到分母就先找零点”的条件反射。为什么因为分母为零时函数在该点没有定义。比如[ R(x) \frac{x^2 1}{x^2 - 4} ]分母可以分解为 ((x-2)(x2))所以 (x2) 和 (x-2) 都不在定义域内。函数图像在靠近这两个点时要么趋向正无穷要么趋向负无穷这就是垂直渐近线。这里有一个特别容易踩坑的点约分前后定义域是否一致。看这个例子[ R(x) \frac{(x-2)(x1)}{x-2} ]如果直接约掉 (x-2)会得到 (x1)。但如果画图就会发现原函数在 (x2) 处没有定义而 (x1) 在 (x2) 处有函数值 3。问题的根源在于约分时不能改变函数的定义域。很多教材会把这种情况叫作“可去间断点”在微积分里是一个重要的分类。处理极限时我们允许“在充分接近但不等于 2 的点上”研究函数所以极限可以存在但严格来说函数在 (x2) 这一点仍然没有定义。练习中如果忽略这一点后面的连续性判断和导数定义都会出问题。有理函数还分真分式和假分式。当分子的次数小于分母的次数也就是 (\deg P \deg Q) 时叫真分式否则叫假分式。处理假分式时先做多项式长除法把它改写成一个多项式加上一个真分式这个思路在积分时特别重要。部分分式分解一般只针对真分式如果跳过除法直接分解很容易得到错误结果。4. 化简有理函数的完整流程一个比较系统的化简流程可以按下面四步走。建议每次拿到有理函数题目都先按这个顺序检查一遍能有效减少低级失误。4.1 先比较分子分母的次数先判断 (\deg P) 和 (\deg Q) 的大小关系。如果分子的次数大于等于分母的次数先做多项式除法得到一个多项式和一个余式再把余式作为新的真分式继续处理。如果不先做这一步部分分式分解会遇到“如何拆分多项式部分”的困难。一个快速判断方法当 (|x|) 很大时函数大致行为由首项决定。如果 (\deg P \deg Q)函数会趋向无穷大可能还有斜渐近线如果 (\deg P \deg Q)函数在无穷远处趋向一个非零常数如果 (\deg P \deg Q)函数在无穷远处趋向 0。这个判断对画图、求极限都有帮助。4.2 因式分解分母与分子化简的核心是把分子分母分别做因式分解。常用方法包括提取公因式、平方差公式、完全平方公式、十字相乘以及更高阶的试根法。如果遇到三次或更高次的多项式可以先试有理根。假设多项式的系数都是整数那么任意有理根 (p/q) 的分子 (p) 必须能整除常数项分母 (q) 必须能整除首项系数。这个“有理根定理”可以大幅缩小试根范围。比如 (P(x) x^3 - 2x^2 - 5x 6)常数项是 6候选有理根是 (\pm 1, \pm 2, \pm 3, \pm 6)。代入 (x1) 时 (P(1)0)所以 (x-1) 是因子。除完之后得到二次式再继续分解最终得到[ x^3 - 2x^2 - 5x 6 (x-1)(x2)(x-3) ]这个例子的每一步都很标准建议手算一遍复合除法的过程会比直接展开更加清楚。4.3 约去公因式但要盯住定义域找出分子和分母的公因式后可以约分。例如[ \frac{x^2 - 4x 3}{x^2 - 2x - 3} \frac{(x-1)(x-3)}{(x1)(x-3)} ]分子分母都有 (x-3)约分后得到[ \frac{x-1}{x1} ]但必须注意原式在 (x3) 处无定义而化简后的式子有定义。严格表达时应该注明 (x \neq 3)同时也要注明 (x \neq -1)。很多考试丢分或工程调试出错都是因为只化简不写约束条件。4.4 如果后续要积分再考虑部分分式分解有理函数积分是微积分里的重点比如求[ \int \frac{x1}{x^2 - 5x 6} dx ]需要先把被积函数分解为[ \frac{x1}{(x-2)(x-3)} \frac{-3}{x-2} \frac{4}{x-3} ]然后每一项都能直接积分成对数。部分分式分解的系数求解通常用待定系数法或者赋值法。如果分母含有不可约二次式最终会出现反正切形式。这个内容虽然偏积分但现在提前理解分解原则后面会省很多力气。5. 环境准备与前置条件这一节给想动手练习的读者不需要复杂环境一个能运行 Python 的终端就能完成验证。推荐用 Python 3 配合 SymPy 和 Matplotlib 两个库一个做符号推导一个做函数图像检验。安装命令如下pip install sympy matplotlib numpy如果你的网络环境不方便安装也可以用在线工具比如 WolframAlpha、Desmos 或者 Symbolab。但建议至少把 SymPy 装好因为符号计算能够直接检验因式分解、约分和部分分式的结果是否和手算一致。前置条件是基础的中学代数能力包括整式加减乘除、因式分解、解一元二次方程。如果你已经能熟练完成 ((x2)(x-3)) 展开和 (x^2 - x - 6) 分解那么这一节的代码只是辅助验证不会成为新的学习负担。6. 用 Python 做符号验证与可视化接下来用一个完整示例演示如何定义多项式、模拟长除法、化简有理函数和绘制图像。代码可以直接复制到本地运行。6.1 用 SymPy 定义多项式并做因式分解import sympy as sp x sp.symbols(x) P x**3 - 2*x**2 - 5*x 6 Q x**2 - 4*x 3 print(P 展开结果:, sp.expand(P)) print(P 因式分解:, sp.factor(P)) print(Q 因式分解:, sp.factor(Q)) print(P/Q 约分结果:, sp.cancel(P / Q)) print(P 除以 Q 的商和余式:, sp.div(P, Q))运行结果从数学上看很直观(P) 分解为 ((x-1)(x2)(x-3))(Q) 分解为 ((x-1)(x-3))因此 (P/Q) 约分后得到 (x2)。但这里要再次强调sp.cancel给出的结果是“代数式约分后的结果”它不代表原函数定义域和约分后的定义域完全一致。在 (x1) 和 (x3) 这两个点上原式是无定义的而 (x2) 有定义。符号计算工具不会主动提醒你定义域的区别这个判断必须由你自己完成。6.2 手动实现多项式长除法SymPy 的sp.div可以直接得到商和余式但为了理解原理这里给出一个基于系数数组的实现。数组的索引表示 (x) 的次数索引 0 对应常数项索引 1 对应一次项以此类推。def poly_long_div(dividend, divisor): 多项式长除法 :param dividend: 被除式系数从低次到高次排列 :param divisor: 除式系数从低次到高次排列 :return: 商系数列表、余式系数列表 A [float(c) for c in dividend] B [float(c) for c in divisor] if len(B) 0 or all(c 0 for c in B): raise ValueError(除式不能为零多项式) q [0.0] * (len(A) - len(B) 1) while len(A) len(B) and any(abs(c) 1e-12 for c in A): shift len(A) - len(B) coef A[-1] / B[-1] q[shift] coef for i in range(len(B)): A[shift i] - coef * B[i] while A and abs(A[-1]) 1e-12: A.pop() return q, A # 用 P x^3 - 2x^2 - 5x 6除以 x - 1 dividend [6, -5, -2, 1] # 6 - 5x - 2x^2 x^3 divisor [-1, 1] # -1 x q, r poly_long_div(dividend, divisor) print(商:, q) print(余式:, r)这段代码模拟的就是手算长除法的过程每次取被除式的最高次项除以除式最高次项得到商的一项然后用这项乘以整个除式从被除式中减去最后删掉已经归零的最高次项继续下一轮。执行之后商是[-6.0, -1.0, 1.0]对应 (-6 - x x^2)也就是 (x^2 - x - 6)余式是空列表表示整除。为了验证可以再把除式和商乘回来检查结果。6.3 有理函数的部分分式分解接下来用 SymPy 演示部分分式分解这是后面积分最重要的应用场景。以[ \frac{x1}{x^2 - 5x 6} ]为例import sympy as sp x sp.symbols(x) R (x 1) / (x**2 - 5*x 6) print(原式:, R) print(分母因式分解:, sp.factor(x**2 - 5*x 6)) print(部分分式分解:, sp.apart(R, x))sp.apart会把有理函数拆成若干个简单分式的和。运行后应该能看到分母被分解为 ((x-2)(x-3))原式被拆成两个一次分式的和。这个结果和手算的待定系数法一致可以作为课后练习的答案校验工具。6.4 绘制有理函数图像图像能帮你快速理解函数的渐近线和定义域。用 Matplotlib 绘制 (R(x)\frac{x1}{(x-2)(x-3)})重点关注分母为零的位置。import numpy as np import matplotlib.pyplot as plt x_vals np.linspace(-8, 8, 1000) y_vals (x_vals 1) / ((x_vals - 2) * (x_vals - 3)) # 将绝对值过大的点置为空避免图像炸掉 y_vals np.where(np.abs(y_vals) 20, np.nan, y_vals) plt.figure(figsize(10, 6)) plt.plot(x_vals, y_vals, linewidth1.6) plt.axhline(0, colorblack, linewidth0.8) plt.axvline(2, colorred, linestyle--, linewidth1.2, labelx2) plt.axvline(3, colorred, linestyle--, linewidth1.2, labelx3) plt.ylim(-20, 20) plt.xlabel(x) plt.ylabel(R(x)) plt.title(R(x) (x1) / ((x-2)(x-3))) plt.legend() plt.grid(True, alpha0.3) plt.show()运行这段代码后你会看到图像在 (x2) 和 (x3) 附近被分成三段函数值趋向正无穷或负无穷这就是垂直渐近线的直观体现。把图像和代数表达式对照着看比单纯背“分母为零就是渐近线”结论更有效。7. 运行结果与效果验证上面的代码运行后主要验证以下结果。第一个是 SymPy 因式分解。应输出P 因式分解: (x - 3)*(x - 1)*(x 2) Q 因式分解: (x - 3)*(x - 1) P/Q 约分结果: x 2 P 除以 Q 的商和余式: (x 2, 0)这个输出的含义是约分后为 (x2)但原式在 (x1) 和 (x3) 处无定义。你可以用一个简单方法验证把 (x3) 代入原式会报除零错误代入 (x2) 则得到 5。第二个是自定义长除法输出商: [-6.0, -1.0, 1.0] 余式: []对应商为 (x^2 - x - 6)余式为 0。验证方法是把q和divisor乘回[ (x-1)(x^2 - x - 6) x^3 - 2x^2 - 5x 6 ]如果余式不是空列表说明原多项式不能被整除这一点在求斜渐近线和分解假分式时需要特别注意。第三个是部分分式分解。apart的输出应该等于手算结果。验证方法是取一些具体数值把分解后的表达式相加再化简看是否等于原式。比如取 (x0)原式是 (1/6)右侧两个分式相加也必须是 (1/6)。如果运行失败优先检查依赖是否安装完整其次检查代码中是否有变量名冲突。SymPy 和 Numpy 都定义了x或np时容易互相干扰建议在不同的脚本中分开运行。8. 常见问题与排查方法这一节列几个实际练习中最常遇到的问题每一条都是真实会发生的错误不是理论假设。问题现象可能原因排查方式解决方案约分后画图和原函数图像不一致约分时丢失了分母零点处的定义域对比原函数和约分函数在零点处的值在化简结果旁标注排除点写清楚 (x) 不能取哪些值长除法中途报错或商明显不对多项式缺项没有补零检查系数列表是否从低次到高次完整排列缺项时用 0 占位例如 (x^3 2) 写成[2, 0, 0, 1]部分分式分解结果与答案不一致没有先判断是否为真分式比较分子分母次数假分式先做多项式除法再对余式做分解求解待定系数时出现矛盾方程分解形式设错检查分母因式是否完全分解确保每个不可约二次式和重因式都有对应项sp.apart结果包含多项式部分原函数是假分式观察输出中是否出现x一项这不是错误是 SymPy 自动先做了法要理解步骤绘图时图像出现异常竖线Numpy 在分母零点处产生极大值检查是否设置了合理 y 轴范围使用np.where过滤异常值这里特别想强调“约分丢失定义域”这个坑。很多人在初中时就学会了约分但到了微积分阶段这个习惯会带来连续性判断错误。比如 (f(x) \frac{x^2-1}{x-1})约分后是 (x1)但如果直接说“这就是一条直线”就忽略了它在 (x1) 处无定义的事实。微积分里这是一个可去间断点你可以把它补成连续函数但必须先意识到这里有一个缺失点。另一个容易忽略的问题是用计算工具验证时的精度误差。自定义长除法用了浮点数如果系数很大或者根很接近因为浮点误差可能把余式误判为非零。建议在比较是否为零时保留一定容差而不是用直接比较。9. 最佳实践与工程建议多项式与有理函数看似是纯数学内容但实际写代码、搭模型时同样有工程意义。第一在数值计算中对多项式求值优先考虑霍纳法。直接把 (a_n x^n \cdots a_0) 一项项算不仅代码啰嗦还容易放大浮点误差。霍纳法通过嵌套乘法减少运算次数表达式如下[ P(x) (((a_n x a_{n-1})x a_{n-2})x \cdots )x a_0 ]这个写法在数值稳定性上优于直接求和尤其是 (x) 绝对值很大的时候。第二用 Python 做符号计算时不要把sympy.simplify的结果直接当成“完全等价”。符号计算工具默认关注代数化简不会自动保留定义域约束。工程上建议自己在代码里记录有效范围甚至可以在函数注释里注明约分前的限制条件def rational_function(x): # 原函数在 x 1 和 x 3 处无定义 # 这里只处理 x 不属于 {1, 3} 的输入 return x 2这样做的好处是函数调用者不会踩坑。第三把“分母因式分解”当作一套固定流程来练。建议按以下顺序检查提取所有公因式。检查是否有平方差、完全平方、十字相乘。三次以上多项式用有理根定理试根。判断是否还有不可约二次式。第四在机器学习里做多项式特征时要控制次数。很多初学者喜欢用高次多项式去拟合训练数据结果在测试集上表现很差这是因为高次多项式容易过度拟合。多项式特征可以用来捕捉非线性但不能盲目加次数。第五微积分计算中养成“先判断结构再动笔计算”的习惯。看到有理函数先回答三个问题分子分母次数谁高分母有哪些零点有没有公因式可约这三个问题回答完一半的题目已经有思路了。10. 总结与后续学习方向这一讲的核心可以压缩成三句话。第一多项式是描述很多自然过程的代数骨架次数和零点决定了它的基本行为。第二有理函数是多项式的比值分母零点决定了定义域边界也是求极限和积分时最先要关注的敏感点。第三约分改变的是表达式形式不能改变原函数的定义域这个细节在连续性讨论中极其重要。建议你现在就动手做一组练习找三个二次多项式做分子三个二次多项式做分母分别完成因式分解、约分、判断定义域和用 Python 绘制图像。整个过程不用花太多时间但比单纯看书更容易建立直观感觉。下一讲会继续讨论指数函数、对数函数与三角函数的预备知识这些函数与多项式不同它们的增长速度和周期性会带来新的极限行为和积分技巧。如果多项式与有理函数这一部分的基础打得足够扎实进入极限与导数时会顺利很多。建议先把这篇文章里的代码跑通再把几个典型案例手算一遍然后继续往下推进。
返回列表