EDA365电子论坛网

标题: 在MATLAB中实现模拟小球上抛和反弹运动 [打印本页]

作者: ulppknot    时间: 2020-3-3 13:57
标题: 在MATLAB中实现模拟小球上抛和反弹运动
在高中物理中我就学到物体的平抛运动,今天我们在这里也老调重弹下,再次来回顾下这个经典的过程,不过这次讲解的要比之前平抛运动稍微复杂一些:0 p% X( I# A8 j2 T( J5 ~- Q' i! v

" c4 Q6 z' G5 j1 B( X7 s小球的上抛运动的完整过程描述如下:) _0 x; w1 N, U: Z: @9 o+ f

2 q: A. Y. N/ f+ |4 @3 a. d/ e1、我们站在高度为H的看台上抛一个小球
  d8 B' X  E" Z% `) e2、上抛的初速度为V,角度为θ; V# D# L# D. L
3、小球与空气摩擦力与速度成正比,摩擦系数为μ8 i  e1 H/ J. q6 w6 N% |8 W
4、小球撞地之后能量损失,速度变为原来的k倍,然后继续反弹
, L/ r) F: p3 V9 t3 s6 u5 n" j, t0 N3 ]4 R4 l# q; [
在上面基础上我们继续讨论,比如我们高炮部队,要给予敌方阵地毁灭一击,那么:1 X. X" |# b  l: N* x
' y+ K) M* d3 S; }
1、在已知炮弹初速度V的情况下,以什么角度θ,能使炮弹飞的最远
& g2 D4 R/ I$ C4 e2、在已知炮弹初速度V和敌方阵地水平距离L的情况下,发射角度θ等于多少时,能整好命中敌方
6 d; A& B2 S" X- Q7 ^2 z- Q$ W8 u
, a/ D) o4 n- p3 D# P/ r; g哈哈,这几个问题好像不是高中的平抛运动能够解决的哦。其实原理和小球的运动方程很容易建立,但是求解起来是有些麻烦的。
' M/ d5 [9 h" l1 Y* _8 C' q+ @6 B* K( S; y
我们本次教程这里介绍如何使用MATLAB求解并模拟这个问题,主要设计的内容有:% S3 J7 ^2 n* t

! C1 _( i% H, }1、小球运动微分法方程求解
$ C, _& y9 z! Q* H2 b6 {2、小球着陆时,过零点检测(重点)
6 f  b0 W& l/ Q3、小球反弹运动轨迹模拟. e) T; S1 p; c% }8 b, b# r
4、炮弹飞行距离目标最优化5 B2 ^) L% O  u2 Z1 c
5、发射角度θ的数值求解$ c1 S+ v8 K! i8 i% E7 }" @$ L

% x: ~6 g5 m8 R
) o4 V2 F2 G# r. ^; M: @由于教程的内容很多,这次主要讲解前三个问题,后两个问题留在稍候的下次教程中讲解!!!- X& k1 }; G. b  K

