【思考题】小球平抛落地动画(续一)在MC中实现触发
mathcad吧
全部回复
仅看楼主
level 12
朱老剑客 楼主
在“小球平抛落地动画”中,https://tieba.baidu.com/p/3302500443,@go活宝哈哈 从Inside Mathcad中找到了灵感,但我仍旧觉得Inside Mathcad中给出的结果不是我想要的。
我不想用微分方程来解这道题,这个题目本身是高一的物理知识,牛顿运动力学范畴的,如果能够用牛顿运动力学的那套公式来求解出来自然是最理想的了。
我感觉在这里最难的是实现触发机制,也就是当达到某一个条件的时候,其中的一个变量需要变化,而且保持这个变化进行之后的计算,直到再次发生这个条件再会发生变化。
小球落地问题还比较容易,是一个质点的运动速度发生条件变化(当撞击地面的时候,速度方向发生改变),但如果要解决一般情况动量守恒问题,比如说两个球相撞,或者n个球相撞,求每个球的运动轨迹,如果没有触发机制,纯粹使用微分方程求解的话,是很难建模的。
更不用提解决“交通流”问题了,https://tieba.baidu.com/p/3554491924。
触发机制,可以不必考虑整个仿真过程,而只是用条件来约束仿真中的变量变化,当发生了某个条件时,即触发了一种变化,这对于解决不确定系统的问题来说,基本上就和VisSim、Simulink的动态求解是一样的了,就可以处理比较复杂的动力学问题了。
我用“月城case语句”在下面的程序中初步实现了触发:
这个程序只是一个雏形,稳定性鲁棒性很差,求解结果对dt的取值太敏感。
我把源程序上传了,http://1000eb.com/13e2y
如何优化这个程序,以提高它的求解稳定性,希望得到各位的帮助。
我感觉在MC中实现触发机制意义重大,可以使MC从静态求解领域向动态求解迈进,用MC处理“系统动力学”问题也就不是神话了。
2015年03月30日 16点03分 1
level 12
朱老剑客 楼主
和Inside Mathcad的微分方程解比较了一下,它是先假设小球的弹跳符合带阻尼的简谐运动,我这里没有什么假设,而且用到了空气阻力,运动过程中的速度衰减,是碰撞的间隔时间逐次减小,而在Inside Mathcad中速度衰减并未减小碰撞的间隔时间(首先他的微分方程中就已经假设振荡频率为10Hz了)。
我用2D绘图“跟踪”读出了Inside Mathcad解中每次撞地的时间,并求相邻撞地的时间差:
是一样的,都是0.316s,这和实际情况是不符合的。常识告诉我们,往地上扔一个球,听球撞击地面的声音,是越来越快的,而不是像节拍器一样等间隔的。
不过,Inside Mathcad中给出了我上面的程序中鲁棒性不好的原因:
(1)我所设计的步长dt也非常有可能实际计算结果“不合拍”,应该在每次撞击的时候,h[i≤r时,将h[i-1归0,并重新计算,这样就不会出现当dt取值过大时,振荡下滑的情况了。
(2)用root求解合拍的步长,这确实是一个好主意,既然自己设计的步长不是过大就是过小,那就让MC自己找步长,如此撞击时间也是准确的,也就更符合实际情况。不过这种调整步长的方法在这个for循环中怎么实现,这需要调整for后面的计算序列,我还没想明白——调整dt会起作用么?
而且我感觉Inside Mathcad中的那个例子,当恢复系数r=1时,如果简单使用|Y(pos,vel)|,与它得到的结果应该是一样的,也就是说它虚张声势的那么一大块程序板仅仅是给这个振荡在每次弹跳时候乘以了一个r=0.7的恢复系数(我查wiki“恢复系数”是专业术语,用我的话说就是“弹性势能衰减系数”),并调整了所有撞击点y坐标都在0上,在第二个程序中,还通过root对撞击点的x坐标进行了微调,但峰值的位置都是一样的:
Inside Mathcad中r=1的解:
第一个程序:
第二个程序:
我的|Y(pos,vel)|解:
如此看,尽管Inside Mathcad给出了很不错的解决思路,但小球平抛落地的建模问题仍旧没有得到很好解决。
2015年03月30日 17点03分 2
level 1
确实感觉如此,所有mathcad的书中对没有给出对阶段切换(楼主说的触发问题)的解决办法。
2015年04月01日 03点04分 3
1