弹簧倒立摆系统的数值仿真与分析

一、系统建模与动力学方程

弹簧倒立摆是一个经典的非线性动力学系统,由质量块、弹簧和摆杆组成。考虑一个水平面上的弹簧倒立摆系统:

O (支点)
         |
         | 弹簧 (k)
         |
         ● m (质量块)
        / \
       /   \ 杆 (l)
      /     \
     ● M (摆锤)

动力学方程推导

使用拉格朗日方程建立系统动力学模型:

1.广义坐标: x:质量块的水平位移 θ:摆杆与竖直方向的夹角

2.动能

\(T=\frac{1}{2}M(\dot{x}^2+l^2\dot{θ}^2+2l\dot{x}\dot{θ}sinθ)+\frac{1}{2}m\dot{x}^2\)

3.势能

\(V=\frac{1}{2}kx^2−Mglcosθ\)

4.拉格朗日函数

\(L=T−V\)

5.运动方程

二、MATLAB数值仿真实现

1. 系统参数设置

% ================ 系统参数设置 ================
m = 0.5;       % 质量块质量 (kg)
M = 1.0;       % 摆锤质量 (kg)
l = 0.5;       % 摆杆长度 (m)
k = 20;        % 弹簧刚度 (N/m)
g = 9.81;      % 重力加速度 (m/s²)
c = 0.1;       % 阻尼系数 (N·s/m)

% 初始条件
x0 = 0.1;      % 初始位移 (m)
dx0 = 0;       % 初始速度 (m/s)
theta0 = 0.1;  % 初始角度 (rad)
dtheta0 = 0;   % 初始角速度 (rad/s)

% 仿真参数
tspan = [0 10]; % 仿真时间范围 (s)
options = odeset('RelTol',1e-6,'AbsTol',1e-6);

2. 微分方程定义

% ================ 动力学方程 ================
function dydt = spring_inverted_pendulum(t, y, m, M, l, k, g, c)
    % 状态变量分解
    x = y(1);
    dx = y(2);
    theta = y(3);
    dtheta = y(4);
    
    % 非线性项计算
    sin_theta = sin(theta);
    cos_theta = cos(theta);
    sin_2theta = sin(2*theta);
    
    % 方程组
    denom = M + m*sin_theta^2;
    dx2 = (k*x - c*dx + m*l*dtheta^2*sin_theta - m*g*sin_theta*cos_theta) / denom;
    dtheta2 = (g*sin_theta - dx2*cos_theta/l - 2*dx*sin_theta*dtheta/(l*cos_theta)) / l;
    
    % 返回导数
    dydt = [dx; dx2; dtheta; dtheta2];
end

3. 主仿真程序

% ================ 主仿真程序 ================
% 初始状态向量
y0 = [x0; dx0; theta0; dtheta0];

% 求解微分方程
[t, y] = ode45(@(t,y) spring_inverted_pendulum(t, y, m, M, l, k, g, c), tspan, y0, options);

% 提取结果
x = y(:,1);
dx = y(:,2);
theta = y(:,3);
dtheta = y(:,4);

三、结果可视化与分析

1. 运动状态可视化

% ================ 动画演示 ================
figure('Position', [100, 100, 800, 600])
for i = 1:10:length(t)
    clf
    
    % 绘制弹簧和质量块
    plot([0, x(i)], [0, 0], 'b-o', 'LineWidth', 2, 'MarkerSize', 10)
    hold on
    
    % 绘制摆杆和摆锤
    pendulum_x = x(i) + l*sin(theta(i));
    pendulum_y = -l*cos(theta(i));
    plot([x(i), pendulum_x], [0, pendulum_y], 'r-s', 'LineWidth', 3, 'MarkerSize', 15)
    
    % 绘制轨迹
    plot(x(1:i), zeros(1,i), 'g--', 'LineWidth', 1)
    
    % 图形美化
    axis equal
    axis([-1 1 -1 1])
    title(sprintf('Time: %.2f s', t(i)))
    xlabel('x (m)')
    ylabel('y (m)')
    grid on
    drawnow
