Appearance
数学模型:微分方程与传递函数
概念
上一章讲清了"闭环为什么有用",但那张方块图里的每个框还只是一个字母 G。要算稳态误差、要判稳定性,就必须把每个框写成可以运算的式子。
物理系统天生是微分方程——电容的电流由电压的变化率决定、质量的速度由力的积分决定。微分方程能做加减乘除吗?不能。所以控制理论做了一件事:
用拉普拉斯变换把微分方程变成代数方程,把"解微分方程"变成"算分式"。
一句话说清它是什么:传递函数就是"零初始条件下,输出与输入的拉普拉斯变换之比"——它把整个系统的动态特性压缩成一个有理分式。
text
物理系统 --(物理定律)--> 微分方程 --(拉氏变换, 零初始)--> 传递函数 G(s)三个领域的系统,只要微分方程同形,传递函数就同形——这是整门课最省力的一条规律:
| 领域 | 元件与对应量 | 微分方程 |
|---|---|---|
| 电学 | L / R / C,量是电压电流 | L q'' + R q' + q/C = u |
| 机械(平动) | 质量 / 阻尼 / 弹簧 | m x'' + b x' + k x = F |
| 机械(转动) | 转动惯量 / 阻尼 / 扭簧 | J θ'' + D θ' + K θ = T |
三个方程长得一模一样,因此它们的传递函数、它们的超调量、它们的振荡频率全都一样。学通一个就等于学通三个。
这一层回答了上一层什么问题:上一章说"回路增益足够大就行";这一章回答"回路增益是拿什么东西算出来的"。它把电路、机械、机电系统统一成同一个数学对象——这件事与 数字逻辑把各种逻辑都化成门级网表 是同一种思路:先找同构,再复用结论。
原理
一、建模三步法
text
第一步 列物理定律 基尔霍夫 / 牛顿第二定律 / 能量守恒
第二步 消中间变量 把不关心的量(中间电流、内力)消掉,只留输入与输出
第三步 拉氏变换 在零初始条件下把 d/dt 换成 s第二步最容易被忽略、也最容易出错:一个二阶机械系统可能有 3 个位移变量,但你要的只是其中一个与外力之间的关系。先把方程数凑够、再消到只剩两个变量(输入、输出),是这一步的标准动作。
第三步的前提是"零初始条件"——所有变量的初始值都是 0。这不是苛刻要求,而是定义:传递函数描述的是"系统对输入的响应",这个响应必须与初始状态无关,否则同一个系统会有无穷多个传递函数。
二、拉普拉斯变换要记住的三条
| 性质 | 式子 | 用途 |
|---|---|---|
| 线性 | L{af + bg} = aF + bG | 可以逐项变换 |
| 微分 | L{df/dt} = sF(s) - f(0) | 零初始下就是乘 s,所以 d/dt 换成 s |
| 积分 | L{∫f dt} = F(s)/s + (1/s)∫f(0) | 零初始下就是除 s |
| 终值定理 | lim(t→∞) f(t) = lim(s→0) sF(s) | 算稳态误差 |
"d/dt 换成 s、∫ 换成 1/s"这一条就是全部。于是 L x'' + R x' + x/C = u 直接变成 (Ls² + Rs + 1/C)X(s) = U(s),一眼就能写出 G(s) = 1/(Ls² + Rs + 1/C)——微分方程的解不在这一步出现,它先被"藏"进了分式,需要时再逆变换展开。
三、传递函数的定义与性质
五条性质必须记牢:
- 只与系统结构与参数有关,与输入无关——换输入不换传递函数,这是它能复用的原因。
- 分子分母都是实系数有理多项式,分母的阶数
n >= m(真实系统不会瞬间响应)。 - 分母
= 0是特征方程,它的根就是极点;分子的根是零点。 - 极点决定自由响应的形状(衰减快慢、是否振荡),零点影响各分量的比重。
G(s)与脉冲响应的拉氏变换相同——因为L{δ(t)} = 1。
"分母的根决定稳定性"这句话是整个课程的枢纽:后面所有的稳定性判据(劳斯、根轨迹、奈奎斯特)都是在问同一件事——分母多项式的根在不在左半平面。
四、六种典型环节
化到最简的传递函数总可以拆成这几块的乘积,记住它们就等于记住了所有系统:
| 环节 | 传递函数 | 典型来源 | 特征 |
|---|---|---|---|
| 比例 | K | 放大器、杠杆 | 无惯性 |
| 积分 | 1/s | 电容充电、电机转角 | 输出是输入的累积 |
| 微分 | s | 测速发电机 | 实际中不能单独存在(噪声放大) |
| 惯性(一阶) | 1/(Ts+1) | RC 电路、热系统 | T = 时间常数,无超调 |
| 振荡(二阶) | wn²/(s² + 2ζwn s + wn²) | RLC、质量弹簧 | 由 wn 与 ζ 两个参数定全部行为 |
| 延迟 | exp(-τs) | 管道输运、网络 | 相位随频率线性下降,最伤稳定性 |
二阶环节的两个参数值得单独记:
wn叫自然频率:ζ = 0时的振荡角频率;ζ叫阻尼比:ζ > 1过阻尼(两个实根)、ζ = 1临界、0 < ζ < 1欠阻尼(一对共轭复根)、ζ = 0无阻尼(纯虚根,等幅振荡)。
所有二阶系统的响应形状只由 ζ 决定,时间尺度只由 wn 决定——这就是为什么考试里总能"一个数字定乾坤"。
五、三个领域的参数换算
把它写成对照表,以后见到任何二阶系统都能直接查:
| 参数 | RLC 串联回路 | 质量-弹簧-阻尼 |
|---|---|---|
| 标准式分母 | s² + (R/L)s + 1/(LC) | s² + (b/m)s + k/m |
| 自然频率 | wn = 1/sqrt(LC) | wn = sqrt(k/m) |
| 阻尼比 | ζ = (R/2) * sqrt(C/L) | ζ = b / (2 * sqrt(mk)) |
| 临界阻尼条件 | R = 2 * sqrt(L/C) | b = 2 * sqrt(mk) |
| 惯性时间常数 | T = RC(一阶) | — |
"临界阻尼条件"这一行的用法:想让系统"最快到而不超调",就把阻尼或电阻调到这个值。
六、结构图化简三规则
复杂方块图靠三条规则一步步合并:
| 规则 | 原图 | 化简后 |
|---|---|---|
| 串联 | G1 -> G2 | G1 * G2 |
| 并联 | G1 与 G2 并行汇入同一点 | G1 + G2 |
| 反馈 | 前向 G、反馈 H、负反馈 | G / (1 + GH) |
符号要点:负反馈是 1 + GH,正反馈是 1 - GH。分母上这个加号来自"把反馈量挪到等号左边"这一步代数运算,不是人为规定的。
比较点与引出点也可以移动,但移动时必须补上相应的增益——这是化简里唯一的技巧点,也是最容易漏掉因子的地方。
七、梅森增益公式
信号流图比方块图更省笔,用的是梅森公式:
| 符号 | 含义 |
|---|---|
P_k | 第 k 条前向通路的增益(从输入到输出、不重复经过任何节点) |
L_a | 单个回路的增益 |
L_b L_c | 一对互不接触回路(不共用节点)的增益乘积 |
delta_k | 把"与第 k 条通路接触的所有回路"去掉后,剩下的那部分 delta |
用梅森最大的风险是"漏回路"和"错判接触":两段回路只要共用任意一个节点就算接触,delta_k 里就不能包含它。
八、非线性系统的线性化
真实系统几乎都是非线性的(饱和、死区、sin θ、平方律)。方法是在某个工作点附近做泰勒一阶展开:
text
y = f(x) 在 x0 附近: y ≈ f(x0) + f'(x0) * (x - x0)把 f(x0) 当作"工作点的常量偏置"减掉,剩下的 f'(x0) 就是该工作点上的等效线性增益。
关键点:线性化只在工作点附近有效,而且工作点不同,线性化后的参数就不同。所以同一个水箱系统,在"半满"和"将满"两个工作点上,线性化出来的传递函数是不一样的——这不是近似误差,而是线性化方法的固有性质。
示例
例 1:RLC 串联回路
取 R = 10 Ω、L = 1 mH、C = 1 μF,以电容电压为输出:
text
(Ls^2 + Rs + 1/C) Y(s) = (1/C) U(s)
G(s) = (1/LC) / (s^2 + (R/L)s + 1/LC)
wn = 1/sqrt(LC) = 1/sqrt(1e-9) = 31622.7766 rad/s (f0 = 5032.9212 Hz)
zeta = (R/2)*sqrt(C/L) = 5 * sqrt(1e-3) = 0.158114
wd = wn*sqrt(1 - zeta^2) = 31224.9900 rad/sζ = 0.158 是欠阻尼,所以这个回路在阶跃输入下会明显振荡(ζ = 0.158 对应的超调量约 60%)。想让同一回路不超调,需要 R = 2*sqrt(L/C) = 63.2456 Ω——把电阻从 10 Ω 提到 63.25 Ω,这就是"临界阻尼电阻"。
例 2:机械系统照搬同一套结论
m = 1 kg、k = 100 N/m、b = 2 N·s/m(阻尼器):
text
s^2 + (b/m)s + k/m -> wn = sqrt(k/m) = sqrt(100) = 10.0000 rad/s
zeta = b/(2*sqrt(mk)) = 2/(2*10) = 0.100000与例 1 完全同构:wn 来自"储能元件"(k、1/C),ζ 来自"耗能元件比"(b、R)。
这就是"学通一个等于学通三个"的意思:例 1 的 RLC 回路要减小超调,得把 R 从 10 Ω 提到 63.25 Ω;例 2 的机械系统要减小超调,得把 b 从 2 提到 2*sqrt(1*100) = 20——都是把阻尼项提到临界值,只是单位不同。
例 3:结构图化简
一个含内环与外环的系统:
text
内环:前向 G1 = 5,反馈 H1 = 0.1(负) -> G1/(1 + G1*H1) = 5/1.5 = 3.3333
外环:前向 G = 3.3333 * 2 = 6.6667,反馈 H2 = 0.5(负)
-> T = 6.6667/(1 + 6.6667*0.5) = 6.6667/4.3333 = 1.5385逐层从内到外合并,每一步都用 G/(1+GH)。如果内环是正反馈,第一步就是 5/(1 - 0.5) = 10——符号弄错,结果能差几倍。
例 4:梅森公式——两个前向通路 + 一个回路
信号流图:R -> x1 ->(2)-> x2 ->(3)-> x3 = Y,同时有一条直通支路 R ->(1)-> x3,以及一条反馈支路 x3 ->(-0.5)-> x1。
text
回路: L1 = 2 * 3 * (-0.5) = -3
Delta = 1 - L1 = 1 - (-3) = 4
前向通路: P1 = 2*3 = 6(经过 x1、x2、x3,与回路接触 -> Delta1 = 1)
P2 = 1 (经过 x3,与回路接触 -> Delta2 = 1)
T = (P1*Delta1 + P2*Delta2)/Delta = (6 + 1)/4 = 1.75用代数验算一下:Y = 6(R - 0.5Y) + 1*R = 7R - 3Y,所以 4Y = 7R、T = 1.75——与梅森公式一致。这个"算两遍"的习惯值得保留:梅森最容易错的就是"接触"判断,代数验算只要两步就能发现。
例 5:C 实现——从模型到数值响应
一阶 RC 与二阶标准式的阶跃响应,用欧拉法数值积分,并与解析解对照。
/* model.c —— 从模型到响应:一阶 RC 与二阶标准式的数值解 */
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
#define TAU 0.001 /* RC = 1 kohm x 1 uF */
#define DT1 0.00001
#define N1 1000 /* 10 ms */
#define WN 100.0 /* rad/s */
#define DT2 0.0005
#define N2 2000 /* 1 s */
static void first_order(void)
{
static const int marks[3] = { 100, 500, 1000 };
double y = 0.0;
int n, m = 0;
printf("=== 1. first order: TAU = %.0f ms ===\n", TAU * 1000.0);
printf(" %-8s%12s%12s\n", "t/TAU", "euler", "exact");
for (n = 0; n < N1; n++) {
y += DT1 * (1.0 - y) / TAU;
if (m < 3 && n + 1 == marks[m]) {
double t = (n + 1) * DT1;
printf(" %-8.1f%12.6f%12.6f\n", t / TAU, y, 1.0 - exp(-t / TAU));
m++;
}
}
}
static void second_order(double zeta)
{
static const int marks[5] = { 20, 40, 60, 100, 200 };
static const double ts[5] = { 0.010, 0.020, 0.030, 0.050, 0.100 };
double y = 0.0, v = 0.0, ymax = 0.0;
int n, m = 0;
printf("=== 2. second order: wn = %.0f rad/s, zeta = %.3f ===\n", WN, zeta);
printf(" %-8s%12s\n", "t (s)", "y");
for (n = 0; n < N2; n++) {
double acc = WN * WN * (1.0 - y) - 2.0 * zeta * WN * v;
v += DT2 * acc;
y += DT2 * v;
if (y > ymax) ymax = y;
if (m < 5 && n + 1 == marks[m]) {
printf(" %-8.3f%12.6f\n", ts[m], y);
m++;
}
}
printf(" max y = %.6f, overshoot = %.4f%%\n\n", ymax, (ymax - 1.0) * 100.0);
}
static void analytic(double zeta)
{
double wd = WN * sqrt(1.0 - zeta * zeta);
printf(" zeta = %.3f: tp = %.6f s, sigma%% = %.4f%%\n",
zeta, PI / wd, exp(-zeta * PI / sqrt(1.0 - zeta * zeta)) * 100.0);
}
int main(void)
{
first_order();
second_order(0.200);
second_order(0.707);
printf("=== 3. analytic check (wn = %.0f) ===\n", WN);
analytic(0.200);
analytic(0.707);
return 0;
}
c 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
=== 1. first order: TAU = 1 ms ===
t/TAU euler exact
1.0 0.633968 0.632121
5.0 0.993430 0.993262
10.0 0.999957 0.999955
=== 2. second order: wn = 100 rad/s, zeta = 0.200 ===
t (s) y
0.010 0.425777
0.020 1.148546
0.030 1.517632
0.050 0.987739
0.100 1.130751
max y = 1.524984, overshoot = 52.4984%
=== 2. second order: wn = 100 rad/s, zeta = 0.707 ===
t (s) y
0.010 0.322454
0.020 0.735788
0.030 0.963328
0.050 1.033426
0.100 0.999075
max y = 1.038445, overshoot = 3.8445%
=== 3. analytic check (wn = 100) ===
zeta = 0.200: tp = 0.032064 s, sigma% = 52.6621%
zeta = 0.707: tp = 0.044422 s, sigma% = 4.3255%三点值得对着输出看:
- 一阶那一列的
euler与exact已经非常接近(dt = 10 μs只有T = 1 ms的 1%),说明数值解在这里是可用的;如果把dt放大到T/10,欧拉法就会引入明显的"人为阻尼",1T处的值会从 0.633 变成 0.651——仿真步长不是随便取的; ζ = 0.200的那一段明显冲过头(超调约 52%),而ζ = 0.707几乎不超调(约 4%)——同一组微分方程,只换了ζ一个参数;- 数值积分的超调量略小于解析值(52.50% vs 52.66%、3.84% vs 4.33%):欧拉法会引入一点"人为阻尼"。这就是"仿真不能代替解析"的一个具体例子。
例 6:Python——参数换算与三个领域的同形对照
# 传递函数:RLC 参数换算、临界阻尼、结构图化简与梅森公式
import math
import unicodedata
def wpad(s, n):
"""按显示宽度右补空格:东亚宽字符算 2 列"""
w = sum(2 if unicodedata.east_asian_width(c) in "WF" else 1 for c in s)
return s + " " * max(0, n - w)
print("=== 一、RLC 串联回路 -> 二阶标准式 ===")
R, L, C = 10.0, 1e-3, 1e-6
wn = 1 / math.sqrt(L * C)
zeta = R / 2 * math.sqrt(C / L)
print(f" wn = 1/sqrt(LC) = {wn:.4f} rad/s (f0 = {wn / 2 / math.pi:.4f} Hz)")
print(f" zeta = (R/2)*sqrt(C/L) = {zeta:.6f} -> {'欠阻尼' if zeta < 1 else '过阻尼'}")
print(f" wd = wn*sqrt(1-zeta^2) = {wn * math.sqrt(1 - zeta * zeta):.4f} rad/s")
print(f" 临界阻尼电阻 R = 2*sqrt(L/C) = {2 * math.sqrt(L / C):.4f} ohm")
print("\n=== 二、三个领域同形对照 ===")
cases = [
("RLC 串联", 1 / math.sqrt(L * C), R / 2 * math.sqrt(C / L), 2 * math.sqrt(L / C)),
("质量-弹簧-阻尼", math.sqrt(100 / 1), 2 / (2 * math.sqrt(1 * 100)), 2 * math.sqrt(1 * 100)),
("转动惯量系统", math.sqrt(50 / 2), 4 / (2 * math.sqrt(2 * 50)), 2 * math.sqrt(2 * 50)),
]
for name, w, z, crit in cases:
print(f" {wpad(name, 16)}wn = {w:9.4f} zeta = {z:.6f} 临界阻尼参数 = {crit:8.4f}")
print("\n=== 三、结构图化简(从内环到外环)===")
g1, h1 = 5.0, 0.1
inner = g1 / (1 + g1 * h1)
print(f" 内环: {g1}/(1 + {g1}*{h1}) = {inner:.4f}")
outer_num = inner * 2
h2 = 0.5
T = outer_num / (1 + outer_num * h2)
print(f" 外环: {outer_num:.4f}/(1 + {outer_num:.4f}*{h2}) = {T:.4f}")
print(f" 若内环是正反馈: {g1}/(1 - {g1}*{h1}) = {g1 / (1 - g1 * h1):.4f}(差很多)")
print("\n=== 四、梅森公式(两前向通路 + 一回路)===")
L1 = 2 * 3 * (-0.5)
delta = 1 - L1
P1, P2 = 2 * 3, 1
print(f" 回路 L1 = 2*3*(-0.5) = {L1:.4f}")
print(f" Delta = 1 - L1 = {delta:.4f}")
print(f" 两条通路都与回路接触 -> Delta1 = Delta2 = 1")
print(f" T = (P1*1 + P2*1)/Delta = ({P1:.0f} + {P2:.0f})/{delta:.0f} = {(P1 + P2) / delta:.4f}")
print(f" 代数验算: Y = 6(R - 0.5Y) + R -> 4Y = 7R -> T = {7 / 4:.4f}")
print("\n=== 五、线性化:工作点不同,等效增益不同 ===")
import math as m
for x in (0.1, 0.5, 1.0):
print(f" y = sin(x) 在 x0 = {x}: 等效增益 f'(x0) = cos({x}) = {m.cos(x):.6f}")
python 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
=== 一、RLC 串联回路 -> 二阶标准式 ===
wn = 1/sqrt(LC) = 31622.7766 rad/s (f0 = 5032.9212 Hz)
zeta = (R/2)*sqrt(C/L) = 0.158114 -> 欠阻尼
wd = wn*sqrt(1-zeta^2) = 31224.9900 rad/s
临界阻尼电阻 R = 2*sqrt(L/C) = 63.2456 ohm
=== 二、三个领域同形对照 ===
RLC 串联 wn = 31622.7766 zeta = 0.158114 临界阻尼参数 = 63.2456
质量-弹簧-阻尼 wn = 10.0000 zeta = 0.100000 临界阻尼参数 = 20.0000
转动惯量系统 wn = 5.0000 zeta = 0.200000 临界阻尼参数 = 20.0000
=== 三、结构图化简(从内环到外环)===
内环: 5.0/(1 + 5.0*0.1) = 3.3333
外环: 6.6667/(1 + 6.6667*0.5) = 1.5385
若内环是正反馈: 5.0/(1 - 5.0*0.1) = 10.0000(差很多)
=== 四、梅森公式(两前向通路 + 一回路)===
回路 L1 = 2*3*(-0.5) = -3.0000
Delta = 1 - L1 = 4.0000
两条通路都与回路接触 -> Delta1 = Delta2 = 1
T = (P1*1 + P2*1)/Delta = (6 + 1)/4 = 1.7500
代数验算: Y = 6(R - 0.5Y) + R -> 4Y = 7R -> T = 1.7500
=== 五、线性化:工作点不同,等效增益不同 ===
y = sin(x) 在 x0 = 0.1: 等效增益 f'(x0) = cos(0.1) = 0.995004
y = sin(x) 在 x0 = 0.5: 等效增益 f'(x0) = cos(0.5) = 0.877583
y = sin(x) 在 x0 = 1.0: 等效增益 f'(x0) = cos(1.0) = 0.540302第五段是这一章最该带走的一句话:同一个 sin(x),工作点取 0.1 时等效增益 0.995、取 1.0 时只剩 0.540——"线性化只在工作点附近有效"不是一句免责声明,它意味着同一个物理系统在不同工况下要用不同的传递函数。
考点
- 传递函数的定义离不开"零初始条件"——离开它传递函数不唯一。
d/dt换s、∫换1/s;L{df/dt} = sF(s) - f(0)。- 传递函数只与结构参数有关,与输入无关;分母
= 0是特征方程,其根为极点,极点决定稳定性。 - 六种典型环节:比例
K、积分1/s、微分s、惯性1/(Ts+1)、振荡wn²/(s²+2ζwn s+wn²)、延迟exp(-τs)。微分环节不能单独存在(放大噪声)。 - 二阶系统两个参数:
wn定时间尺度、ζ定响应形状。ζ > 1过阻尼、= 1临界、0 < ζ < 1欠阻尼、= 0等幅振荡。 - RLC 对照:
wn = 1/sqrt(LC)、ζ = (R/2)*sqrt(C/L)、临界阻尼R = 2*sqrt(L/C);机械系统wn = sqrt(k/m)、ζ = b/(2*sqrt(mk))。两者同形,结论可整套搬迁。 - 结构图三规则:串联相乘、并联相加、反馈
G/(1+GH)(负反馈用加号)。 - 梅森公式:
T = (1/Δ)Σ P_k Δ_k;Δ_k要剔除所有与第 k 条通路接触的回路,"共用任意一个节点"就算接触。 - 线性化的等效增益是工作点处的一阶导数;工作点变了,传递函数就变了。
- 易错:把
ζ与wn的作用搞反(wn变ζ不变时,振荡频率变、超调量不变);把负反馈写成1 - GH;梅森公式里把"不接触"误判成"接触"(只要共点就是接触);忘记"零初始条件";把延迟环节exp(-τs)当成有理分式处理(它无法用多项式表示,只能用帕德近似)。
小结
- 建模三步:列物理定律 → 消中间变量 → 零初始条件下做拉氏变换。
- 拉氏变换的全部要点:
d/dt换s、∫换1/s,于是微分方程变成代数方程。 - 传递函数 = 输出与输入的拉氏变换之比,它是系统的"指纹":与输入无关、极点在分母上。
- 六种典型环节可以拼出任何线性系统;其中振荡环节只由
wn与ζ两个数决定全部行为。 - 电路、平动机械、转动机械同形,一套结论三处通用。
- 结构图化简三规则 + 梅森公式是处理复杂回路的两种工具;梅森的风险在接触判断,要养成代数验算的习惯。
- 非线性系统线性化 = 工作点处的泰勒一阶项,等效增益随工作点变化。
回到主线:这一章把上一章的方块图落实成了可以运算的式子,用到的正是 微积分 里的微分方程与 拉普拉斯变换的思想——elec 那一篇是从信号与系统的角度讲拉氏变换,这一篇是从控制的角度用它,同一个工具两张面孔。
这一章给出了模型,但还没有"看响应"。下一章把传递函数变成时间轴上的曲线,并从中读出超调量、峰值时间、调节时间这三个数字。
下一篇:时域分析:一阶、二阶系统响应
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。