## Vpython-加速度運動四部曲 #### by 蘇昱全 Switch --- ## 第二部分:恢復係數 ---- ## 物理概念 ---- 恢復係數在物理上有個嚴謹的定義(見末頁補充), 不過在此我們可以簡化成下式 \\[ e=\frac{u}{v} \\] 也就是\\(u=v\times e\\) 其中\\(v\\)是初速度,\\(u\\)是末速度 而且恢復係數本身無單位 ---- #### 定義數值 ```= from vpython import * #如果是線下版的必須加這句 r = 2 #球半徑 L = 40 #地板長度 g = vec(0,-9.8,0) #我們必須區分上下,“ - ” 代表方向向下 m = 1 #物體質量(not so nessesary) h = 10 #落下高度 e = 0.9 #這次多了這個,代表恢復係數 dt = 0.001 #時間間隔 t = 0 #時間 ``` ---- #### 建立環境、物件 ```vpython=12 scene = canvas(title = "Free Fall", width = 400, height = 400, x = 0, y = 0, center = vec(0,10,0), background = color.cyan) floor = box(pos = vec(0,0,0), size = vec(L,0.05*L,10), color = color.green) ball = sphere(pos = vec(0,h,0), radius = r, v = vec(0,0,0), a = vec(0,0,0), texture = texture.earth) ``` ---- #### 物理模擬 這裡就要小心囉,我們要讓它碰到地能夠彈起,因此要判斷觸地與否 我們會用一個if達到此事 ```python if ball.pos.y - r <= floor.pos.y + floor.size.y/2 ball.v = -ball.v * e # "-"的目的在於改變方向 ``` ---- 完整程式 ```python=16 while True: #要一直做下去 rate(1000) F = m*g ball.pos += ball.v*dt ball.a = F/m ball.v += ball.a*dt xt.plot(pos = (t,mag(ball.pos))) vt.plot(pos = (t,mag(ball.v))) at.plot(pos = (t,mag(ball.a))) if ball.pos.y - r <= floor.pos.y + floor.size.y/2 ball.v = -ball.v * e # "-"的目的在於改變方向 t = t + dt ``` ---- [成果展示](https://www.glowscript.org/#/user/andysu960816/folder/MyPrograms/program/Tutorial-FreeFallwithe) ---- ### 一個小思考 當你畫出了此物體的\\(y-t\\)圖,你可能會發現: **\\(y\\)的最低點不是\\(0\\)耶!**(好吧我太激動了) 問題來了: 1. 為什麼會這樣呢? 2. 想要讓地板位置為\\(x=0\\)要怎麼修正呢? ---- ## 補:恢復係數的定義 ---- 真正的恢復係數的物理定義是這樣子的: 有兩物體A、B,分別擁有初速度\\(v_a\\)、\\(v_b\\) 他們碰撞之後,又分別擁有末速度\\(u_a\\)、\\(u_b\\) 這時我們就把恢復係數定義為: \\[ e=|\frac{u_a-u_b}{v_a-v_b}| \\] 註:所以其實一般情況下\\(0\le e \le 1\\) ---- 那我們為什麼可以簡化成\\(e=\frac{u}{v}\\)? 因為就算你的球打到了地面,地也不會動啊, 所以\\(v_b\\)、\\(u_b\\)根本就是\\(0\\),也就是說 \\[ e=|\frac{u_a-u_b}{v_a-v_b}|=|\frac{u_a-0}{v_a-0}|=|\frac{u_a}{v_a}| \\] --- # 謝謝大家
{"title":"Vpython-恢復係數","contributors":"[{\"id\":\"084e105f-92be-4605-b399-8d3c0ef40c64\",\"add\":2756,\"del\":805}]"}
    68 views