文章目录

  • 说明
  • 1. 动力学模型
  • 2. 仿真
    • 程序1:位置先于速度更新
    • 程序2:速度更新先于位置更新
  • 3. 分析
    • 问题1:仅仅换了更新位置,为什么会出现这么大的差别呢?
    • 问题2:为什么步长影响会这么大?
  • 4. 总结
  • 声明

说明

  今年3月初,博主西涯先生提出一个很有意思的问题,他在仿真动力学的时候发现速度更新位置更新顺序不同,导致结果大不相同!   今天突然想起来这件事,先记录一下。  

1. 动力学模型

  对于一个单杆系统,假设理想情况,不受外力影响且无阻尼,建立动力学模型如下:   1   字母就不标注了,反正大家都能看懂!   2  

2. 仿真

 

程序1:位置先于速度更新

 
clc;
clear all;
close all;
format long e

%% 参数初始化
T = 10; 
period = 0.01; 
m = 1;
g = 9.8;
L = 0.01;
J = 0.01;
theta = 0.5;
w = 0;
tau = 0;
Record = [];

%% 开始仿真
for t = 0:period:T
    % 计算力矩
    tau = -m*g*L*sin(theta);
    % 位置更新
    theta = theta + period*w;
    % 速度更新
    w = w + period * tau/J;
    % 记录数据
    Record = [Record;t, theta, w, tau];
end

%% 绘图
plot(Record(:,1),Record(:,2)*180/pi, 'g',"LineWidth", 3)
xlabel("时间(s)","FontSize", 20)
ylabel("角度(^。)","FontSize", 20)
  3  
位置更新在速度更新之前,由于没有外界能力输入,不可能产生振动现象,该程序仿真结果明显有问题!
 

程序2:速度更新先于位置更新

 
clc;
clear all;
close all;
format long e

%% 参数初始化
T = 10; 
period = 0.01; 
m = 1;
g = 9.8;
L = 0.01;
J = 0.01;
theta = 0.5;
w = 0;
tau = 0;
Record = [];

%% 开始仿真
for t = 0:period:T
    % 计算力矩
    tau = -m*g*L*sin(theta);
    % 速度更新
    w = w + period * tau/J;
    % 位置更新
    theta = theta + period*w;
    % 记录数据
    Record = [Record;t, theta, w, tau];
end

%% 绘图
plot(Record(:,1),Record(:,2)*180/pi, 'g',"LineWidth", 3)
xlabel("时间(s)","FontSize", 20)
ylabel("角度(^。)","FontSize", 20)
  4  
位置更新在速度更新之后,由于不受外界影响,连杆在重力作用下产生完美的简谐运动!
另外,西涯先生发现仿真步长选取的不同,仿真结果也会有影响。
  • 对于程序1而言,仿真步长越大,仿真结果越不理想!仿真图如下:
5   对于程序2而言,不管仿真如何变化,最终结果相差不大!仿真图如下:   6  

3. 分析

问题1:仅仅换了更新位置,为什么会出现这么大的差别呢?

我们来分析一下,首先来看动力学模型,对于t tt时刻而言,它的状态有:   7   整理一下:   8   我们可以看到,这个顺序恰恰就是程序2的数据更新顺序,所以程序2仿真结果完全没有问题! 对于程序1而言,把位置更新放在速度更新之前,模型变成:   9   对于同一时刻而言,模型方程是成立的!但是,我们采用的是近似积分法,这就会导致,位置的更新是基于上一时刻的速度更新的,而理想情况下应该是基于当前速度更新才会使得误差为0!所以问题就处在这儿!  

问题2:为什么步长影响会这么大?

  对于步长足够小的情况下,上一时刻的速度近似等于该时刻的速度,即微元取的越小,仿真误差就会越小;而随着步长的不断扩大,此时t − 1 t-1t1时刻速度已经严重滞后于t tt时刻,这时候如果还用这种近似等效思想显然误差会足够大!   于是也就不难理解这种现象的产生了!  

4. 总结

  以上问题的产生,归根到底来自理论与实际方法的不同上!   总的来说,程序2的情况在现实生活中并不存在!大多数情况下,我们的控制可能更接近于程序1中的情况,注意是接近!   现实情况中,采样、计算都需要时间,这就会造成延迟现象,这种延迟会导致我们计算的结果跟理想情况并非处在同一时刻,所以当计算频率足够快时这种由延时引起的方法误差可以忽略不计,但如果延迟非常大,同样无法实现理想效果。   再回想一下采样定理,想想是不是这么个道理!  

声明

本文转载得到博主西涯先生的许可,基于原文增加分析环节,素材使用请联系西涯先生,本文转载请注明出处。