MATLAB的一级倒立摆控制仿真:探索与实践
MATLAB的一级倒立摆控制仿真
在控制系统的研究领域中,一级倒立摆是一个经典且极具代表性的案例。它看似简单,却涵盖了诸多复杂的控制理论与技术。借助MATLAB强大的仿真功能,我们能够深入剖析一级倒立摆的控制原理,并进行高效的仿真验证。
什么是一级倒立摆
想象一个杆子,底部安装在一个可移动的小车上,通过控制小车的水平移动,让杆子始终保持直立不倒。这就是一级倒立摆的基本模型。从控制角度看,它是一个典型的不稳定、非线性系统,对其实现稳定控制极具挑战性,也正因如此,它成为了研究控制算法的绝佳平台。
MATLAB 建模
建立数学模型
首先要为一级倒立摆建立数学模型,这是仿真的基础。通过牛顿力学定律,我们可以推导出系统的动力学方程。假设小车质量为 \( M \),摆杆质量为 \( m \),摆杆长度为 \( l \),作用在小车上的力为 \( F \),摆杆与垂直方向的夹角为 \( \theta \)。经过一系列推导(此处省略详细推导过程),我们得到如下状态空间方程:
\[
\dot{\mathbf{x}} = \left[
\begin{array}{cccc}
0 & 1 & 0 & 0 \\
0 & 0 & \frac{mg}{M} & 0 \\
0 & 0 & 0 & 1 \\
0 & 0 & \frac{(M + m)g}{Ml} & 0
\end{array}
\right]
\mathbf{x} +

\left[
\begin{array}{c}
0 \\
\frac{1}{M} \\
0 \\
\frac{1}{Ml}
MATLAB的一级倒立摆控制仿真
\end{array}
\right]
u
\]
其中 \( \mathbf{x} = \left[

\begin{array}{c}
x \\
\dot{x} \\
\theta \\
\dot{\theta}
\end{array}
\right] \) 是状态向量, \( u = F \) 是控制输入。
MATLAB 代码实现
% 参数定义
M = 1; % 小车质量
m = 0.1; % 摆杆质量
l = 0.5; % 摆杆长度
g = 9.81; % 重力加速度
% 状态空间矩阵
A = [0 1 0 0;
0 0 m*g/M 0;
0 0 0 1;
0 0 (M + m)*g/(M*l) 0];
B = [0; 1/M; 0; 1/(M*l)];
C = [1 0 0 0; 0 0 1 0];
D = [0; 0];
sys = ss(A, B, C, D);
在这段代码中,我们首先定义了模型所需的各项参数,如小车质量、摆杆质量、摆杆长度以及重力加速度。接着,根据之前推导的状态空间方程构建了 \( A \)、\( B \)、\( C \)、\( D \) 矩阵,最后使用 ss 函数创建了状态空间模型 sys。这个模型将作为后续控制算法设计与仿真的基础。
控制算法设计
线性二次型调节器(LQR)
LQR 是一种常用的最优控制算法,它通过最小化一个二次型性能指标来确定最优控制输入。对于一级倒立摆系统,性能指标可以定义为:
\[
J = \int_{0}^{\infty} (\mathbf{x}^T Q \mathbf{x} + u^T R u) dt
\]
其中 \( Q \) 和 \( R \) 是加权矩阵,通过调整它们的值可以平衡系统状态与控制输入的权重。
MATLAB 代码实现
% LQR参数
Q = [100 0 0 0;
0 1 0 0;
0 0 100 0;
0 0 0 1];
R = 1;
% 求解LQR增益
[K, S, E] = lqr(A, B, Q, R);
在这段代码里,我们定义了加权矩阵 \( Q \) 和 \( R \)。这里的 \( Q \) 矩阵对状态变量 \( x \) 和 \( \theta \) 赋予了较大权重,以确保系统能快速稳定这些关键状态;而 \( R \) 矩阵相对较小,意味着对控制输入的变化较为宽容。然后使用 lqr 函数求解出最优反馈增益矩阵 \( K \),这个增益矩阵将用于后续仿真中计算控制输入。
仿真与结果分析
搭建仿真模型
有了系统模型和控制算法,接下来就可以在MATLAB的Simulink环境中搭建仿真模型。在Simulink中,我们将之前创建的状态空间模型 sys 作为被控对象,通过反馈环节结合计算得到的增益矩阵 \( K \) 生成控制输入。
运行仿真并分析结果
% 初始条件
x0 = [0; 0; 0.1; 0];
% 仿真时间
tspan = 0:0.01:10;
% 仿真
[t, x] = ode45(@(t, x) (A - B*K)*x, tspan, x0);
% 绘图
figure;
subplot(2,1,1);
plot(t, x(:, 1));
xlabel('时间 (s)');
ylabel('小车位置 (m)');
title('小车位置响应');
subplot(2,1,2);
plot(t, x(:, 3)*180/pi);
xlabel('时间 (s)');
ylabel('摆杆角度 (度)');
title('摆杆角度响应');
这段代码首先设定了系统的初始状态 \( x0 \),其中摆杆有一个初始的小角度偏差。然后定义了仿真时间范围 tspan,使用 ode45 函数对系统进行数值求解,这里的 @(t, x) (A - BK)x 表示闭环系统的状态方程。最后通过绘图展示了小车位置和摆杆角度随时间的变化。
从仿真结果可以看到,在LQR控制器的作用下,尽管摆杆初始有一定角度偏差,但随着时间推移,小车位置和摆杆角度都能快速收敛到稳定状态,验证了LQR算法在一级倒立摆控制中的有效性。

通过这次MATLAB的一级倒立摆控制仿真之旅,我们不仅深入理解了倒立摆系统的控制原理,还实际体验了从建模、算法设计到仿真验证的完整过程,感受到MATLAB在控制系统研究中的强大助力。希望这篇文章能为同样对控制领域感兴趣的朋友提供一些启发和帮助。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)