文章目录
- 说明
- 1. 动力学模型
- 2. 仿真
-
- 程序1:位置先于速度更新
- 程序2:速度更新先于位置更新
- 3. 分析
-
- 问题1:仅仅换了更新位置,为什么会出现这么大的差别呢?
- 问题2:为什么步长影响会这么大?
- 4. 总结
- 声明
说明
今年3月初,博主西涯先生提出一个很有意思的问题,他在仿真动力学的时候发现速度更新和位置更新顺序不同,导致结果大不相同! 今天突然想起来这件事,先记录一下。
1. 动力学模型
对于一个单杆系统,假设理想情况,不受外力影响且无阻尼,建立动力学模型如下:
字母就不标注了,反正大家都能看懂!
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)
位置更新在速度更新之前,由于没有外界能力输入,不可能产生振动现象,该程序仿真结果明显有问题!
程序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)
位置更新在速度更新之后,由于不受外界影响,连杆在重力作用下产生完美的简谐运动!
另外,西涯先生发现仿真步长选取的不同,仿真结果也会有影响。
- 对于程序1而言,仿真步长越大,仿真结果越不理想!仿真图如下:
对于程序2而言,不管仿真如何变化,最终结果相差不大!仿真图如下:
3. 分析
问题1:仅仅换了更新位置,为什么会出现这么大的差别呢?
我们来分析一下,首先来看动力学模型,对于t tt时刻而言,它的状态有:
整理一下:
我们可以看到,这个顺序恰恰就是程序2的数据更新顺序,所以程序2仿真结果完全没有问题! 对于程序1而言,把位置更新放在速度更新之前,模型变成:
对于同一时刻而言,模型方程是成立的!但是,我们采用的是近似积分法,这就会导致,位置的更新是基于上一时刻的速度更新的,而理想情况下应该是基于当前速度更新才会使得误差为0!所以问题就处在这儿!
问题2:为什么步长影响会这么大?
对于步长足够小的情况下,上一时刻的速度近似等于该时刻的速度,即微元取的越小,仿真误差就会越小;而随着步长的不断扩大,此时t − 1 t-1t−1时刻速度已经严重滞后于t tt时刻,这时候如果还用这种近似等效思想显然误差会足够大! 于是也就不难理解这种现象的产生了!
4. 总结
以上问题的产生,归根到底来自理论与实际方法的不同上! 总的来说,程序2的情况在现实生活中并不存在!大多数情况下,我们的控制可能更接近于程序1中的情况,注意是接近! 现实情况中,采样、计算都需要时间,这就会造成延迟现象,这种延迟会导致我们计算的结果跟理想情况并非处在同一时刻,所以当计算频率足够快时这种由延时引起的方法误差可以忽略不计,但如果延迟非常大,同样无法实现理想效果。 再回想一下采样定理,想想是不是这么个道理!
声明
本文转载得到博主西涯先生的许可,基于原文增加分析环节,素材使用请联系西涯先生,本文转载请注明出处。