end

2. 时间序列分析

% ================ 时间序列图 ================
figure('Position', [100, 100, 1200, 800])

subplot(2,2,1)
plot(t, x, 'b-', 'LineWidth', 1.5)
title('质量块位移')
xlabel('时间 (s)')
ylabel('位移 (m)')
grid on

subplot(2,2,2)
plot(t, theta, 'r-', 'LineWidth', 1.5)
title('摆杆角度')
xlabel('时间 (s)')
ylabel('角度 (rad)')
grid on

subplot(2,2,3)
plot(t, dx, 'g-', 'LineWidth', 1.5)
title('质量块速度')
xlabel('时间 (s)')
ylabel('速度 (m/s)')
grid on

subplot(2,2,4)
plot(t, dtheta, 'm-', 'LineWidth', 1.5)
title('摆杆角速度')
xlabel('时间 (s)')
ylabel('角速度 (rad/s)')
grid on

3. 相空间分析

% ================ 相图分析 ================
figure('Position', [100, 100, 1200, 500])

subplot(1,2,1)
plot(x, dx, 'b.')
title('质量块相图 (x vs dx)')
xlabel('位移 (m)')
ylabel('速度 (m/s)')
grid on

subplot(1,2,2)
plot(theta, dtheta, 'r.')
title('摆杆相图 (θ vs dθ)')
xlabel('角度 (rad)')
ylabel('角速度 (rad/s)')
grid on

四、系统特性分析

1. 平衡点稳定性分析

% ================ 平衡点稳定性 ================
syms x theta dx dtheta real
eq1 = (M+m)*dx^2 + M*l*dtheta^2*sin(theta) + M*l*cos(theta)*diff(dtheta,t) + k*x == 0;
eq2 = l*diff(dtheta,t) + diff(dx,t)*sin(theta) - g*sin(theta) == 0;

% 线性化在平衡点 (x=0, θ=0)
A = jacobian([(M+m)*diff(dx,t,2) + M*l*diff(dtheta,t,2)*sin(0) + M*l*dtheta^2*cos(0) + k*x, ...
             l*diff(dtheta,t,2) + diff(dx,t,2)*sin(0) - g*sin(0)], [x, dx, theta, dtheta]);
A = subs(A, {diff(dx,t), diff(dtheta,t)}, {0, 0});
A = double(subs(A, {x, dx, theta, dtheta}, {0, 0, 0, 0}));

% 特征值分析
eigenvalues = eig(A);
disp('系统雅可比矩阵特征值:');
disp(eigenvalues);

2. 能控性与能观性分析

% ================ 能控性分析 ================
B = [0; 1; 0; 0]; % 控制输入矩阵 (假设在质量块上施加力)
C = eye(4);       % 输出矩阵 (全状态反馈)
D = zeros(4,1);   % 直接传输矩阵

Co = ctrb(A, B);
rank_Co = rank(Co);
disp(['能控性秩: ', num2str(rank_Co)]);

% ================ 能观性分析 ================
Ob = obsv(A, C);
rank_Ob = rank(Ob);
disp(['能观性秩: ', num2str(rank_Ob)]);

五、控制器设计与仿真

1. LQR控制器设计

% ================ LQR控制器设计 ================
Q = diag([10, 1, 100, 10]); % 状态权重矩阵
R = 0.01;                   % 控制输入权重

% 求解Riccati方程
[K, S, e] = lqr(A, B, Q, R);
disp('LQR增益矩阵:');
disp(K);

% ================ 闭环系统仿真 ================
% 修改微分方程加入控制力
u = -K * [x; dx; theta; dtheta]; % 控制律
dydt_cl = @(t,y) spring_inverted_pendulum(t, y, m, M, l, k, g, c) + [0; u(1); 0; u(3)];

% 求解闭环系统
[t_cl, y_cl] = ode45(dydt_cl, tspan, y0, options);

2. PID控制器设计

% ================ PID控制器 ================
% 定义PID控制函数
pid_control = @(t, y) pid_controller(t, y, m, M, l, k, g, c);

