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