# MATLAB系统建模实战教程:传递函数/状态空间模型创建(附完整代码+工程案例) (面向控制工程/电子信息/机械工程从业者,零基础上手,聚焦工程实用场景,可

97 阅读8分钟

一、为什么传递函数/状态空间模型是系统建模的核心?

在工科系统分析与仿真中(如控制系统、电路系统、电机系统),传递函数状态空间模型是描述系统动态特性的两种核心数学模型,也是后续进行阶跃响应分析、PID控制器设计、系统稳定性验证的基础。

  • 传递函数:适用于线性定常系统,以复频域(s域)为基础,形式简洁直观,方便进行根轨迹、频域分析,工程中最常用;
  • 状态空间模型:适用于线性/非线性、定常/时变系统,以时域为基础,能全面描述系统内部状态,适合复杂多输入多输出(MIMO)系统建模。

MATLAB的Control System Toolbox提供了便捷的函数(tf()zpk()ss()),可快速实现两种模型的创建、转换与验证,本文全程配套可运行代码,从基础语法到工程案例,帮助你快速掌握核心建模技能。

二、基础准备:必备工具箱与环境搭建

  1. 必备工具箱Control System Toolbox(MATLAB核心工具箱,R2020b及以上版本默认自带,若未安装,可通过“附加功能”搜索安装);
  2. 版本推荐:优先选择R2020b及以上版本,兼容性好,函数语法规范,对新手友好;
  3. 核心操作界面:使用MATLAB脚本编辑器(.m文件),方便代码保存与重复运行,避免命令行单次输入的繁琐。

三、核心实战一:传递函数模型创建(工程最常用)

传递函数主要有两种表达形式:有理多项式形式(分子/分母多项式)和零极点增益形式,对应的MATLAB创建函数分别为tf()zpk(),以下逐一讲解,配套工程案例。

3.1 有理多项式形式传递函数(tf()函数,新手必掌握)

3.1.1 核心语法

对于线性定常系统,传递函数的有理多项式形式为: G(s)=num(s)den(s)=amsm+am1sm1++a1s+a0bnsn+bn1sn1++b1s+b0G(s) = \frac{num(s)}{den(s)} = \frac{a_m s^m + a_{m-1} s^{m-1} + \dots + a_1 s + a_0}{b_n s^n + b_{n-1} s^{n-1} + \dots + b_1 s + b_0} 其中,num为分子多项式系数数组,den为分母多项式系数数组,系数按s的降幂排列,缺失项系数为0

MATLAB核心语法:

G = tf(num, den);  % num:分子系数数组;den:分母系数数组;G:创建完成的传递函数模型

3.1.2 实战案例1:简单一阶系统(RC电路)

RC电路的传递函数为:G(s)=1RCs+1G(s) = \frac{1}{RC s + 1}(其中RC=0.001sRC=0.001s),完整创建代码如下:

% 一阶系统(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:二阶系统(直流电机转速控制)

二阶系统是工程中最常见的系统,传递函数为:G(s)=ωn2s2+2ζωns+ωn2G(s) = \frac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}(其中ωn=10rad/s\omega_n=10rad/sζ=0.7\zeta=0.7),完整代码如下:

% 二阶系统(直流电机)传递函数创建(有理多项式形式)
% 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 核心语法

传递函数的零极点增益形式为:G(s)=K(sz1)(sz2)(szm)(sp1)(sp2)(spn)G(s) = K \frac{(s - z_1)(s - z_2)\dots(s - z_m)}{(s - p_1)(s - p_2)\dots(s - p_n)} 其中,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 传递函数建模新手避坑指南

  1. 分子/分母系数数组必须按s的降幂排列,缺失项需补0(如s2+1s^2 + 1的分母数组为[1, 0, 1]);
  2. 若系统无零点/极点,对应的数组需设为[](空数组),不可省略;
  3. 运行报错“未定义函数或变量'tf'”,说明未安装Control System Toolbox,需补充安装;
  4. 避免在系数数组中直接输入小数(如0.001),可先定义参数(如RC=0.001),提高代码可读性与可修改性。

四、核心实战二:状态空间模型创建(复杂系统必备)

状态空间模型以时域为基础,通过状态方程(x˙=Ax+Bu\dot{x}=Ax+Bu)和输出方程(y=Cx+Duy=Cx+Du)描述系统,适合多输入多输出(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电路的状态方程为:x˙=1RCx+1RCu\dot{x} = -\frac{1}{RC}x + \frac{1}{RC}u,输出方程为:y=xy = x,完整创建代码如下:

% 一阶系统(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 状态空间建模新手避坑指南

  1. 四元组(A、B、C、D)的矩阵维度必须匹配:A为n×n(n为状态变量个数),B为n×p(p为输入个数),C为q×n(q为输出个数),D为q×p;
  2. 若需查看状态空间模型的详细属性,可使用sys.Asys.B等命令,直接提取对应矩阵;
  3. 转换为传递函数时,MIMO系统会输出多个传递函数(对应输入与输出的组合),属于正常现象;
  4. 新手可先从一阶、二阶系统入手,掌握标准型状态空间模型,再逐步拓展到复杂系统。

五、核心实战三:模型之间的转换与验证(工程必备)

在工程实际中,常需要根据分析需求进行模型转换(传递函数↔状态空间↔零极点增益),MATLAB提供了便捷的转换函数,核心转换关系如下:

  1. 传递函数→状态空间:sys_ss = ss(sys_tf)
  2. 状态空间→传递函数:sys_tf = tf(sys_ss)
  3. 传递函数→零极点增益:sys_zpk = zpk(sys_tf)
  4. 零极点增益→传递函数: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 模型验证核心技巧

  1. 最直观的验证方法是阶跃响应仿真step()函数),不同模型的响应曲线应完全一致;
  2. 可通过damp()函数查看系统的极点、阻尼比等指标,验证转换后模型的参数是否与原始模型一致;
  3. 对于复杂系统,可提取模型的核心指标(如稳态值、超调量),对比不同模型的结果,确保转换正确。

六、工程实战:多模块系统建模(串联/并联/反馈)

在工程实际中,系统通常由多个模块组成,常见的连接方式有串联、并联、反馈,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;