## 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}]"}