在控制系统的设计和分析中,数学建模是基础且至关重要的步骤。数学模型可以描述系统的动态行为,帮助我们理解和预测系统的响应。本节将详细介绍控制系统的数学建模方法,包括传递函数、状态空间模型和频域分析。
传递函数是一种常用的数学模型,用于描述线性时不变(LTI)系统的输入输出关系。传递函数是在复频域(s域)中表示的,可以方便地进行系统的分析和设计。
传递函数定义为系统输出的拉普拉斯变换与输入的拉普拉斯变换之比,假设系统的初始状态为零。对于一个单输入单输出(SISO)系统,其传递函数可以表示为:
G ( s ) = Y ( s ) U ( s ) G(s) = \frac{Y(s)}{U(s)} G(s)=U(s)Y(s)
其中, Y ( s ) Y(s) Y(s)是输出的拉普拉斯变换, U ( s ) U(s) U(s)是输入的拉普拉斯变换。
拉普拉斯变换是一种将时域信号转换为复频域信号的数学工具,其定义为:
L { f ( t ) } = F ( s ) = ∫ 0 ∞ f ( t ) e − s t d t \mathcal{L}\{f(t)\} = F(s) = \int_{0}^{\infty} f(t) e^{-st} dt L{f(t)}=F(s)=∫0∞f(t)e−stdt
拉普拉斯变换可以将微分方程转换为代数方程,从而简化系统的分析和设计。
假设有一个二阶线性系统,其微分方程为:
a 2 d 2 y ( t ) d t 2 + a 1 d y ( t ) d t + a 0 y ( t ) = b 1 d u ( t ) d t + b 0 u ( t ) a_2 \frac{d^2y(t)}{dt^2} + a_1 \frac{dy(t)}{dt} + a_0 y(t) = b_1 \frac{du(t)}{dt} + b_0 u(t) a2dt2d2y(t)+a1dtdy(t)+a0y(t)=b1dtdu(t)+b0u(t)
对上述方程进行拉普拉斯变换,假设初始状态为零,可以得到:
a 2 s 2 Y ( s ) + a 1 s Y ( s ) + a 0 Y ( s ) = b 1 s U ( s ) + b 0 U ( s ) a_2 s^2 Y(s) + a_1 s Y(s) + a_0 Y(s) = b_1 s U(s) + b_0 U(s) a2s2Y(s)+a1sY(s)+a0Y(s)=b1sU(s)+b0U(s)
整理后得到传递函数:
G ( s ) = Y ( s ) U ( s ) = b 1 s + b 0 a 2 s 2 + a 1 s + a 0 G(s) = \frac{Y(s)}{U(s)} = \frac{b_1 s + b_0}{a_2 s^2 + a_1 s + a_0} G(s)=U(s)Y(s)=a2s2+a1s+a0b1s+b0
传递函数具有以下性质:
在 MATLAB 中,可以使用 tf
函数创建传递函数。以下是一个例子:
% 定义传递函数
num = [1 2]; % 分子系数
den = [1 3 2]; % 分母系数
G = tf(num, den);
% 显示传递函数
disp(G);
上述代码定义了一个传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2。
状态空间模型是一种更通用的数学模型,适用于描述多输入多输出(MIMO)系统。状态空间模型通过一组一阶微分方程来描述系统的动态行为。
状态空间模型通常表示为以下形式:
x ˙ ( t ) = A x ( t ) + B u ( t ) \dot{\mathbf{x}}(t) = \mathbf{A} \mathbf{x}(t) + \mathbf{B} \mathbf{u}(t) x˙(t)=Ax(t)+Bu(t)
y ( t ) = C x ( t ) + D u ( t ) \mathbf{y}(t) = \mathbf{C} \mathbf{x}(t) + \mathbf{D} \mathbf{u}(t) y(t)=Cx(t)+Du(t)
其中:
考虑一个二阶系统,其微分方程为:
d 2 y ( t ) d t 2 + 3 d y ( t ) d t + 2 y ( t ) = 2 u ( t ) \frac{d^2y(t)}{dt^2} + 3 \frac{dy(t)}{dt} + 2 y(t) = 2 u(t) dt2d2y(t)+3dtdy(t)+2y(t)=2u(t)
定义状态变量 x ( t ) = [ x 1 ( t ) , x 2 ( t ) ] T \mathbf{x}(t) = [x_1(t), x_2(t)]^T x(t)=[x1(t),x2(t)]T,其中 x 1 ( t ) = y ( t ) x_1(t) = y(t) x1(t)=y(t)和 x 2 ( t ) = d y ( t ) d t x_2(t) = \frac{dy(t)}{dt} x2(t)=dtdy(t)。则状态空间模型为:
x ˙ ( t ) = [ 0 1 − 2 − 3 ] x ( t ) + [ 0 2 ] u ( t ) \dot{\mathbf{x}}(t) = \begin{bmatrix} 0 & 1 \\ -2 & -3 \end{bmatrix} \mathbf{x}(t) + \begin{bmatrix} 0 \\ 2 \end{bmatrix} \mathbf{u}(t) x˙(t)=[0−21−3]x(t)+[02]u(t)
y ( t ) = [ 1 0 ] x ( t ) \mathbf{y}(t) = \begin{bmatrix} 1 & 0 \end{bmatrix} \mathbf{x}(t) y(t)=[10]x(t)
在 MATLAB 中,可以使用 ss
函数创建状态空间模型。以下是一个例子:
% 定义状态空间模型
A = [0 1; -2 -3];
B = [0; 2];
C = [1 0];
D = 0;
sys = ss(A, B, C, D);
% 显示状态空间模型
disp(sys);
上述代码定义了一个状态空间模型,描述了二阶系统的动态行为。
频域分析是控制系统设计中常用的一种方法,通过频率响应来研究系统的稳定性、性能和鲁棒性。频域分析的主要工具包括频率响应函数、Bode图和Nyquist图。
频率响应函数 G ( j ω ) G(j\omega) G(jω)描述了系统在不同频率下的输入输出关系。它可以通过将传递函数 G ( s ) G(s) G(s)中的 s s s替换为 j ω j\omega jω来获得。
Bode图是一种常用的频域分析工具,用于显示系统的幅频特性和相频特性。Bode图通常包括两个子图:幅频特性图和相频特性图。
在 MATLAB 中,可以使用 bode
函数生成 Bode 图。以下是一个例子:
% 定义传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 生成 Bode 图
bode(G);
grid on;
上述代码生成了传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2的 Bode 图。
Nyquist图是另一种常用的频域分析工具,用于显示系统的开环频率响应。Nyquist图可以直观地判断系统的稳定性。
在 MATLAB 中,可以使用 nyquist
函数生成 Nyquist 图。以下是一个例子:
% 定义传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 生成 Nyquist 图
nyquist(G);
grid on;
上述代码生成了传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2的 Nyquist 图。
控制系统的稳定性是设计和分析中的一个重要方面。稳定性分析可以通过传递函数的极点、Nyquist图和Routh-Hurwitz判据来进行。
系统的极点是传递函数的分母多项式的根。如果所有极点都位于复频域的左半平面,系统是稳定的。
Routh-Hurwitz判据是一种判断系统稳定性的方法,通过构造Routh表来判断系统的稳定性。如果Routh表的首列所有元素均为正,则系统稳定。
在 MATLAB 中,可以使用 isstable
函数判断系统的稳定性。以下是一个例子:
% 定义传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 判断系统的稳定性
is_stable = isstable(G);
% 显示结果
disp(['系统是否稳定: ', num2str(is_stable)]);
上述代码判断了传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2的稳定性。
Nyquist稳定性判据通过分析Nyquist图来判断系统的稳定性。如果Nyquist图在负实轴上没有穿越点,并且逆时针绕过(-1,0)点的次数等于不稳定极点的数目,则系统稳定。
在 MATLAB 中,可以使用 nyquist
函数结合 margin
函数来判断系统的稳定性。以下是一个例子:
% 定义传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 生成 Nyquist 图
nyquist(G);
grid on;
% 计算相位裕度和增益裕度
[GM, PM, Wcg, Wcp] = margin(G);
% 显示结果
disp(['增益裕度: ', num2str(GM)]);
disp(['相位裕度: ', num2str(PM)]);
上述代码生成了传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2的 Nyquist 图,并计算了系统的增益裕度和相位裕度。
控制系统的性能指标用于评估系统的响应速度、稳态误差和鲁棒性。常见的性能指标包括上升时间、峰值时间、超调量、稳态误差和带宽。
上升时间 t r t_r tr是从系统响应达到稳态值的10%到90%所需的时间。
峰值时间 t p t_p tp是从系统响应开始到达到第一个峰值所需的时间。
超调量 M p M_p Mp是系统响应的最大值超过稳态值的百分比。
稳态误差 e s s e_{ss} ess是在稳态时系统响应与期望值之间的误差。
带宽 ω b \omega_b ωb是系统频率响应的截止频率,通常定义为幅频特性下降到-3dB的频率。
在 MATLAB 中,可以使用 stepinfo
函数来计算系统的性能指标。以下是一个例子:
% 定义传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 生成阶跃响应
step(G);
% 计算性能指标
step_info = stepinfo(G);
% 显示结果
disp(['上升时间: ', num2str(step_info.RiseTime)]);
disp(['峰值时间: ', num2str(step_info.PeakTime)]);
disp(['超调量: ', num2str(step_info.Overshoot)]);
disp(['稳态误差: ', num2str(step_info.SteadyStateValue - step_info.SettlingMin)]);
disp(['带宽: ', num2str(bandwidth(G))]);
上述代码生成了传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2的阶跃响应,并计算了系统的上升时间、峰值时间、超调量、稳态误差和带宽。
一阶系统的传递函数通常形式为:
G ( s ) = K τ s + 1 G(s) = \frac{K}{\tau s + 1} G(s)=τs+1K
其中, K K K是增益, τ \tau τ是时间常数。
% 定义一阶系统的传递函数
K = 2;
tau = 1;
G = tf(K, [tau 1]);
% 生成 Bode 图
bode(G);
grid on;
% 生成阶跃响应
step(G);
% 计算性能指标
step_info = stepinfo(G);
disp(['上升时间: ', num2str(step_info.RiseTime)]);
disp(['峰值时间: ', num2str(step_info.PeakTime)]);
disp(['超调量: ', num2str(step_info.Overshoot)]);
disp(['稳态误差: ', num2str(step_info.SteadyStateValue - step_info.SettlingMin)]);
上述代码定义了一阶系统的传递函数 G ( s ) = 2 s + 1 G(s) = \frac{2}{s + 1} G(s)=s+12,并生成了其 Bode 图和阶跃响应,计算了相应的性能指标。
二阶系统的传递函数通常形式为:
G ( s ) = K ω n 2 s 2 + 2 ζ ω n s + ω n 2 G(s) = \frac{K \omega_n^2}{s^2 + 2 \zeta \omega_n s + \omega_n^2} G(s)=s2+2ζωns+ωn2Kωn2
其中, K K K是增益, ω n \omega_n ωn是自然频率, ζ \zeta ζ是阻尼比。
% 定义二阶系统的传递函数
K = 1;
omega_n = 2;
zeta = 0.5;
G = tf([K * omega_n^2], [1 2 * zeta * omega_n omega_n^2]);
% 生成 Bode 图
bode(G);
grid on;
% 生成阶跃响应
step(G);
% 计算性能指标
step_info = stepinfo(G);
disp(['上升时间: ', num2str(step_info.RiseTime)]);
disp(['峰值时间: ', num2str(step_info.PeakTime)]);
disp(['超调量: ', num2str(step_info.Overshoot)]);
disp(['稳态误差: ', num2str(step_info.SteadyStateValue - step_info.SettlingMin)]);
上述代码定义了二阶系统的传递函数 G ( s ) = 4 s 2 + 2 s + 4 G(s) = \frac{4}{s^2 + 2s + 4} G(s)=s2+2s+44,并生成了其 Bode 图和阶跃响应,计算了相应的性能指标。
多输入多输出(MIMO)系统的传递函数可以表示为矩阵形式。每个元素 G i j ( s ) G_{ij}(s) Gij(s)表示第 j j j个输入对第 i i i个输出的传递函数。
% 定义 MIMO 系统的传递函数
G11 = tf([1 2], [1 3 2]);
G12 = tf([1], [1 1]);
G21 = tf([1], [1 2]);
G22 = tf([1 1], [1 3 2]);
% 创建 MIMO 系统
sys = [G11, G12; G21, G22];
% 生成 Bode 图
bode(sys);
grid on;
% 生成阶跃响应
step(sys);
上述代码定义了一个 2x2 的 MIMO 系统,并生成了其 Bode 图和阶跃响应。
非线性系统不能用传递函数或简单的状态空间模型来描述。非线性系统的建模方法包括描述函数法和相平面法。
描述函数法是一种近似方法,通过将非线性环节近似为线性环节来分析系统的稳定性。描述函数 N ( A ) N(A) N(A)表示非线性环节的幅频特性和相频特性。
相平面法通过绘制系统的相轨迹来分析系统的动态行为。相轨迹是系统状态变量之间的关系图。
在 MATLAB 中,可以使用 ode45
函数来求解非线性系统的微分方程。以下是一个例子:
% 定义非线性系统的微分方程
function dxdt = nonlinear_system(t, x)
u = 1; % 输入
dxdt = [x(2); -x(1) + x(2)^2 + u];
end
% 初始状态
x0 = [0; 0];
% 求解微分方程
[t, x] = ode45(@nonlinear_system, [0 10], x0);
% 绘制相轨迹
figure;
plot(x(:,1), x(:,2));
xlabel('x_1');
ylabel('x_2');
title('相轨迹');
grid on;
上述代码定义了一个非线性系统的微分方程,并使用 ode45
函数求解系统在输入为1时的状态变量 x 1 x_1 x1和 x 2 x_2 x2的变化,绘制了相轨迹图。
控制系统仿真可以帮助我们验证系统的性能和稳定性。MATLAB 和 Simulink 是常用的仿真工具。
在 MATLAB 中,可以使用 lsim
函数进行系统仿真。lsim
函数可以模拟系统的时域响应,适用于各种输入信号。以下是一个例子:
% 定义传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 输入信号
t = 0:0.01:10; % 时间向量
u = sin(t); % 正弦输入信号
% 进行仿真
[y, t] = lsim(G, u, t);
% 绘制仿真结果
figure;
plot(t, y);
xlabel('时间 (s)');
ylabel('输出');
title('系统对正弦输入的响应');
grid on;
上述代码定义了一个传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2,并使用 lsim
函数模拟系统对正弦输入信号的响应,最后绘制了时域响应图。
Simulink 是 MATLAB 的一个扩展工具箱,用于进行复杂的控制系统仿真。Simulink 提供了图形化的建模环境,可以方便地构建和仿真控制系统。
simulink
命令或从 MATLAB 菜单中选择 Simulink 选项。以传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2为例,以下是 Simulink 仿真的具体步骤:
打开 Simulink:
simulink;
新建模型:
添加模块:
连接模块:
配置参数:
运行仿真:
查看结果:
通过仿真,我们可以观察系统的时域响应、频域响应和稳定性。以下是一些常见的分析方法:
在控制系统设计中,优化系统的性能是一个重要的步骤。常见的优化方法包括根轨迹法、频率响应法和状态反馈法。
根轨迹法通过分析闭环系统的极点随控制器参数变化的轨迹,来设计控制器。根轨迹法可以帮助我们选择合适的控制器参数,以达到期望的系统性能。
在 MATLAB 中,可以使用 rlocus
函数绘制系统的根轨迹。以下是一个例子:
% 定义开环传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 绘制根轨迹
rlocus(G);
grid on;
% 添加增益值
k_values = [0.1, 1, 10];
for k = k_values
sys ClosedLoop = feedback(k*G, 1);
hold on;
plot(pole(sys ClosedLoop), 'o');
end
% 显示结果
legend('根轨迹', 'k=0.1', 'k=1', 'k=10');
上述代码绘制了开环传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2的根轨迹,并在图中标注了不同增益值下的闭环极点。
频率响应法通过分析系统的频率特性来设计控制器。常见的频率响应法包括Bode图和Nyquist图。
在 MATLAB 中,可以使用 bode
和 nyquist
函数结合 margin
函数来设计控制器。以下是一个例子:
% 定义开环传递函数
num = [1 2];
den = [1 3 2];
G = tf(num, den);
% 生成 Bode 图
figure;
bode(G);
grid on;
% 计算相位裕度和增益裕度
[GM, PM, Wcg, Wcp] = margin(G);
% 显示结果
disp(['增益裕度: ', num2str(GM)]);
disp(['相位裕度: ', num2str(PM)]);
% 生成 Nyquist 图
figure;
nyquist(G);
grid on;
上述代码生成了开环传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2的 Bode 图和 Nyquist 图,并计算了系统的相位裕度和增益裕度。
状态反馈法通过反馈系统的状态变量来设计控制器。状态反馈法适用于状态空间模型。
在 MATLAB 中,可以使用 place
函数设计状态反馈控制器。以下是一个例子:
% 定义状态空间模型
A = [0 1; -2 -3];
B = [0; 2];
C = [1 0];
D = 0;
sys = ss(A, B, C, D);
% 选择期望的闭环极点
desired_poles = [-2, -4];
% 设计状态反馈控制器
K = place(A, B, desired_poles);
% 闭环系统
A_closed = A - B * K;
sys_closed = ss(A_closed, B, C, D);
% 生成阶跃响应
figure;
step(sys_closed);
grid on;
% 计算性能指标
step_info = stepinfo(sys_closed);
disp(['上升时间: ', num2str(step_info.RiseTime)]);
disp(['峰值时间: ', num2str(step_info.PeakTime)]);
disp(['超调量: ', num2str(step_info.Overshoot)]);
disp(['稳态误差: ', num2str(step_info.SteadyStateValue - step_info.SettlingMin)]);
上述代码定义了一个状态空间模型,并使用 place
函数设计了状态反馈控制器,使闭环系统的极点位于指定的位置。最后,生成了闭环系统的阶跃响应,并计算了相应的性能指标。
鲁棒性分析是评估控制系统在参数变化或外部干扰下的稳定性和性能的重要步骤。常见的鲁棒性分析方法包括灵敏度分析和不确定性分析。
灵敏度分析通过计算系统输出对参数变化的灵敏度,来评估系统的鲁棒性。灵敏度 S ( s ) S(s) S(s)定义为:
S ( s ) = 1 1 + G ( s ) H ( s ) S(s) = \frac{1}{1 + G(s)H(s)} S(s)=1+G(s)H(s)1
其中, G ( s ) G(s) G(s)是前向通道传递函数, H ( s ) H(s) H(s)是反馈通道传递函数。
在 MATLAB 中,可以使用 sensitivity
函数计算系统的灵敏度。以下是一个例子:
% 定义前向通道传递函数
G = tf([1 2], [1 3 2]);
% 定义反馈通道传递函数
H = tf(1, 1);
% 计算闭环灵敏度
S = sensitivity(G, H);
% 生成 Bode 图
figure;
bode(S);
grid on;
上述代码定义了一个前向通道传递函数 G ( s ) = s + 2 s 2 + 3 s + 2 G(s) = \frac{s + 2}{s^2 + 3s + 2} G(s)=s2+3s+2s+2和反馈通道传递函数 H ( s ) = 1 H(s) = 1 H(s)=1,并计算了闭环系统的灵敏度,生成了 Bode 图。
不确定性分析通过引入不确定参数来评估系统在参数变化或模型误差下的性能和稳定性。常见的不确定性模型包括加性和乘性不确定性。
在 MATLAB 中,可以使用 robuststab
函数进行系统的鲁棒稳定性分析。以下是一个例子:
% 定义名义传递函数
G_nom = tf([1 2], [1 3 2]);
% 定义不确定性传递函数
delta = ultidyn('delta', [1 1]);
G_unc = G_nom * (1 + 0.1 * delta);
% 分析鲁棒稳定性
[stabmarg, wcu] = robuststab(G_unc);
% 显示结果
disp(['稳定裕度: ', num2str(stabmarg.StabilityMargin)]);
disp(['临界频率: ', num2str(stabmarg.CriticalFrequency)]);
上述代码定义了一个名义传递函数 G n o m ( s ) = s + 2 s 2 + 3 s + 2 G_{nom}(s) = \frac{s + 2}{s^2 + 3s + 2} Gnom(s)=s2+3s+2s+2和一个带有不确定性的传递函数 G u n c ( s ) G_{unc}(s) Gunc(s),并使用 robuststab
函数分析了系统的鲁棒稳定性。
数学建模是控制系统设计和分析的基础。本节介绍了传递函数、状态空间模型和频域分析的方法,并通过 MATLAB 和 Simulink 进行了详细的实现和仿真。此外,还讨论了控制系统的稳定性分析、性能指标和鲁棒性分析的方法。通过这些方法,我们可以更好地理解和优化控制系统的性能和稳定性。