---
# System prepended metadata

title: Vpython作業8

---

# Vpython作業8
```python=
from vpython import *

"""
 1. 參數設定, 設定變數及初始值
"""
m = 1               # 小球質量
size = 0.2          # 小球半徑
L = 5               # 繩長
theta = radians(30) # 繩子與鉛垂線夾角
R = L*sin(theta)    # 錐動擺半徑
H = L*cos(theta)    # 錐動擺平面與懸掛點高度差
g = 9.8             # 重力加速度
v0 = 1*sqrt(g*R)               # 切線速度量值
T = 2.88415              # 週期理論值
Fc = m*g/cos(theta)               # 向心力量值
i = 0               # 小球經過週期次數
N = 5               # 小球經過週期次數上限
t = 0               # 時間
dt = 0.001          # 時間間隔

"""
 2. 畫面設定
"""
# 產生動畫視窗、天花板、小球、繩子
scene = canvas(title="Cone Pendulum", width=600, height=600, x=0, y=0, background=color.black, range=L)
roof = box(pos=vec(0, 0.5*(L+size), 0), size=vec(L, size, 0.5*L), color=color.blue)
ball = sphere(pos=roof.pos-vec(R, 0, 0), radius=size, color=color.red,
              make_trail=True, retain=200, v=vec(0, 0, -v0))
rope = cylinder(pos=roof.pos, axis=ball.pos, radius=0.1*size, color=color.yellow)
ver = curve(pos=[roof.pos, vec(0, roof.pos.y-H, 0)], rasius=0.1*size, color=color.magenta)

# 產生表示速度的箭頭
arrow_v = arrow(pos=ball.pos, axis=vec(0, 0, 0), shaftwidth=0.3*size, color=color.green)
arrow_a = arrow(pos=ball.pos, axis=vec(0, 0, 0), shaftwidth=0.3*size, color=color.cyan)

"""
 3. 物體運動部分, 重覆5個週期
"""
pos1 = ball.pos.z
print("週期理論值 T = %f s" % T)

while i < N:
    rate(1000)
# 計算小球加速度, 更新速度, 位置, 繩子
    r = rope.axis               # 圓心到小球位置的向量
    ball.a = -Fc/m*r.norm()               # 圓心到小球位置的單位向量
    ball.v += ball.a*dt
    ball.pos += ball.v*dt
    rope.axis = ball.pos-roof.pos
# 更新表示速度, 加速度的箭頭
    arrow_v.pos = ball.pos
    arrow_v.axis = 0.5*ball.v
    arrow_a.pos = ball.pos
    arrow_a.axis = 0.5*ball.a
# 檢驗小球是否經過一個週期
    pos2 = ball.pos.z
    if pos1>0 and pos2<0: # 由小球位置判斷是否通過出發點
        print("第 %d 次通過原點, t = %f s" %(i, t))
        i += 1
    pos1 = pos2
# 更新時間
    t += dt

```
第27行的向量不會算，初速度不知道這樣算對不對，45行求向量(應該是這樣吧)，46要求單位向量，所以要取norm()