Python 三维空间小球弹性碰撞结果模拟问题

问题描述:

编写一个spheres.py 的程序

输入要求:

1.球1的质量是20,半径是1。它的初始位置是(0,0,0)和初始值
速度是(0,0,1)
球2的质量是2,半径是5。其初始位置为(0,1,100)和初始位置
速度是(0,0,0)


2.当程序遇到文件结束符(EOF或ctrl-D)时,它意味着所有
物体已经进入,模拟应该开始了。


3.球的数量没有限制。

4.当程序运行时像这样:
python spheres.py 120 14.5
这意味着容器半径是120米,结束
模拟时间为14.5秒

5.所有质量、半径、位置都可以是任意浮点数。
碰撞极限是一个正整数。

输出结果:

6.首先输出初始情况,包括容器半径,最大碰撞,和
每个球的状态

7.然后报告:
•每次碰撞(球体对球体)
•每个反射(球体到容器)
在每次碰撞或反射后,报告所有球的情况,包括
新速度。


8.当没有更多的事件时,程序应该退出并返回代码0。

每个浮点数都应该使用:g格式说明符来打印,如
 f"{x:g}"

https://hackmd.io/@yizhewang/H1-59qBMm?type=view类似的例题

#输入示例,三个命名的小球以及初始状态

20 1 0 0 0 0 0 1 one  #球one的质量20,半径是1。初始位置是(0,0,0)初始速度是(0,0,1)
2 5 0 1 100 0 0 0 two
3 1 2 -1 -2 0 0 0 three

执行python spheres.py 120 105 的输出为

#程序一旦知道了初始条件,就会首先输出
初始情况,包括容器半径,最大碰撞,和
每个球的状态。
Here are the initial conditions.
universe radius 120.0
end simulation 105
one m=20 R=1 p=(0,0,0) v=(0,0,1)
two m=2 R=5 p=(0,1,100) v=(0,0,0)
three m=3 R=1 p=(2,-1,-2) v=(0,0,0)
energy: 10
momentum: (0,0,20)


#然后报告
#每次碰撞(球体对球体)
#每个反射(球体到容器)
#在每次碰撞或反射后,报告所有球的情况,包括新速度。
#当没有更多的事件时,程序应该退出并返回代码0。
Here are the events.
time of event: 94.0839
colliding one two
one m=20 R=1 p=(0,0,94.0839) v=(0,-0.0298792,0.823232)
two m=2 R=5 p=(0,1,100) v=(0,0.298792,1.76768)
three m=3 R=1 p=(2,-1,-2) v=(0,0,0)
energy: 10
momentum: (0,0,20)
time of event: 102.539
reflecting two
one m=20 R=1 p=(0,-0.252632,101.044) v=(0,-0.0298792,0.823232)
two m=2 R=5 p=(0,3.52632,114.946) v=(0,0.189874,-1.78267)
three m=3 R=1 p=(2,-1,-2) v=(0,0,0)
energy: 10
momentum: (0,-0.217836,12.8993)






 



"""
 1. 參數設定, 設定變數及初始值
"""
m1, r1, c1, v1 = 1, 1, color.blue, vec(8, 0, 0)     # 小球1質量, 半徑, 顏色, 初速
m2, r2, c2, v2 = 2, 1, color.red, vec(0, 0, 0)      # 小球2質量, 半徑, 顏色, 初速
L, t, dt = 10, 0, 0.001    # 畫面邊長, 時間, 時間間隔


# 計算撞後速度的函式
def af_col_v(m1, m2, v1, v2, x1, x2):
    v1_prime = v1 + (2*m2)/(m1 + m2) * dot((v2 - v1), (x1 - x2)) / mag2(x1 - x2) * (x1 - x2) 
    v2_prime = v2 + (2*m1)/(m1 + m2) * dot((v1 - v2), (x2 - x1)) / mag2(x2 - x1) * (x2 - x1)
    return (v1_prime, v2_prime)

"""
 3. 物體運動部分, 小球到達畫面邊緣時停止運作
"""
# 印出撞前動能
K1 = 0.5*b1.m*b1.v.mag2
K2 = 0.5*b2.m*b2.v.mag2
print("K1 =", K1, "K2 =", K2, "K =", K1 + K2)

while(abs(b1.pos.x) < L and abs(b1.pos.y) < L and abs(b2.pos.x) < L and abs(b2.pos.y) < L):
    rate(500)
# 更新小球位置
    b1.pos += b1.v*dt
    b2.pos += b2.v*dt

# 若 b1、b2 相撞則計算撞後速度並重新指定給 v1, v2
    if(mag(b1.pos - b2.pos) <= r1 + r2 and dot((b1.pos - b2.pos), (b1.v - b2.v)) <=0):
        b1.v, b2.v = af_col_v(b1.m, b2.m, b1.v, b2.v, b1.pos, b2.pos)
        cm = sphere(pos=(b1.pos + b2.pos)/2, radius=r1/5, color=color.yellow)
# 更新時間
    t += dt

# 印出撞後動能
K1 = 0.5*b1.m*b1.v.mag2
K2 = 0.5*b2.m*b2.v.mag2
print("K1 =", K1, "K2 =", K2, "K =", K1 + K2)

这是链接的代码

你好,我是问答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。