一、为什么传递函数/状态空间模型是系统建模的核心?
在工科系统分析与仿真中(如控制系统、电路系统、电机系统),传递函数和状态空间模型是描述系统动态特性的两种核心数学模型,也是后续进行阶跃响应分析、PID控制器设计、系统稳定性验证的基础。
- 传递函数:适用于线性定常系统,以复频域(s域)为基础,形式简洁直观,方便进行根轨迹、频域分析,工程中最常用;
- 状态空间模型:适用于线性/非线性、定常/时变系统,以时域为基础,能全面描述系统内部状态,适合复杂多输入多输出(MIMO)系统建模。
MATLAB的Control System Toolbox提供了便捷的函数(tf()、zpk()、ss()),可快速实现两种模型的创建、转换与验证,本文全程配套可运行代码,从基础语法到工程案例,帮助你快速掌握核心建模技能。
二、基础准备:必备工具箱与环境搭建
- 必备工具箱:
Control System Toolbox(MATLAB核心工具箱,R2020b及以上版本默认自带,若未安装,可通过“附加功能”搜索安装); - 版本推荐:优先选择R2020b及以上版本,兼容性好,函数语法规范,对新手友好;
- 核心操作界面:使用MATLAB脚本编辑器(
.m文件),方便代码保存与重复运行,避免命令行单次输入的繁琐。
三、核心实战一:传递函数模型创建(工程最常用)
传递函数主要有两种表达形式:有理多项式形式(分子/分母多项式)和零极点增益形式,对应的MATLAB创建函数分别为tf()和zpk(),以下逐一讲解,配套工程案例。
3.1 有理多项式形式传递函数(tf()函数,新手必掌握)
3.1.1 核心语法
对于线性定常系统,传递函数的有理多项式形式为:
其中,num为分子多项式系数数组,den为分母多项式系数数组,系数按s的降幂排列,缺失项系数为0。
MATLAB核心语法:
G = tf(num, den); % num:分子系数数组;den:分母系数数组;G:创建完成的传递函数模型
3.1.2 实战案例1:简单一阶系统(RC电路)
RC电路的传递函数为:(其中),完整创建代码如下:
% 一阶系统(RC电路)传递函数创建(有理多项式形式)
% 1. 定义系统参数
R = 1000; % 电阻:1000Ω
C = 1e-6; % 电容:1μF
RC = R * C; % 时间常数:0.001s
% 2. 定义分子、分母系数数组(按s降幂排列)
num = [1]; % 分子:1(对应1*s^0)
den = [RC, 1]; % 分母:0.001s + 1(对应0.001*s^1 + 1*s^0)
% 3. 调用tf()函数创建传递函数
G_rc = tf(num, den);
% 4. 输出传递函数,查看结果
disp('RC电路传递函数:');
disp(G_rc);
3.1.3 实战案例2:二阶系统(直流电机转速控制)
二阶系统是工程中最常见的系统,传递函数为:(其中,),完整代码如下:
% 二阶系统(直流电机)传递函数创建(有理多项式形式)
% 1. 定义系统参数
wn = 10; % 自然频率:10 rad/s
zeta = 0.7; % 阻尼比:0.7(欠阻尼系统)
% 2. 定义分子、分母系数数组(按s降幂排列)
num = [wn^2]; % 分子:100(对应100*s^0)
den = [1, 2*zeta*wn, wn^2]; % 分母:s^2 + 14s + 100
% 3. 调用tf()函数创建传递函数
G_motor = tf(num, den);
% 4. 输出传递函数,查看结果
disp('直流电机传递函数:');
disp(G_motor);
3.2 零极点增益形式传递函数(zpk()函数,进阶技能)
3.2.1 核心语法
传递函数的零极点增益形式为:
其中,K为增益,z为零点数组,p为极点数组。
MATLAB核心语法:
G = zpk(z, p, K); % z:零点数组;p:极点数组;K:增益;G:创建完成的零极点增益传递函数
3.2.2 实战案例:零极点增益模型创建与转换
以二阶系统为例,先创建零极点增益模型,再转换为有理多项式形式,代码如下:
% 二阶系统零极点增益形式传递函数创建
% 1. 定义系统参数(零点、极点、增益)
z = []; % 二阶系统无零点,为空数组
p = [-7+sqrt(51)i, -7-sqrt(51)i]; % 极点(由二阶系统分母求解得到)
K = 100; % 增益:100(与二阶系统分子一致)
% 2. 调用zpk()函数创建传递函数
G_zpk = zpk(z, p, K);
% 3. 输出零极点增益传递函数,查看结果
disp('二阶系统零极点增益传递函数:');
disp(G_zpk);
% 4. 转换为有理多项式形式(工程常用,方便后续分析)
G_tf = tf(G_zpk);
disp('转换为有理多项式形式传递函数:');
disp(G_tf);
3.3 传递函数建模新手避坑指南
- 分子/分母系数数组必须按s的降幂排列,缺失项需补0(如的分母数组为
[1, 0, 1]); - 若系统无零点/极点,对应的数组需设为
[](空数组),不可省略; - 运行报错“未定义函数或变量'tf'”,说明未安装
Control System Toolbox,需补充安装; - 避免在系数数组中直接输入小数(如0.001),可先定义参数(如
RC=0.001),提高代码可读性与可修改性。
四、核心实战二:状态空间模型创建(复杂系统必备)
状态空间模型以时域为基础,通过状态方程()和输出方程()描述系统,适合多输入多输出(MIMO)、非线性系统建模,MATLAB中通过ss()函数创建。
4.1 核心语法
状态空间模型的核心是四元组(A、B、C、D),对应的MATLAB语法:
sys = ss(A, B, C, D); % A:状态矩阵;B:输入矩阵;C:输出矩阵;D:直接传输矩阵;sys:创建完成的状态空间模型
4.2 实战案例1:简单一阶系统状态空间模型创建
一阶RC电路的状态方程为:,输出方程为:,完整创建代码如下:
% 一阶系统(RC电路)状态空间模型创建
% 1. 定义系统参数
R = 1000; % 电阻:1000Ω
C = 1e-6; % 电容:1μF
RC = R * C; % 时间常数:0.001s
% 2. 定义状态空间四元组(A、B、C、D)
A = [-1/RC]; % 状态矩阵(一阶系统为标量)
B = [1/RC]; % 输入矩阵
C = [1]; % 输出矩阵
D = [0]; % 直接传输矩阵(一阶系统无直接传输,为0)
% 3. 调用ss()函数创建状态空间模型
sys_rc_ss = ss(A, B, C, D);
% 4. 输出状态空间模型,查看结果
disp('RC电路状态空间模型:');
disp(sys_rc_ss);
% 5. 查看模型属性(A、B、C、D矩阵)
disp('状态矩阵A:');
disp(sys_rc_ss.A);
disp('输入矩阵B:');
disp(sys_rc_ss.B);
4.3 实战案例2:二阶系统状态空间模型创建与转换
以直流电机二阶系统为例,先创建状态空间模型,再转换为传递函数形式,验证模型正确性,代码如下:
% 二阶系统(直流电机)状态空间模型创建与转换
% 1. 定义系统参数
wn = 10; % 自然频率:10 rad/s
zeta = 0.7; % 阻尼比:0.7
% 2. 定义状态空间四元组(A、B、C、D)(二阶系统标准型)
A = [0, 1; -wn^2, -2*zeta*wn]; % 2×2状态矩阵
B = [0; wn^2]; % 2×1输入矩阵
C = [1, 0]; % 1×2输出矩阵
D = [0]; % 1×1直接传输矩阵
% 3. 调用ss()函数创建状态空间模型
sys_motor_ss = ss(A, B, C, D);
% 4. 输出状态空间模型,查看结果
disp('直流电机状态空间模型:');
disp(sys_motor_ss);
% 5. 转换为传递函数形式(验证模型正确性)
sys_motor_tf = tf(sys_motor_ss);
disp('转换为传递函数形式:');
disp(sys_motor_tf);
4.4 实战案例3:多输入多输出(MIMO)系统状态空间模型
对于MIMO系统,四元组(A、B、C、D)为多维矩阵,以2输入2输出系统为例,代码如下:
% 多输入多输出(MIMO)系统状态空间模型创建
% 1. 定义状态空间四元组(A、B、C、D)
A = [0 1; -2 -3]; % 2×2状态矩阵
B = [1 0; 0 1]; % 2×2输入矩阵(2输入)
C = [1 0; 0 1]; % 2×2输出矩阵(2输出)
D = [0 0; 0 0]; % 2×2直接传输矩阵
% 2. 调用ss()函数创建状态空间模型
sys_mimo_ss = ss(A, B, C, D);
% 3. 输出MIMO系统模型,查看结果
disp('2输入2输出MIMO系统状态空间模型:');
disp(sys_mimo_ss);
4.5 状态空间建模新手避坑指南
- 四元组(A、B、C、D)的矩阵维度必须匹配:A为n×n(n为状态变量个数),B为n×p(p为输入个数),C为q×n(q为输出个数),D为q×p;
- 若需查看状态空间模型的详细属性,可使用
sys.A、sys.B等命令,直接提取对应矩阵; - 转换为传递函数时,MIMO系统会输出多个传递函数(对应输入与输出的组合),属于正常现象;
- 新手可先从一阶、二阶系统入手,掌握标准型状态空间模型,再逐步拓展到复杂系统。
五、核心实战三:模型之间的转换与验证(工程必备)
在工程实际中,常需要根据分析需求进行模型转换(传递函数↔状态空间↔零极点增益),MATLAB提供了便捷的转换函数,核心转换关系如下:
- 传递函数→状态空间:
sys_ss = ss(sys_tf); - 状态空间→传递函数:
sys_tf = tf(sys_ss); - 传递函数→零极点增益:
sys_zpk = zpk(sys_tf); - 零极点增益→传递函数:
sys_tf = tf(sys_zpk)。
5.1 模型转换实战代码
% 系统模型之间的转换与验证
% 1. 先创建一个二阶传递函数模型
wn = 10;
zeta = 0.7;
num = [wn^2];
den = [1, 2*zeta*wn, wn^2];
sys_tf = tf(num, den);
% 2. 传递函数→状态空间
sys_ss = ss(sys_tf);
% 3. 传递函数→零极点增益
sys_zpk = zpk(sys_tf);
% 4. 状态空间→零极点增益
sys_ss2zpk = zpk(sys_ss);
% 5. 输出转换结果,验证一致性
disp('原始传递函数模型:');
disp(sys_tf);
disp('传递函数转换为状态空间模型:');
disp(sys_ss);
disp('传递函数转换为零极点增益模型:');
disp(sys_zpk);
% 6. 阶跃响应仿真验证(不同模型响应曲线一致,说明转换正确)
figure;
step(sys_tf, 'r-', 'LineWidth', 2);
hold on;
step(sys_ss, 'b--', 'LineWidth', 2);
step(sys_zpk, 'g:', 'LineWidth', 2);
xlabel('时间 t (s)');
ylabel('输出 y(t)');
title('不同模型阶跃响应对比(验证转换正确性)');
legend('传递函数', '状态空间', '零极点增益');
grid on;
hold off;
5.2 模型验证核心技巧
- 最直观的验证方法是阶跃响应仿真(
step()函数),不同模型的响应曲线应完全一致; - 可通过
damp()函数查看系统的极点、阻尼比等指标,验证转换后模型的参数是否与原始模型一致; - 对于复杂系统,可提取模型的核心指标(如稳态值、超调量),对比不同模型的结果,确保转换正确。
六、工程实战:多模块系统建模(串联/并联/反馈)
在工程实际中,系统通常由多个模块组成,常见的连接方式有串联、并联、反馈,MATLAB提供了对应的函数(series()、parallel()、feedback()),可快速搭建复杂系统模型。
6.1 多模块系统建模实战代码
% 多模块系统建模(串联/并联/反馈)
% 1. 先创建两个基础传递函数模块
G1 = tf([1], [0.01, 1]); % 模块1:一阶系统
G2 = tf([10], [1, 2]); % 模块2:一阶系统
% 2. 串联系统建模(G = G1*G2)
G_series = series(G1, G2);
disp('串联系统传递函数:');
disp(G_series);
% 3. 并联系统建模(G = G1 + G2)
G_parallel = parallel(G1, G2);
disp('并联系统传递函数:');
disp(G_parallel);
% 4. 反馈系统建模(单位负反馈,G = G1/(1+G1*G2))
G_feedback = feedback(G1, G2); % 第一个参数为前向通道,第二个参数为反馈通道
disp('单位负反馈系统传递函数:');
disp(G_feedback);
% 5. 阶跃响应仿真对比
figure;
subplot(3,1,1);
step(G_series, 'r-', 'LineWidth', 2);
title('串联系统阶跃响应');
grid on;
subplot(3,1,2);
step(G_parallel, 'b--', 'LineWidth', 2);
title('并联系统阶跃响应');
grid on;
subplot(3,1,3);
step(G_feedback, 'g:', 'LineWidth', 2);
title('反馈系统阶跃响应');
grid on;