💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
对工科学生来说,工程数学是一门绕不开的课程。特别是常微分方程(ODE,Ordinary Differential Equation),是电子电路分析、控制系统设计、机械振动解析等几乎所有工程领域的数学基础。本文将从 ODE 的基础概念到拉普拉斯变换,以工程应用例题为中心系统讲解。
微分方程是表示未知函数与其导数之间关系的方程。例如:
dxdy=2x,y′′+3y′+2y=0,∂t∂u=k∂x2∂2u
微分方程是对自然现象和工程系统进行数学建模的核心工具。
常微分方程(ODE):只包含对一个自变量的导数。
dt2d2x+2dtdx+x=0
偏微分方程(PDE):包含对两个及以上自变量的偏导数。
∂t∂u=c2∂x2∂2u
本文聚焦于 ODE。
阶数是方程中出现的最高阶导数的阶。
- 一阶 ODE:y′+y=x(最高阶导数为 y′)
- 二阶 ODE:y′′+2y′+y=0(最高阶导数为 y′′)
次数(degree)是最高阶导数的指数。在大多数工程问题中,次数为 1。
线性 ODE:未知函数及其导数只以一次项出现。
an(x)y(n)+an−1(x)y(n−1)+⋯+a1(x)y′+a0(x)y=f(x)
非线性 ODE:包含 y2、y⋅y′、sin(y) 等非线性项。
y′′+sin(y)=0(单摆方程)
- 通解:包含任意常数的完整解
- 特解:代入初始条件、确定常数之后得到的解
- 奇异解:无法从通解中得到的特别解
工程系统大多用 ODE 来描述。
RC 充电电路:
RCdtdv+v=Vs
弹簧-质量-阻尼器系统:
mx¨+cx˙+kx=F(t)
人口增长模型:
dtdP=kP
RL 电路:
Ldtdi+Ri=E(t)
以上全部都是 ODE,掌握其求解方法,就能够完整分析工程系统的动态行为。
形式:dxdy=f(x)g(y)
求解过程:
g(y)dy=f(x)dx
两边同时积分:
∫g(y)dy=∫f(x)dx+C
例题:RC 充电电路
电路方程:
dtdv=RCVs−v
分离变量:
Vs−vdv=RCdt
积分:
−ln∣Vs−v∣=RCt+C1
代入初始条件 v(0)=0:
Vs−v=Vse−t/(RC)
v(t)=Vs(1−e−t/(RC))
该结果表示 RC 电路的暂态响应(transient response)。电压以时间常数 τ=RC 决定的速度收敛到 Vs。
物理意义:
- 当 t=τ 时:v≈0.632Vs(充至 63.2%)
- 当 t=5τ 时:v≈0.993Vs(几乎完全充满)
线性一阶 ODE 的标准形:
dxdy+P(x)y=Q(x)
积分因子:μ(x)=e∫P(x)dx
推导过程:
两边同乘 μ(x):
μ(x)dxdy+μ(x)P(x)y=μ(x)Q(x)
左边由乘积求导法则可写成:
dxd[μ(x)y]=μ(x)Q(x)
积分后:
μ(x)y=∫μ(x)Q(x)dx+C
y=μ(x)1[∫μ(x)Q(x)dx+C]
例题:RL 电路
Ldtdi+Ri=E
化为标准形:
dtdi+LRi=LE
积分因子:μ(t)=e(R/L)t
dtd[e(R/L)t⋅i]=LEe(R/L)t
积分:
e(R/L)t⋅i=REe(R/L)t+C
代入初始条件 i(0)=0:
i(t)=RE(1−e−(R/L)t)
电流以时间常数 τ=L/R 收敛到稳态值 E/R。
形式:M(x,y)dx+N(x,y)dy=0
恰当条件:
∂y∂M=∂x∂N
若满足该条件,则存在使 F(x,y)=C 成立的势函数 F。
求解方法:
- 由 ∂x∂F=M,对 x 积分求出 F
- 用 ∂y∂F=N 这一条件确定积分常数
- 通解:F(x,y)=C
例题:
(2xy+y2)dx+(x2+2xy)dy=0
验证是否恰当:
∂y∂M=2x+2y=∂x∂N
是恰当方程,因此:
F=∫Mdx=∫(2xy+y2)dx=x2y+xy2+g(y)
由 ∂y∂F=x2+2xy+g′(y)=N=x2+2xy,得 g′(y)=0,g(y)=C
通解:x2y+xy2=C
形式:
dxdy+P(x)y=Q(x)yn(n=0,1)
换元:令 v=y1−n,即可化为线性 ODE。
由 v′=(1−n)y−ny′,将原方程两边除以 yn:
y−ndxdy+P(x)y1−n=Q(x)
1−n1dxdv+P(x)v=Q(x)
dxdv+(1−n)P(x)v=(1−n)Q(x)
这是关于 v 的线性一阶 ODE,可用积分因子法求解。
应用:逻辑斯蒂增长模型 dtdP=rP(1−KP) 就是 n=2 的伯努利方程。
标准形:
ay′′+by′+cy=0
特征方程的推导:代入 y=erx。
ar2erx+brerx+cerx=0
ar2+br+c=0
根据判别式 Δ=b2−4ac 的符号,会出现三种情形。
情形 1:两个不同实根(Δ>0)
若 r1=r2:
y=C1er1x+C2er2x
情形 2:重根(Δ=0)
若 r1=r2=r=−b/(2a):
y=(C1+C2x)erx
之所以要加上 C2xerx,是因为需要构造出另一个线性无关的解,使朗斯基行列式(Wronskian)不为零。
情形 3:共轭复根(Δ<0)
若 r=α±iβ(其中 α=−b/(2a),β=4ac−b2/(2a)):
y=eαx(C1cosβx+C2sinβx)
这是借助欧拉公式 eiβx=cosβx+isinβx,转换为实数解之后的形式。
电路方程(以电荷 q(t) 表示):
Ldt2d2q+Rdtdq+Cq=0
化为标准形:
q′′+LRq′+LC1q=0
特征方程:
r2+LRr+LC1=0
r=−2LR±(2LR)2−LC1
定义阻尼系数 α=R/(2L)、谐振频率 ω0=1/LC,则:
r=−α±α2−ω02
过阻尼(Overdamped):α>ω0(R>2L/C)
q(t)=C1er1t+C2er2t(r1,r2<0)
由两个指数项之和构成,没有振荡,单调递减。
临界阻尼(Critically Damped):α=ω0(R=2L/C)
q(t)=(C1+C2t)e−αt
没有振荡,以最快速度回到平衡状态。在控制系统设计中极为重要。
欠阻尼(Underdamped):α<ω0(R<2L/C)
定义衰减振荡频率 ωd=ω02−α2,则:
q(t)=e−αt(C1cosωdt+C2sinωdt)
一边振荡一边衰减。在通信电路、振动系统中很常见。
物理意义总结:
| 条件 | 名称 | 响应特性 |
|---|
| R>2L/C | 过阻尼 | 无振荡,缓慢衰减 |
| R=2L/C | 临界阻尼 | 无振荡,最快衰减 |
| R<2L/C | 欠阻尼 | 振荡衰减 |
| R=0 | 无阻尼 | 持续振荡 |
形式:
ay′′+by′+cy=f(x)
完全解:y=yh+yp
- yh:齐次方程的通解(余函数,complementary function)
- yp:特解(particular solution)
根据 f(x) 的形式,猜测 yp 的形式。
| f(x) 的形式 | yp 的猜测形式 |
|---|
| keax | Aeax |
| kxn | Anxn+⋯+A1x+A0 |
| kcosωx 或 ksinωx | Acosωx+Bsinωx |
| keaxcosωx | eax(Acosωx+Bsinωx) |
注意:若 yp 的猜测形式与 yh 中的项重合,需要乘以 x 来修正。
例题:y′′+4y=3cos2x
齐次解:yh=C1cos2x+C2sin2x
由于 yp 的猜测形式与 yh 重合,需要修正:
yp=x(Acos2x+Bsin2x)
代入后计算得:A=0,B=3/4
yp=43xsin2x
这是共振(resonance)现象,振幅随时间成正比增大。
受迫振动响应:
mx¨+cx˙+kx=F0cosωt
稳态特解:
xp(t)=(1−r2)2+(2ζr)2F0/kcos(ωt−ϕ)
其中频率比 r=ω/ωn,阻尼比 ζ=c/(2mk)。
在 r=1(共振条件)时振幅达到最大。
用于待定系数法无法适用的一般 f(x)。
已知 yh=C1y1+C2y2 时:
yp=−y1∫Wy2fdx+y2∫Wy1fdx
朗斯基行列式(Wronskian):W=y1y2′−y1′y2
该公式适用于任意连续函数 f(x)。
由 n 个一阶 ODE 组成的方程组:
dtdX=AX
其中 X=[x1,x2,…,xn]T,A 为 n×n 系数矩阵。
解的形式:X=veλt
代入后得:λv=Av
也就是说,λ 是 A 的特征值,v 是对应的特征向量。
特征方程:det(A−λI)=0
例题:两个相连的水箱系统
dtd(x1x2)=(−211−2)(x1x2)
特征方程:(λ+2)2−1=0
λ1=−1,λ2=−3
特征向量:v1=[1,1]T,v2=[1,−1]T
通解:
X=C1(11)e−t+C2(1−1)e−3t
带有两个回路的电路(基尔霍夫电压定律):
L1dtdi1+R1i1−Mdtdi2=E1(t)
L2dtdi2+R2i2−Mdtdi1=E2(t)
其中 M 为互感。将其整理为矩阵形式后,可用特征值法或拉普拉斯变换求解。
定义:
L{f(t)}=F(s)=∫0∞f(t)e−stdt
s=σ+jω 是复变量,积分要收敛,需要满足 Re(s)>σc(收敛域右侧边界)。
为什么要用拉普拉斯变换?
- 微分运算转化为代数运算
- 自动处理初始条件
- 把复杂的 ODE 变成简单的代数方程来求解
- 是传递函数(Transfer Function)概念的基础
| f(t) | F(s)=L{f(t)} |
|---|
| 1(单位阶跃) | s1 |
| t | s21 |
| tn | sn+1n! |
| eat | s−a1 |
| sinωt | s2+ω2ω |
| cosωt | s2+ω2s |
| eatsinωt | (s−a)2+ω2ω |
| eatcosωt | (s−a)2+ω2s−a |
| δ(t)(冲激函数) | 1 |
| u(t−a)(延迟阶跃) | se−as |
推导示例:L{eat}
L{eat}=∫0∞eate−stdt=∫0∞e−(s−a)tdt=[−(s−a)e−(s−a)t]0∞=s−a1
当 s>a 时收敛。
线性性:
L{af(t)+bg(t)}=aF(s)+bG(s)
时移(第一移位定理):
L{eatf(t)}=F(s−a)
频移(第二移位定理):
L{f(t−a)u(t−a)}=e−asF(s)
导数变换(最重要的性质):
L{f′(t)}=sF(s)−f(0)
L{f′′(t)}=s2F(s)−sf(0)−f′(0)
L{f(n)(t)}=snF(s)−sn−1f(0)−sn−2f′(0)−⋯−f(n−1)(0)
初始条件会在 s 域中被自动纳入。
积分变换:
L{∫0tf(τ)dτ}=sF(s)
卷积定理(Convolution Theorem):
L{(f∗g)(t)}=F(s)G(s)
其中 (f∗g)(t)=∫0tf(τ)g(t−τ)dτ
该定理从数学上证明了:系统的冲激响应与输入信号的卷积,就是系统的输出。
终值定理:
limt→∞f(t)=lims→0sF(s)
不必在 t 域求解,就能直接得到稳态值。
初值定理:
limt→0+f(t)=lims→∞sF(s)
部分分式分解(Partial Fraction Decomposition):
将 F(s)=P(s)/Q(s) 的分母因式分解,再拆解为变换表中各项之和。
情形 1:不同的实数极点
F(s)=(s−p1)(s−p2)⋯(s−pn)N(s)=s−p1A1+s−p2A2+⋯
Ak=lims→pk(s−pk)F(s)
情形 2:重极点(s=p 为 m 重根)
F(s)=⋯+(s−p)mAm+(s−p)m−1Am−1+⋯+s−pA1
Ak=(m−k)!1[dsm−kdm−k(s−p)mF(s)]s=p
情形 3:共轭复极点
s2+2αs+(α2+β2)As+B⇒e−αt(C1cosβt+C2sinβt)
亥维赛展开定理(Heaviside Expansion):
当分母是不同一次因式的乘积时:
F(s)=∑k=1nQ′(pk)N(pk)⋅s−pk1
例题:RLC 串联电路暂态响应
Ldt2d2i+Rdtdi+Ci=E0δ(t)
初始条件:i(0)=0,i′(0)=0(电容上无电荷)
求解:
两边应用拉普拉斯变换:
I(s)=s2+(R/L)s+1/(LC)E0/L
定义 α=R/(2L)、ω0=1/LC、ωd=ω02−α2(欠阻尼情形):
I(s)=(s+α)2+ωd2E0/L
拉普拉斯逆变换(查表:L{e−αtsinωdt}=ωd/[(s+α)2+ωd2]):
i(t)=LωdE0e−αtsinωdt
这就是 RLC 电路的冲激响应,同时也是它的格林函数。
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
def rlc_circuit(t, y, R, L, C, Vs):
q, dq_dt = y
d2q_dt2 = (Vs - R * dq_dt - q / C) / L
return [dq_dt, d2q_dt2]
R = 100
L = 0.1
C = 1e-6
Vs = 10.0
omega_0 = 1.0 / np.sqrt(L * C)
alpha = R / (2 * L)
zeta = alpha / omega_0
print(f"谐振频率: {omega_0/(2*np.pi):.1f} Hz")
print(f"阻尼比 zeta: {zeta:.3f}")
if zeta > 1:
print("-> 过阻尼")
elif zeta == 1:
print("-> 临界阻尼")
else:
print("-> 欠阻尼")
y0 = [0.0, 0.0]
t_span = (0, 0.01)
t_eval = np.linspace(0, 0.01, 2000)
sol = solve_ivp(
rlc_circuit, t_span, y0,
t_eval=t_eval,
args=(R, L, C, Vs),
method='RK45',
rtol=1e-8,
atol=1e-10
)
v_C = sol.y[0] / C
i = sol.y[1]
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
axes[0].plot(sol.t * 1e3, v_C, 'b-', linewidth=2, label='电容电压')
axes[0].axhline(y=Vs, color='r', linestyle='--', label=f'稳态 {Vs}V')
axes[0].set_xlabel('时间 (ms)')
axes[0].set_ylabel('电压 (V)')
axes[0].set_title('RLC 串联电路 - 阶跃响应')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[1].plot(sol.t * 1e3, i * 1e3, 'g-', linewidth=2, label='电流')
axes[1].set_xlabel('时间 (ms)')
axes[1].set_ylabel('电流 (mA)')
axes[1].set_title('RLC 电路电流')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('rlc_response.png', dpi=150)
plt.show()
import sympy as sp
t, s = sp.symbols('t s')
R_sym, L_sym, C_sym = sp.symbols('R L C', positive=True)
Vs_sym = sp.Symbol('Vs')
v = sp.Function('v')
tau = sp.Symbol('tau', positive=True)
ode = sp.Eq(v(t).diff(t), (Vs_sym - v(t)) / (R_sym * C_sym))
solution = sp.dsolve(ode, v(t), ics={v(0): 0})
print("RC 电路解:")
print(solution)
sp.pprint(solution)
f = sp.exp(-t) * sp.sin(2*t)
F = sp.laplace_transform(f, t, s, noconds=True)
print(f"\nL{{e^(-t) sin(2t)}} = {F}")
F_inv = sp.inverse_laplace_transform(
1 / (s**2 + 2*s + 5), s, t
)
print(f"L^(-1){{1/(s^2+2s+5)}} = {F_inv}")
import numpy as np
import matplotlib.pyplot as plt
def f(t, y):
return -y
def euler_method(f, t0, y0, h, n):
t = np.zeros(n+1)
y = np.zeros(n+1)
t[0], y[0] = t0, y0
for i in range(n):
y[i+1] = y[i] + h * f(t[i], y[i])
t[i+1] = t[i] + h
return t, y
def rk4_method(f, t0, y0, h, n):
t = np.zeros(n+1)
y = np.zeros(n+1)
t[0], y[0] = t0, y0
for i in range(n):
k1 = h * f(t[i], y[i])
k2 = h * f(t[i] + h/2, y[i] + k1/2)
k3 = h * f(t[i] + h/2, y[i] + k2/2)
k4 = h * f(t[i] + h, y[i] + k3)
y[i+1] = y[i] + (k1 + 2*k2 + 2*k3 + k4) / 6
t[i+1] = t[i] + h
return t, y
h = 0.5
n = 10
t0, y0 = 0.0, 1.0
t_euler, y_euler = euler_method(f, t0, y0, h, n)
t_rk4, y_rk4 = rk4_method(f, t0, y0, h, n)
t_exact = np.linspace(0, n*h, 200)
y_exact = np.exp(-t_exact)
plt.figure(figsize=(10, 5))
plt.plot(t_exact, y_exact, 'k-', linewidth=2, label='精确解')
plt.plot(t_euler, y_euler, 'r--o', label=f'欧拉法 (h={h})')
plt.plot(t_rk4, y_rk4, 'b--s', label=f'RK4 (h={h})')
plt.xlabel('t')
plt.ylabel("y(t)")
plt.title("欧拉法 vs RK4 比较: y' = -y")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
print(f"t=5时欧拉法误差: {abs(y_euler[-1] - np.exp(-5)):.6f}")
print(f"t=5时RK4误差: {abs(y_rk4[-1] - np.exp(-5)):.6f}")
import sympy as sp
s, t = sp.symbols('s t', real=True)
a, omega = sp.symbols('a omega', positive=True)
functions = {
'1': sp.Integer(1),
't': t,
't^2': t**2,
't^n': t**3,
'e^(at)': sp.exp(a*t),
'sin(wt)': sp.sin(omega*t),
'cos(wt)': sp.cos(omega*t),
't*e^(at)': t * sp.exp(a*t),
'e^(at)*sin(wt)': sp.exp(a*t) * sp.sin(omega*t),
}
print("拉普拉斯变换表:")
print("-" * 50)
for name, func in functions.items():
F = sp.laplace_transform(func, t, s, noconds=True)
print(f"L{{{name}}} = {sp.simplify(F)}")
问题:一个 R=50Ω、L=0.2H、C=100μF 的 RLC 串联电路,在 t=0 时接入 Vs=100V 的直流电源。初始条件为 vC(0)=0,i(0)=0。
用拉普拉斯变换求解:
基尔霍夫电压定律:
Ldtdi+Ri+C1∫idt=Vsu(t)
用 i=CdvC/dt 代换,整理为电荷 q 的方程:
Lq¨+Rq˙+Cq=Vs
拉普拉斯变换:
(Ls2+Rs+C1)Q(s)=sVs
Q(s)=s(Ls2+Rs+C1)Vs=s(s2+LRs+LC1)Vs/L
代入数值:α=R/(2L)=125s−1,ω0=1/LC≈223.6s−1
由于 ω0>α,属于欠阻尼。
ωd=ω02−α2≈185.0s−1
经部分分式分解后做拉普拉斯逆变换:
vC(t)=Vs[1−e−αt(cosωdt+ωdαsinωdt)]
=100[1−e−125t(cos185t+0.676sin185t)]V
问题:m=1kg,k=100N/m,c=4N⋅s/m,F(t)=10cosωtN
固有频率:ωn=k/m=10rad/s
阻尼比:ζ=c/(2mk)=0.2(欠阻尼)
稳态响应振幅:
X=(1−r2)2+(2ζr)2F0/k
当 r=ω/ωn=1(共振)时:
Xres=2ζF0/k=2×0.210/100=0.25m
是无共振时静态挠度 F0/k=0.1m 的 2.5 倍。这就是共振的危险之处。
本文涉及的内容:
- 微分方程基础:分类、阶数、线性性、解的种类
- 一阶 ODE 解法:变量分离法、积分因子法、恰当 ODE、伯努利方程
- 二阶线性 ODE:特征方程、三种情形、RLC 电路完整分析
- 非齐次方程:待定系数法、参数变易法、受迫振动
- 微分方程组:矩阵表示、特征值/特征向量解法
- 拉普拉斯变换:定义、变换对、性质、逆变换、求解 ODE
- Python 实现:用 scipy、sympy 求数值解与解析解
下一篇将讲解傅里叶级数/变换与偏微分方程(PDE)。这是信号处理与电磁学的核心数学工具。
- Kreyszig, E. "Advanced Engineering Mathematics", 10th Edition, Wiley
- Boyce, W. & DiPrima, R. "Elementary Differential Equations", 11th Edition, Wiley
- Simmons, G. "Differential Equations with Applications and Historical Notes", 3rd Edition
- SciPy ODE 求解器官方文档
- SymPy 拉普拉斯变换文档