---
# System prepended metadata

title: 'Lesson08: 自由落體運動'
tags: [多元選修, 自由落體運動, vpython, 運動科學模擬]

---

<font color=#008000>
    
>作者: 吳姿瑩
>更新:2022.11.03 
</font>[color=#008000]

# Lesson08: 自由落體運動
###### tags: `運動科學模擬` `多元選修` `vpython` `自由落體運動`

## :memo:自由落體物理觀念
- 自由落體運動為一維運動，只受萬有引力作用在鉛直方向運動，根據 $\vec{F}=m\vec{a}=m\vec{g}$，$y$方向作等加速度運動，故可得
(1). $\vec{v} = \vec{v_0} + \vec{a}t$
(2). $\overrightarrow{\Delta{x}}=\vec{v_0}t+\frac{1}{2}\vec{a}t^2$
(3). $v^2=v_0^2+2\vec{a}\cdot\vec{\Delta{x}}$
其中在地表重力加速度$g=9.8 m/s^2$

- 根據國中理化所學物體運動，具有動能$E_k=\frac{1}{2}mv^2$，可知當自由落下時速度會愈來愈快，動能$E_k$愈來愈大
## :memo:設置一個物體sphere自由落下
<iframe width="560" height="315" src="https://www.youtube.com/embed/lClo_D3dyt8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### 1.參數設定
|**意涵** |**設定**|
|-----|--------|
|圓球質量 1kg|m = 1       |
|圓球半徑 1m   |R = 1      |
|圓球初始高度 20 m|H = 20|
|圓球初速度(靜止落下)|v = 0|
|圓球加速度|g = 9.8|
|初始時間|t = 0|
|時間間隔|dt = 0.01|
|地板厚度| thin = 0.01|

### 2.畫面設定
- 前一堂課有關畫布canvas的設定，請設定title="1D Motion", caption='自由落下'的畫布
- 利用box設定一個地板
- 設定一球sphere，位置==從地板高度H==自由落下(==注意球的半徑、地板厚度==)，初速度為$\vec{v}=(0, 0, 0)$，加速度為$\vec{a}=(0, -g, 0)$
```javascript=1
ball = sphere(pos=vec(0, H + R + thin*0.5, 0), radius=R, 
              color=color.red, v=vec(0, 0, 0), a=vec(0, -g, 0))
```
- 需畫出五個圖(1)y-t圖 (2)v~y~-t圖 (3)a~y~-t圖 (4)E~k~-t圖 (5)E~k~-h圖，gd需開設5個畫布(==注意畫布的大小以及y位置==)，圖的名稱可定義為gd、gd_vel、gd_a、gd_ener、gd_ener_h
```javascript=1
yt = gcurve(graph=gd, color=color.red)
vt = gcurve(graph=gd_vel, color=color.red)
at = gcurve(graph=gd_a, color=color.red)
Et = gcurve(graph=gd_ener, color=color.red)
Ety = gcurve(graph=gd_ener_h, color=color.red)
``` 

### 3.物體的運動
- 當球的位置觸及地板時(==注意球的半徑、地板的厚度==)，則結束while迴圈
```
while(ball.pos.y - floor.pos.y >= R + thin*0.5):
```
- 每一時刻更新球的位置、速度、動能
  (1)位置根據初位置、位移大小$\overrightarrow{\Delta{x}}=\vec{v_0}t+\frac{1}{2}\vec{a}t^2$，其中v~0~初速度為0，更新每一時刻的位置
```
ball.pos.y = H + R + thin/2 + (v*t + 0.5*ball.a.y*t**2)
```
  (2)根據等加速度運動，每一時刻速度大小為$\vec{v} = \vec{v_0} + \vec{a}t$，其中v~0~初速度為0
```
ball.v.y   = v + ball.a.y*t
```
以下為更新物體運動的完整程式碼
```javascript=1
while(ball.pos.y - floor.pos.y >= R + thin*0.5):
    rate(1000)

    ball.v.y   = v + ball.a.y*t
    ball.pos.y = H + R + thin/2 + (v*t + 0.5*ball.a.y*t**2)
    ball_ener = 0.5*m*ball.v.y**2

    yt.plot(pos = (t, ball.pos.y))
    vt.plot(pos = (t, ball.v.y))
    at.plot(pos = (t, ball.a.y))
    Et.plot(pos = (t, ball_ener))
    Ety.plot(pos = (ball.pos.y, ball_ener))

    t += dt
```
- 請求出(print)球落下所需的時間
:::spoiler **自由落下 完整程式碼**
```javascript=1
""
Auther   :吳姿瑩
Date     :2022/08/18
version  :python3.10.6 vpython7
chapter  :自由落下
"""

from vpython import *

"""
 1. 參數設定, 設定變數及初始值
"""
m = 1         # 圓球質量 1kg
R = 1         # 圓球半徑
H = 20        # 圓球初始高度 20 m
v = 0         # 圓球初速度(靜止落下)
g = 9.8       # 圓球加速度
t = 0         # 時間
dt = 0.01     # 時間間隔
thin = 0.01   # 地板厚度


"""
 2. 畫面設定
"""
#畫面設定，預設為 640 and 400 像素
scene = canvas(title="1D Motion", caption='自由落下', width=640, height=400, x=0, y=0, center=vec(0, 0.3, 0), background=vec(204/255,204/255,255/255))
floor = box(pos=vec(0, 0, 0), size=vec(20, thin, 10), color=color.green)
ball = sphere(pos=vec(0, H+R+thin/2, 0), radius=R, color=color.red, v=vec(0, 0, 0), a=vec(0, -g, 0))

#畫y-t圖v-t圖設定畫布
gd  = graph(title="y-t plot", width=600, height=450, x=0, y=640, xtitle="t(s)", ytitle="y(m)")
gd_vel = graph(title="<b>v<sub>y</sub>-t plot<b>", width=600, height=450, x=0, y=1050, xtitle="t(s)", ytitle="v<sub>y</sub>(m/s)")
gd_a = graph(title="<b>a<sub>y</sub>-t plot<b>", width=600, height=450, ymax=0, x=0, y=1500, xtitle="t(s)", ytitle="a<sub>y</sub>(m/s<sup>2</sup>)")
gd_ener = graph(title="<b>E<sub>k</sub>-t plot<b>", width=600, height=450, x=0, y=1950, xtitle="t(s)", ytitle="E<sub>k</sub>(J)")
gd_ener_h = graph(title="<b>E<sub>k</sub>-h plot<b>", width=600, height=450, x=0, y=2400, xtitle="h(m)", ytitle="E<sub>k</sub>(J)")
yt = gcurve(graph=gd, color=color.red)
vt = gcurve(graph=gd_vel, color=color.red)
at = gcurve(graph=gd_a, color=color.red)
Et = gcurve(graph=gd_ener, color=color.red)
Ety = gcurve(graph=gd_ener_h, color=color.red)


"""
 3. 物體運動部分, 圓球到達地板邊緣時停止執行
"""

while(ball.pos.y - floor.pos.y >= R + thin*0.5):
    rate(1000)
    ball.v.y   = v + ball.a.y*t
    ball.pos.y = H + R + thin/2 + (v*t + 0.5*ball.a.y*t**2)
    ball_ener = 0.5*m*ball.v.y**2
    yt.plot(pos = (t, ball.pos.y))
    vt.plot(pos = (t, ball.v.y))
    at.plot(pos = (t, ball.a.y))
    Et.plot(pos = (t, ball_ener))
    Ety.plot(pos = (ball.pos.y, ball_ener))
    t += dt

print("所需時間為t = ", t)
```
:::


:::spoiler 學生作業
1. Homework:畫出三個不同顏色的球，分別為自由落體、鉛直下拋、鉛直上拋
<iframe width="560" height="315" src="https://www.youtube.com/embed/GgBybby9pQc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


|球資訊 |設定|
|----|------|
|球1質量 |m~1~ = 1 公斤|
|球2質量 |m~2~ = 1公斤|
|球3質量 |m~3~ = 1公斤|
|球1初速度 |v~1~ = 0 m/s|
|球2初速度 |v~1~ = +10 m/s(向上拋出)|
|球3初速度 |v~1~ = -10 m/s(向下拋出)|




Requirements要求:
(1)需畫出球體移動
(2)需畫出三個球體搭配球體顏色(1)y-t圖 (2)v~y~-t圖 (3)a~y~-t圖 (4)E~k~-t圖 (5)E~k~-h圖
(3)需在idle中顯現出各自落地所需時間t~1~、t~2~、t~3~

2. 請將==程式code以及瀏覽器結果截圖、IDLE所需時間螢幕截圖== 至google classroom繳交作業。
3. 完成今日協作平台更新
4. 將code上傳至雲端硬碟中(Lesson08 vpython自由落下)
:::