美文网首页
Exercise_09 :chapt 3: 台球的混沌问题

Exercise_09 :chapt 3: 台球的混沌问题

作者: XVVUII | 来源:发表于2016-11-21 07:59 被阅读0次

Abstract

  • 本篇将探讨在一个出现了一点偏差的圆形台球桌内台球的运动轨迹。(圆形的台球桌什么的本来就很诡异了吧)

  • I have a ball.
    ~~I have a table. ~~
    Ahhh...
    Billi-ard!
  • ~~I have a Python. ~~
    ~~I have a H.Cai. ~~
    Ahhhhhhh...
    Chaoooooooos!
  • ~Billi-ard~~
    Chaoooooooos
    Ahhhhhhh.........
    Ahhhhhhhhhh.........
    Ahhhhhhhhhhhhhhhh.........

Background

  • 台球本身是件很有意思的事,球在有限的区域内被桌沿或其他的球反弹,逐渐按照既定的速滚走向既定的方向,将目标球击落袋。


  • 假如你把它放进物理里,就会显得更()加()有()趣()。
  • 我们将探讨一个球在圆形桌内的运动,以及当那个圆并不那么圆时,球在那个不那么圆的圆桌内的运动。

What a Weird Shape!

  • 这个问题我们也将其简化,我们认为球在桌上的运动是无耗散的,可以永远地滚下去。
  • 同时我们也认为,球在边缘上的反弹是完美的:

入射与反射角相等

  • 当球碰到边缘时,我们将这样处理他的碰壁和反弹:
...
    x_next = self.x[-1] + self.vx * self.dt
    y_next = self.y[-1] + self.vy * self.dt
# 下一个点没有越界
if x_next ** 2 + (abs(y_next) - self.alpha) ** 2 < 1:
    self.x.append(x_next)
    self.y.append(y_next)
if abs(self.y[-1]) < 0.001:
    self.ps_vx.append(self.vx)
    self.ps_x.append(self.x[-1])
# 下个点成功越界,计算碰撞点并计算碰撞后速度
else:
    divisor = 2
# 往回走一点点
while divisor <= 2048:
    x_next -= (self.vx * self.dt / divisor)
    y_next -= (self.vy * self.dt / divisor)
# 当下个点与边界距离在误差允许范围内时,跳出 loop
if abs(x_next ** 2 + (abs(y_next) - self.alpha) ** 2 - 1) < 0.00001:
    divisor = 10000
# 如果刚刚往回走过了,撤销那一步,下一次走得再小一点
...
  • 碰撞后,我们采用(level.6)矢量操作的方式计算碰撞后的速度。
  • 可以得到轨迹图:
我可以盯着它看上一天.gif
  • 考虑当alpha = 0.1时,两个仅有微小初始值差异的台球的运动轨迹区别,弄了张动图,matplotlib 库做了一点微小的贡献
冲啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊.gif
  • 上图,可以预见二者分离度将在600以后达到1上下,也就是说两个系统将完全分离,


  • 上图,台球十分争气地滚得乱七八糟(逃)

  • alpha = 0.1,可以看到在500s内他的偏差都是很小的,只有-6的指数级别,但是当我们把时间增加一倍,从500s增加到1000s的时候:


  • 两个小球也几乎没有产生大的偏差,那么当球桌是个正圆的时候呢?

  • 两个球的分离度几乎肉眼不可见(废话!)

Pure Code


Acknowledgements!

  • 磊锅锅张磊 (就冲着这名字我也得把你从致谢里删了_(:D」∠)_)

相关文章

网友评论

      本文标题:Exercise_09 :chapt 3: 台球的混沌问题

      本文链接:https://www.haomeiwen.com/subject/pftupttx.html