% PID参数
Kp = 50; Ki = 10; Kd = 5;

% 闭环系统仿真
[t_pid, y_pid] = ode45(@(t,y) closed_loop_system(t, y, m, M, l, k, g, c, Kp, Ki, Kd), tspan, y0, options);

% PID控制器函数
function u = pid_controller(t, y, m, M, l, k, g, c)
    persistent integral_error prev_error
    if isempty(integral_error)
        integral_error = 0;
        prev_error = 0;
    end
    
    % 误差定义 (保持摆杆竖直)
    error_angle = y(3);
    error_pos = y(1);
    
    % PID计算
    integral_error = integral_error + error_angle;
    derivative = (error_angle - prev_error);
    prev_error = error_angle;
    
    u = Kp*error_angle + Ki*integral_error + Kd*derivative;
end

六、混沌行为研究

1. 参数扫描分析

% ================ 参数扫描 ================
k_values = linspace(5, 50, 20); % 弹簧刚度范围
max_theta = zeros(size(k_values));

for i = 1:length(k_values)
    % 更新参数
    k_temp = k_values(i);
    
    % 仿真系统
    [t_temp, y_temp] = ode45(@(t,y) spring_inverted_pendulum(t, y, m, M, l, k_temp, g, c), tspan, y0, options);
    
    % 记录最大角度
    max_theta(i) = max(abs(y_temp(:,3)));
end

% 绘制参数扫描结果
figure
plot(k_values, max_theta, 'bo-', 'LineWidth', 2)
xlabel('弹簧刚度 (N/m)')
ylabel('最大摆角 (rad)')
title('参数扫描: 弹簧刚度对系统响应的影响')
grid on

2. Poincaré截面分析

% ================ Poincaré截面 ================
% 每隔一个驱动周期采样一次
sampling_interval = 2*pi*sqrt(m/k); % 系统固有周期
sampling_times = 0:sampling_interval:max(t);

% 插值获取采样点
theta_samples = interp1(t, y(:,3), sampling_times);
dtheta_samples = interp1(t, y(:,4), sampling_times);

% 绘制Poincaré截面
figure
plot(theta_samples, dtheta_samples, 'ro')
title('Poincaré截面 (θ vs dθ)')
xlabel('角度 (rad)')
ylabel('角速度 (rad/s)')
axis equal
grid on

七、三维可视化

% ================ 三维相空间可视化 ================
figure
plot3(y(:,1), y(:,3), y(:,4), 'b-', 'LineWidth', 1.5)
hold on
plot3(y(1,1), y(1,3), y(1,4), 'go', 'MarkerSize', 10, 'MarkerFaceColor', 'g')
plot3(y(end,1), y(end,3), y(end,4), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r')
title('三维相空间轨迹')
xlabel('位移 (m)')
ylabel('角度 (rad)')
zlabel('角速度 (rad/s)')
grid on
view(30, 30)

参考代码 弹簧倒立摆数值仿真 www.youwenfan.com/contentcnn/82906.html

八、结论与应用

1. 系统特性总结

  1. 非线性特性:弹簧倒立摆表现出显著的非线性行为,特别是在大角度偏转时
  2. 混沌现象:在特定参数范围内,系统呈现混沌行为
  3. 稳定区域:通过适当控制,可以使不稳定的倒立摆稳定在竖直位置
  4. 能量交换:系统存在明显的动能和势能转换

2. 工程应用

  1. 机器人平衡控制:双足行走机器人的平衡控制
  2. 航空航天:火箭姿态控制、卫星天线稳定
  3. 振动控制:精密仪器的隔振平台
  4. 汽车工程:主动悬架系统设计

3. 扩展研究方向

  1. 时滞控制:考虑执行器延迟的控制策略
  2. 随机激励:加入随机扰动的研究
  3. 多体系统:多个倒立摆耦合系统
  4. 智能控制:神经网络、模糊控制等先进算法应用
posted @ 2025-12-08 15:51  w199899899  阅读(0)  评论(0)    收藏  举报