
简介二阶线性微分方程的解法专题文档面向正在学习高等数学、常微分方程或备战考研数学的理工科学生也可供物理、工程领域需要回顾解析解法的读者查阅。内容从二阶常系数线性微分方程的概念入手区分齐次与非齐次形式讲解解的叠加性定理、线性相关与线性无关的判定以及由两个线性无关特解构造通解的方法重点展开特征方程 r²prq0 在相异实根、相等实根、共轭复根三种情形下的通解公式并示范用指数函数 e^{rx} 试探求解配以具体算例说明。资源包仅含 1 个 doc 文档约 552KB属于便于打印、批注与本地查阅的公式推导型资料。目前已有 180 人学习下载适合作为课堂笔记的补充帮助读者建立从概念到解题步骤的完整框架也便于期末复习与考研基础阶段快速查阅。1. 从一道工程题说起为什么要啃二阶常系数线性微分方程弹簧振子的阻尼振动、RLC 串联电路的暂态响应、悬臂梁的挠度曲线最后落到纸面上都是同一个式子y py qy f(x)。很多人第一次学的时候把它当成纯数学练习直到在建模时发现仿真结果和手算对不上才回头补这块。这份「二阶线性微分方程的解法.doc」讲义走的就是教科书里最正统的一条路线先给概念和线性相关/无关的判定再推特征方程用三种判别式分出通解形式最后处理非齐次项的两大类——指数乘多项式型与三角型。它不依赖数值求解器全部是解析解套路适合两类人一是正在准备考研数学、期末的在校生二是需要把物理/电路模型解析化、想搞清楚待定系数法每一步为什么这么设的工程从业者。本文按「齐次方程特征根分类 → 非齐次待定系数 → 综合例题与陷阱」的顺序重走一遍并把讲义里跳过的中间推导和常见误用点补上。2. 齐次方程 ypyqy0 的三种特征根情形与通解2.1 从叠加性到线性无关判断通解的合法性齐次方程的基础是解的叠加性讲义里的定理 1 说得很干净若 y1、y2 都是 y py qy 0 的解那么 C1y1 C2y2 也是解。这个证明只需要把组合式代入左端利用两个单解各自为零立刻得到零。真正决定「叠加出来的东西是不是通解」的是线性无关性——含有 C1、C2 两个任意常数但并不自动等价于通解。判定两个函数是否线性无关实操上有两种手段。一种是定义法找不全为零的 k1、k2 使 k1y1 k2y2 ≡ 0找得到就相关。另一种更好用看比值 y1/y2 是否为常数。讲义给的例子 x²、x、1 在任何区间都线性无关因为要让 k1x² k2x k3 恒为零必须三者全零。而 1、cos²x、sin²x 是相关的因为 cos²x sin²x − 1 0。提示判断通解成立与否一定要先确认两个特解的比值不是常数。很多人在复根情形直接用 e^{(αiβ)x} 和 e^{(α−iβ)x} 作为通解基底虽然形式上没错但含有复数常数最终还得转回实函数不如直接取 e^{αx}cosβx 与 e^{αx}sinβx。2.2 特征方程 r²prq0 的构造与判别式分类把 y e^{rx} 代入齐次方程。由于 e^{rx} 的任意阶导数都是自身乘 r 的幂代入后得到 e^{rx}(r² pr q) 0。e^{rx} 永远不为零所以求根问题完全落到代数方程 r² pr q 0 上这就是特征方程。判别式 Δ p² − 4q 的正负直接对应通解的三种形态。判别式特征根情形通解形式p² − 4q 0两个不同实根 r₁、r₂y C₁e^{r₁x} C₂e^{r₂x}p² − 4q 0二重实根 r −p/2y (C₁ C₂x)e^{rx}p² − 4q 0共轭复根 α ± iβy e^{αx}(C₁cosβx C₂sinβx)二重根情形讲义推得最详细的是设 y2 u(x)y1 后代入利用 r₁ 是二重根即 2r₁ p 0 且 r₁² pr₁ q 0把方程化简成 u e^{r₁x} 0因此 u 0取一次函数 u x 就得到第二个特解 xe^{r₁x}。复根情形则靠欧拉公式 e^{iβx} cosβx isinβx把两个复特解取线性组合得到两个实特解 e^{αx}cosβx 与 e^{αx}sinβx它们的比值 tanβx 不是常数故线性无关。2.3 用 Python 符号计算交叉验证特征根分类手算判别式容易在符号上出错用 SymPy 复核几秒钟的事尤其在初始条件求解特解时可以避免大量代数步骤。下面这段代码对讲义中的三个齐次例题做统一处理。import sympy as sp x sp.symbols(x) y sp.Function(y) C1, C2 sp.symbols(C1 C2) def solve_homogeneous(p, q): # 特征方程 r^2 p*r q 0 r sp.symbols(r) roots sp.solve(r**2 p*r q, r) return roots # 例1: y - 2y 5y 0, p-2, q5 print(例1 特征根:, solve_homogeneous(-2, 5)) # 例2: S 2S S 0, p2, q1 print(例2 特征根:, solve_homogeneous(2, 1)) # 例3: y - 2y - 3y 0, p-2, q-3 print(例3 特征根:, solve_homogeneous(-2, -3)) # 例1通解验证: 代入原方程应为0 sol1 sp.exp(x)*(C1*sp.cos(2*x) C2*sp.sin(2*x)) eq1 sp.diff(sol1, x, 2) - 2*sp.diff(sol1, x) 5*sol1 print(例1通解代入残差:, sp.simplify(eq1))sp.solve求的是特征方程的全部根返回列表例 1 会输出[1 - 2*I, 1 2*I]对应 α 1、β 2所以通解取 e^x(C1cos2x C2sin2x)。例 3 返回[-1, 3]两个不等实根通解即 C₁e^{−x} C₂e^{3x}。最后一步把假设通解代回原方程残差化简后应为零这是验证通解是否正确最省事的方式比逐项对比系数保险得多。2.4 初始条件确定 C₁、C₂ 的完整流程例 2 是标准的初值问题S 2S S 0S(0) 4S(0) −2。特征根为二重根 r −1通解 S (C₁ C₂t)e^{−t}。代入 S(0) 4 得 C₁ 4求导 S (C₂ − C₁ − C₂t)e^{−t}代入 S(0) −2 得 C₂ − 4 −2即 C₂ 2。所以特解是 S (4 2t)e^{−t}。用代码把这套流程自动化只要把初始条件作为字典传入即可import sympy as sp t sp.symbols(t) C1, C2 sp.symbols(C1 C2) S (C1 C2*t)*sp.exp(-t) # 二重根通解形式 eq1 sp.Eq(S.subs(t, 0), 4) # 初始值条件 eq2 sp.Eq(sp.diff(S, t).subs(t, 0), -2) # 初始导数条件 sol sp.solve([eq1, eq2], [C1, C2]) print(C1, C2 , sol) print(特解 S(t) , sp.simplify(S.subs(sol)))S.subs(t, 0)做的是代入求值sp.diff(S, t)求导后再代入 0 就得到初值条件方程。sp.solve解出 C₁ 4、C₂ 2代入通解即为特解。如果方程是无阻尼形式、初值给在导数上不兼容solve会返回空列表或报错这时应该回头检查判别式分类选得对不对。3. 非齐次项 f(x)e^{λx}P_m(x) 的待定系数法与 k 值选取3.1 解的构造定理与右端项拆分非齐次通解的结构是 y Y y*其中 Y 是对应齐次方程的通解y* 是非齐次方程的一个特解。讲义里的定理 3 直接给了结论证明只需把 Y y* 代入左端利用 Y 满足齐次方程、y* 满足非齐次方程两条性质即可左端自动等于 f(x)。这一定理意味着求解非齐次方程永远分两步先解齐次再找一个特解。定理 4 处理的是右端项可拆的情形。若 f(x) f₁(x) f₂(x)且 y₁* 是 y py qy f₁(x) 的解、y₂* 是 y py qy f₂(x) 的解那么 y₁* y₂* 是原方程的特解。讲义例 7 的右端是 e^x sinx正是靠这条定理拆成两个独立小问题分别求解再相加。3.2 特解形式 x^k e^{λx}Q_m(x) 中 k 的取值规则当 f(x) e^{λx}P_m(x)P_m 为 m 次多项式时特解可设为 y* x^k e^{λx}Q_m(x)其中 Q_m 是与 P_m 同次的待定多项式指数 k 只取决于 λ 与特征根的关系λ 与特征方程的关系k 的取值理由λ 不是特征根k 0代入后 Q_m 的系数矩阵可逆可直接定出λ 是单根k 1直接设 Q_m 会使 λ²pλq 0 导致最高次项消失需乘 xλ 是二重根k 2一阶修正仍不够需乘 x² 才能让同次幂系数可比讲义例 4 中 y y − 2y 3e^{−2x}λ −2 是特征方程 r² r − 2 0 的单根另一个根为 1所以 k 1设 y* b₀xe^{−2x}代入后解得 b₀ −3/2特解为 −(3/2)xe^{−2x}。例 5 中 y − 2y y (x1)e^x 的 λ 1 恰好是二重根k 2设 y* x²(ax b)e^x代入后比较系数解得 a 1/6、b −1/2特解为 (x³/6 − x²/2)e^x。import sympy as sp x sp.symbols(x) a, b sp.symbols(a b) # 例5: 非齐次项 (x1)e^x, λ1 是特征方程 r^2-2r10 的二重根 y_trial x**2 * (a*x b) * sp.exp(x) lhs sp.diff(y_trial, x, 2) - 2*sp.diff(y_trial, x) y_trial # 两边约去 e^x, 按 x 同次幂比较系数 residual sp.expand(lhs - (x 1)*sp.exp(x)) coeffs sp.Poly(residual / sp.exp(x), x).all_coeffs() sol sp.solve(coeffs, [a, b]) print(待定系数:, sol)all_coeffs()返回按降幂排列的系数列表sp.solve对每个系数置零求解。比手算稳妥的地方在于如果 k 取值不对residual里最高次幂的系数会无法消掉求解会得到矛盾方程组这本身就是判断 k 是否需要加一的机械检验法。3.3 常见误用漏乘 x 与多项式次数设低待定系数法最常见的两个错一是 k 忘记升次。比如 λ 是单根却仍取 k 0代入后多项式前系数项被特征方程的零根消掉穷尽所有 a、b 也匹配不上最后被迫解出矛盾的常数等于零。二是把 Q_m 的次数设得比 P_m 低。例 5 中 P_m x 1 是一次多项式Q_m 必须写成 ax b 才够用只设常数 a 一定会失败。稳妥的流程是固定一套模板——先读 P_m 次数 m写出完整的 m 次多项式再判 k最后代入比较系数——三步都不要跳过。4. 三角型右端项 f(x)AcosωxBsinωx 与实根判别式协同求解4.1 特解形式 x^k(acosωxbsinωx) 的确定当非齐次项是 Acosωx Bsinωx 时三角函数求导仍封闭在自身空间内所以特解形式可以直接照搬同类结构y* x^k(acosωx bsinωx)。这里 k 依然看 ωi 是否为特征方程的根如果 ωi 不是根k 0如果是等价于 p² − 4q 0 且 β ωk 取 1。讲义例 6 的方程 y − 2y 3y sin4x特征方程 r² − 2r 3 0 的根是 1 ± √2 iβ √2而 ω 4两者不同因此 ωi 4i 不是特征根k 0设 y* acos4x bsin4x。代入原方程得到一组二元一次方程−13a 8b 0、−8a − 13b 1解得 a −8/233、b −13/233。这个系数看着不整齐但它是解析解数值积分能做到的精度完全可以用它来校验。4.2 用线性方程组求解待定系数并回代验证三角型待定系数法的关键是把 cosωx 和 sinωx 视为两个线性无关的函数最终必然整理成关于 a、b 的二元线性方程组。下面给出例 6 的完整符号计算和回代检查。import sympy as sp x, a, b sp.symbols(x a b) y_trial a*sp.cos(4*x) b*sp.sin(4*x) lhs sp.diff(y_trial, x, 2) - 2*sp.diff(y_trial, x) 3*y_trial residual sp.expand(lhs - sp.sin(4*x)) # 分别提取 cos(4x) 与 sin(4x) 的系数 cos_c sp.expand(residual).coeff(sp.cos(4*x)) sin_c sp.expand(residual).coeff(sp.sin(4*x)) sol sp.solve([cos_c, sin_c], [a, b]) print(待定系数 a,b , sol) y_star y_trial.subs(sol) check sp.simplify(sp.diff(y_star, x, 2) - 2*sp.diff(y_star, x) 3*y_star) print(回代残差 , check)coeff(sp.cos(4*x))的作用是把含 cos4x 的全部项系数单独取出coeff(sp.sin(4*x))同理。这种做法比人眼逐个比对可靠尤其当 ω 与 β 接近时系数会有小数值更容易算错。回代后的残差应当化简为 sin4x与右端项一致若得到 cos4x 残留说明 a、b 的方程组少列了一个。4.3 复根情形与非齐次项叠加的综合处理讲义例 7 是综合性最强的一道y − 2y − 3y e^x sinx。对应齐次特征根为 r₁ 3、r₂ −1齐次通解 Y C₁e^{3x} C₂e^{−x}。右端拆成 e^x 和 sinx 两部分。对 e^xλ 1 不是特征根k 0设 y₁* ae^x对 sinxωi i 也不是特征根特征根是实数k 0设 y₂* bcosx csinx。分别代入并比较系数可得 a −1/4、b 1/10、c 1/5最终通解为 y C₁e^{3x} C₂e^{−x} − e^x/4 cosx/10 sinx/5。这一题的价值在于把所有判别分支都过了一遍齐次用两个不等实根公式非齐次项用定理 4 拆成两类分别设形式再各用一次系数比较。考试或工程建模中右端项往往不是一个干净单项学会拆分是能否把解析解走完的分水岭。5. 验证与提速技巧用数值解反向校核解析通解解析解算完不算结束至少在两组测试点上用数值方法回放一遍是防止系数算错最省事的办法。SciPy 的solve_ivp可以直接把二阶方程化成一阶方程组来积分然后与手算特解逐点比对。以例 2 的初值问题 S 2S S 0、S(0) 4、S(0) −2 为例解析特解为 S (4 2t)e^{−t}。时间 t解析解 S(t)数值解误差量级0.04.000000.53.03271e-9 以下1.01.83941e-9 以下2.00.54131e-8 以下import numpy as np from scipy.integrate import solve_ivp def rhs(t, state): S, dS state # S -2S - S, 化为一阶方程组 return [dS, -2*dS - S] sol solve_ivp(rhs, [0, 3], [4.0, -2.0], t_evalnp.linspace(0, 3, 7), rtol1e-10, atol1e-12) def S_exact(t): return (4 2*t)*np.exp(-t) for t, s in zip(sol.t, sol.y[0]): print(ft{t:.2f} 数值{s:.8f} 解析{S_exact(t):.8f})rhs里把二阶方程写成 [dS, S] 的一阶形式solve_ivp的rtol/atol调到很紧保证数值解接近机器精度。逐点比对时若某个时刻偏差明显大于表中量级往往是解析解系数 C₁、C₂ 设错而不是数值方法有问题。另一个技巧是把通解代回原方程的残差作为通用判据齐次方程残差应恒为零非齐次方程残差应恰等于 f(x)用 SymPy 的simplify一键完成比逐项对照省时得多。本文还有配套的精品资源点击获取