## Vpython-振盪(二)
#### by 蘇昱全 Switch
---
### 先複習一下:彈簧本體
```
spring = helix(pos=vec(x,y,z),axis=vec(a,b,c),radius=r,thickness=k,coils=t,color)
```
* $\texttt{pos}$:彈簧「起點」的位置
* $\texttt{axis}$:彈簧方向(及長度)
* $\texttt{radius}$:彈簧半徑
* $\texttt{thickness}$:彈簧粗細
* $\texttt{coils}$:彈簧匝數
----
### 先複習一下:彈力
\\[
\vec{F}=-k\cdot (l-l_0)\cdot \hat{r}
\\]
$\hat{r}$代表彈簧的軸的方向
---
### 今天要做的
上次我們有把彈簧黏在**牆**和**球**上
今天我們要把彈簧黏在**球**和**球**上
----
### 本日學習重點
* 製作出球與彈簧模型
* 質心位置、質心速度與質心加速度
---
先來思考怎麼架構模型吧
基本的數值還有空間就不再多提了
要怎麼將兩顆球同時黏在彈簧上呢
----
### 上次
我們用「彈簧」的參數來定義「物體」的位置
```
ball = sphere(pos = spring.pos + spring.axis, ...)
```
或用「物體」跟「彈簧」的位置定義$\texttt{axis}$
```
while ...:
...
spring.axis = ball.pos - spring.pos
```
----
### 這次
有兩個球,一個在彈簧的頭,一個在尾......
那就是一個在$\texttt{spring.pos}$
另一個在$\texttt{spring.pos + spring.axis}$
一樣的,我們可以用兩顆球的位置定義彈簧。
----
程式一開始,用彈簧定義球比較方便
```
spring = helix(pos = vec(0, floor.pos.y + (floor.size.y/2)+r, 0), axis = vec(l0, 0, 0), radius = r, thickness = th, coils = 5, color = color.red)
spring.pos -= spring.axis/2 #這行不重要,我只是想要置中而已
ball1 = sphere(pos = spring.pos + spring.axis + cor, radius = r + 0.5, v = v01, a = vec(0, 0, 0), color = color.white)
ball2 = sphere(pos = spring.pos - cor, radius = r + 0.5, v = v02, a = vec(0, 0, 0), color = color.white)
```
也要記得定義一個彈簧原長
----
等到球開始動,就可以先讓球動完,再設定彈簧
```
while True:
rate(1/dt)
Fnet = -k*(mag(spring.axis)-l0)*norm(spring.axis)
ball1.a = Fnet/m1
ball2.a = -Fnet/m2
ball1.v += ball1.a*dt
ball2.v += ball2.a*dt
ball1.pos += ball1.v*dt
ball2.pos += ball2.v*dt
cm.pos = (ball1.pos*m1 + ball2.pos*m2)/(m1+m2)
spring.pos = ball2.pos + cor
spring.axis = ball1.pos - spring.pos - cor
t += dt
```
----
中間有個CM(~~不是公分~~)這就是所謂的**質心**
而質心位置、質心速度、以及質心加速度就是
**這些物理量對系統中所有質點的質量的加權平均**
----
也就是說:
\\[\begin{align}
&\vec{x_{c.m.}} = \cfrac{\vec{x_1}\cdot m_1+\vec{x_2}\cdot m_2}{m_1+m_2} \\
&\vec{v_{c.m.}} = \cfrac{\vec{v_1}\cdot m_1+\vec{v_2}\cdot m_2}{m_1+m_2}\\
&\vec{a_{c.m.}} = \cfrac{\vec{a_1}\cdot m_1+\vec{a_2}\cdot m_2}{m_1+m_2}
\end{align}\\
\\]
----
更一般的說:
\\[\begin{align}
&\vec{x_{c.m.}} = \cfrac{\sum\vec{x_i}\cdot m_i}{\sum m_i}\\
&\vec{v_{c.m.}} = \cfrac{\sum\vec{v_i}\cdot m_i}{\sum m_i}\\
&\vec{a_{c.m.}} = \cfrac{\sum\vec{a_i}\cdot m_i}{\sum m_i}
\end{align}
\\]
----
可以發現質心加速度$\vec{a_{c.m.}}$有點特別
\\[
\vec{a_{c.m.}}=\cfrac{\sum\vec{a_i}\cdot m_i}{\sum m_i}=\cfrac{\vec{F_{sys}}}{M_{sys}}
\\]
它其實等於系統受合力除以總質量
所以現在知道為什麼質心加速度是0了吧
----
### 因為系統受合力為0(這裡無外力)
----
程式碼
```
th = 0.2
L = 40
l0 = 5
m1 = 1
m2 = 3
r = 1
k = 20 #(N/m)
v01 = vec(2, 0, 0)
v02 = vec(-4, 0, 0)
cor = vec((r + 0.5)/2, 0, 0)
tf = 10
t = 0
dt = 0.001
scene = canvas(title = "tst", width = 400, height = 400, center = vec(0,5,0), background = color.cyan)
floor = box(pos = vec(0,0,0), size = vec(L,0.05*L,0.3*L), color = vec(0.5, 0.5, 0))
spring = helix(pos = vec(0, floor.pos.y + (floor.size.y/2)+r, 0), axis = vec(l0, 0, 0), radius = r, thickness = th, coils = 5, color = color.red)
spring.pos -= spring.axis/2
ball1 = sphere(pos = spring.pos + spring.axis + cor, radius = r + 0.5, v = v01, a = vec(0, 0, 0), color = color.white)
ball2 = sphere(pos = spring.pos - cor, radius = r + 0.5, v = v02, a = vec(0, 0, 0), color = color.white)
cm = sphere(pos = (ball1.pos*m1 + ball2.pos*m2)/(m1+m2), r = 0.25, color = color.yellow)
gv = graph(title = "vcm-t", width = 400, height = 400, xtitle = "t", ytitle = "vcm", xmax = tf, xmin = 0, ymax = 5, ymin = 0)
ga = graph(title = "acm-t", width = 400, height = 400, xtitle = "t", ytitle = "acm", xmax = tf, xmin = 0, ymax = 5, ymin = 0)
vt = gcurve(graph = gv, color = color.blue)
at = gcurve(graph = ga, color = color.blue)
while t < tf:
rate(1/dt)
Fnet = -k*(mag(spring.axis)-l0)*norm(spring.axis)
ball1.a = Fnet/m1
ball2.a = -Fnet/m2
ball1.v += ball1.a*dt
ball2.v += ball2.a*dt
ball1.pos += ball1.v*dt
ball2.pos += ball2.v*dt
cm.pos = (ball1.pos*m1 + ball2.pos*m2)/(m1+m2)
spring.pos = ball2.pos + cor
spring.axis = ball1.pos - spring.pos - cor
vt.plot(pos = (t,mag((ball1.v*m1 + ball2.v*m2)/(m1+m2))))
at.plot(pos = (t,mag((ball1.a*m1 + ball2.a*m2)/(m1+m2))))
t += dt
```
---
[成果展示](https://www.glowscript.org/#/user/andysu960816/folder/MyPrograms/program/0307test)
---
# 謝謝大家
{"title":"Vpython-振盪(二)","contributors":"[{\"id\":\"084e105f-92be-4605-b399-8d3c0ef40c64\",\"add\":7415,\"del\":3042}]"}