回上方

第13堂課

一維空間的彈性碰撞

牛頓擺影片

_images/collide.png
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# -*- coding: utf8 -*-
# 匯入視覺化套件
from vpython import *

#  1.  畫面設定
scene = canvas(width=600, height=400, background=vector(0.5,0.6,0.5))
arrow1 = arrow(pos=vector(-1,0,0), axis=vector(2,0,0), shaftwidth=0.005)
arrow2 = arrow(pos=vector(0,0,0), axis=vector(0,0.3,0), shaftwidth=0.005)

gd1 = graph(title='v vs t', xtitle='t', ytitle='v', ymax=1, xmax=2, background=vector(0.3,0.3,0.3))
vt1 = gcurve(graph=gd1, color=vector(0.5,0.5,0.5))
vt2 = gcurve(graph=gd1, color=color.orange)

#  2.  物體設定
ball_iron = sphere(radius=0.05, pos=vector(-0.2,0,0), texture=textures.metal)
ball_iron.m = 4
ball_iron.v = 0.25

ball_pingpong = sphere(radius=0.02, pos=vector(0.1,0,0), color=color.orange)
ball_pingpong.m = 0.2
ball_pingpong.v = 0

#  3.  定義函數
def collide(v1,v2,m1,m2):
    v1f = v1*(m1-m2)/(m1+m2) + v2*2*m2/(m1+m2)
    v2f = v1*2*m1/(m2+m1) + v2*(m2-m1)/(m2+m1)
    return v1f, v2f

#  4.  物體運動
dt = 0.001
t = 0
while t < 2:
    rate(200)
    t += dt
    ball_iron.pos.x = ball_iron.pos.x + ball_iron.v * dt
    vt1.plot(pos=(t, ball_iron.v))
    ball_pingpong.pos.x = ball_pingpong.pos.x + ball_pingpong.v * dt
    vt2.plot(pos=(t, ball_pingpong.v))

    if mag(ball_iron.pos-ball_pingpong.pos) < (ball_iron.radius+ball_pingpong.radius):
        ball_iron.v, ball_pingpong.v = collide(ball_iron.v,ball_pingpong.v,ball_iron.m,ball_pingpong.m)

作業:

以做不同質量的兩球的碰撞的觀察,球1撞球2。

(1)球1的質量等於球2。

(2)球1的質量遠大於球2。

(3)球1的質量遠小於球2。

以上三種情況選擇其中一種繳交作業即可,並寫下觀察心得。


本單元課程自2018.7.5日起已被瀏覽 241