0 d) b' h; S7 x
; s6 [! i+ j. S# b2 l+ R* d) n' L% R' ?. k4 j3 o1 R( Y3 m
小球空中运动方程,只要稍微有一点高中物理和高等数学基础的朋友应该都可以看懂这个方程吧:
! A6 W" E& Z# \  l+ Y$ A! s  u4 P
, O6 x0 S. P6 B9 {
1 d8 C' X1 I- K
上面是相当简单的一个常微分方程组,要求解这个方程组也相当容易,MATLAB提供的ode45函数足以胜任。4 k0 P  R# N+ M3 {
6 h1 p/ _; x, l
编写主函数main.m
) {7 [- i0 H- c' K: `, z

5 H2 g1 u. D6 k
, E& ^$ j! }: v( `3 q2 O! O8 ]
. H4 S; k, g' u8 g继续编写微分方程组描述函数odefun.m' i: ?5 F* h3 x
- `  {1 T1 h/ ?/ K; S5 v; l6 o1 m
. @4 B, n: I, }) A& T3 `
5 l( Z9 ]2 n6 u% z" m: u
运行之后我们得到如下结果:! i# o( m, O8 F. J" ?% j+ I" g0 D. @
% o0 P7 g9 r2 [, R9 r. I

# V* N$ j5 n6 w8 [, R0 p* }
4 s! i4 v) D. t  _8 y( m% p& K: \) `6 e
从上面的“小球运动轨迹图形”可看出,小球在水平位移265米左右就撞地了,小球撞地以后会反弹,显然上图撞地之后的数据就是无效的。+ b1 j0 M+ G0 B# f. @
4 j% v4 y: M( X
但是要模拟小球的着陆撞击反弹过程,我们希望程序能够自动检测到那个小球撞击的时刻,听起来好像有些深奥哦,其实这个也没什么高深的,因为MATLAB的ode45函数早就为我们考虑到这点了,此时只需要设置ODE方程的一个过零点检测,也就是设置ode45函数的events属性即可。
2 h1 Y$ |+ J$ d/ O& P" @% O$ p1 F. }9 _0 _
修改main.m函数,主要是通过options参数添加events事件检测(黄色部分):( q% q$ w  T4 V$ t$ q4 G
* _4 c2 B) y$ ]. ~* k

; _% q* q. F) t1 G
) P! j1 f* g) s, |3 @; K& L) ~7 n1 {: f- x
编写events.m文件描述需要检测的事件(过零点检测):
4 S7 A0 ?6 N" _
! J1 ^* j/ v5 \( h' R
0 X2 h3 z9 n: @: C0 D( H
; F' K0 ^" x! G6 f2 r, [' B
再次运行程序,得到如下运动轨迹图:# u1 x; Y) v9 U$ |* `

, P0 j5 J$ }( A- E
: e$ `' n7 [+ r, }) b1 s2 H; F! R8 R; R) r7 [
从图形可以看出,程序在检测到小球着陆,也就是Y=0时自动终止程序运行了,并通过ode45的te和xe参数返回事件发生的时刻te和此时所有的状态参数xe。
. l' ]/ E7 z5 `+ P! [: A  O
& @& l  d: }( d' w) s之前的工作我们已经完成了方程求解和零点检测,但是还是没有完整的描述整个小球上抛运动的过程呀,比如反弹就没有。我们希望程序能够自动将整个过程都能够展现出来。
) E4 t- T! O, |
' H) r. s+ U2 K: I0 x有些网络是不是想说:“是不是MATLAB的ode45函数也为我们考虑到这点,并早已经准备好了某个函数或者参数提供给我们直接调用呀?”哈哈,这次很惋惜的告诉您,这个需要我们自己动手丰衣足食了,MATLAB不总是靠得住的,毕竟软件是死的,人是活的。。。。6 F3 d: X% |% f* K3 c  R

. |; b$ h0 y1 ?, ~% o) d' Q) _4 J对于反弹以及全过程描述,其实也不难!我们只要在检测到撞地点以后,以撞击时候的参数为初值继续求解微分方程,这样一直下去。最后将所有的小过程连接起来,于是完整的小球上抛和反弹过程就可以展现出来了!每个小过程的求解,我们可以在循环语句中进行!
* @7 C5 |4 o/ V: ]  s1 ?6 j5 [; B0 x' l' A5 w
于是重新修改(黄色部分)main.m函数:! L0 {' g1 g* M( l/ U8 b5 v
) b8 C; f: T- ^& T) p% {
- A, \+ P# [# A" s( E
% x( C& F9 {* O! {' ]
0 V5 `, X2 y& \( w. T  L+ t% f
重新运行main函数,可以到小球上抛以反弹运动的完整过程了:
# v: G' i2 H4 ]" n' T4 m( t) w7 S. [

/ P- I6 i% \, r) I 17 分钟前 上传
: s6 A8 V2 Y# ~6 M下载附件 (36.32 KB)
9 X6 ~5 b! k$ }& Y  k  v9 b# ?1 o: n3 d- x: F; ^
' I( F- F2 f2 w: Y- p! V- |9 m

4 I* s4 i, X: h% L: B3 _8 Q- u: ?

+ U9 L! d6 G9 ?: h7 n
1 f( |6 L, }; s! a9 W
作者: CCxiaom    时间: 2020-3-3 16:33
在MATLAB中实现模拟小球上抛和反弹运动




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2