7.06.2020

Çarpışan Toplar

Görsel benzetimin yaygınlaşması, Corona salgının yan etkilerinden biri oldu. Hastalığın nasıl bulaşacağını ve izolasyonun etkisini tahmin eden inandırıcı benzetimlerle tanıştık. Aynı günlerde ilk referanstaki sayfayı buldum. Çarpışma modeli eksikti ama topların gösterimi çok başarılıydı.

Söz konusu yazılımın evrimini anlatırken, toplam kinetik enerjinin sabit kaldığı esnek çarpışma varsayımını kullanacağız. Momentumun korunumu da en temel mekanik kuralı...


Tek boyutlu çarpışma

Eşit kütleli iki top doğru bir hat üstünde çarpışırsa iki topun hızı yer değiştirir. Bilardo masasından bir örnek verelim: Hareketsiz duran bir topa tam ortasından çarpan ikinci top durur ve ilk top aynı hızla harekete geçer. Şimdi bu sonuca denklemlerden ulaşalım:

$v_1, v_2$ topların ilk hızını göstersin. Tek boyutlu hızları modellemek için işaretli sayılar (tek boyutlu vektör) yeterli. Hız pozitif ise top eksen yönünde sağa doğru, negatif ise ters yönde sola doğru hareket ediyor.

Toplam momentum ve enerjinin sabit kaldığı tek çözüm $v'_1 = v_2, v'_2 = v_1$ olarak bulunur, her top diğerinin ilk hızını alır.

Kütleler eşit değilse, işlemler biraz daha uzun sürer ve şu sonuca ulaşılır:
Sonuç şöyle yazılınca hem sağlaması daha kolay olur, hem de genel formülün özel hali olarak okunabilir:
$$ \begin{matrix} v'_1 = v_1 + m_2 k \Delta v, \quad v'_2 = v_2 − m_1 k \Delta v \\[8px] k = 2/(m_1 + m_2), \quad \Delta v = (v_2 − v_1) \end{matrix} $$
Yani, iki top arasındaki hız farkı, diğer topun kütlesi ile orantılı olarak paylaştırılır. Hafif top daha çok hız kazanır. Okuyucu bu çözümün toplam momentum ve enerjiyi değiştirmediğini kolayca sağlayabilir.


İki boyut, eşit kütleler

Daha ilginç çarpışmaları anlamak için ikinci ve üçüncü boyuta geçmek lazım. Vektör yaklaşımı kullanırsak boyut sayısı hiç önemli değil, aynı formüller geçerli. Önce iki eşit kütle ile başlayalım.

İki top dokunduğu anda merkezleri birleştirelim. Hız değişimi sadece bu doğrultuda $(\Delta \mathbf{x})$ gerçekleşir. Buna dik olan hızlar asla değişmez. O halde ilk hızın $\Delta \mathbf{x}$ vektörüne paralel bileşeni (izdüşümü) diğer topa geçecek, dik bileşen ise ilk topta kalacaktır:
Hareketli resimdeki en önemli kare, ilk hızı ve iki bileşenini gösteriyor:
İzdüşüm hesabı lineer cebirin en temel konularından biridir:
$$ \mathbf{a_x} = \frac {\langle\mathbf{a}, \mathbf{x}\rangle}{\langle\mathbf{x}, \mathbf{x}\rangle} \mathbf{x} \quad \textit{projection of } \mathbf{a} \textit{ on } \mathbf{x} $$
Çarpışma problemine uygulayınca, iki topun hız farkının $\Delta \mathbf{x}$ üstüne izdüşümünden şu sonuca varılır:
$$ \begin{matrix} \mathbf{v}'_1 = \mathbf{v}_1 + P \Delta \mathbf{x}, \quad \mathbf{v}'_2 = \mathbf{v}_2 − P \Delta \mathbf{x} \\[8px] P = \frac {\langle\Delta \mathbf{v}, \Delta \mathbf{x}\rangle} {\langle\Delta \mathbf{x}, \Delta \mathbf{x}\rangle} = \langle\Delta \mathbf{v}, \Delta \mathbf{x}\rangle / \lVert \Delta \mathbf{x}\rVert^2 \\[8px] \Delta \mathbf{v} = (\mathbf{v}_2 − \mathbf{v}_1), \quad \Delta \mathbf{x} = (\mathbf{x}_2 − \mathbf{x}_1) \end{matrix} $$
Okuyucu bu olağanüstü basit formülü sağlamalı ve üstünde düşünmelidir. Trigonometri kullanmadan, nasıl olur da iki ve üç boyutta sonuca ulaşır? Formülün büyüsü iki vektörün iç çarpımında gizli olabilir mi?

Önemli not: Vektörlerle çalışırken kinetik enerji koordinatlarla değil, yine iç çarpımla hesaplanır. Elbette trigonometri yardımıyla aynı sonuçlar bulunur, ama hesap süresi daha uzun olur. Enerji hesabı için hız vektörlerinin uzunluğu gerekiyor:
$$ \begin{matrix} \lVert \mathbf{v}'_1\rVert^2 = \lVert \mathbf{v}_1\rVert^2 + 2P \langle \mathbf{v}_1, \Delta \mathbf{x}\rangle + P^2 \lVert \Delta\mathbf{x}\rVert^2 \\[8px] \lVert \mathbf{v}'_2\rVert^2 = \lVert \mathbf{v}_2\rVert^2 - 2P \langle \mathbf{v}_2, \Delta \mathbf{x}\rangle + P^2 \lVert \Delta\mathbf{x}\rVert^2 \end{matrix} $$
Toplam enerjinin sabit kaldığını göstermek için bu iki denklemi toplayıp sadeleştirin...


Genel çözüm

Çok boyutlu genel çözüm formülünü 2. referanstan alalım:
en.wikipedia.org/wiki/Elastic_collision

Karmaşık görünen bu çözüm şöyle yazılınca epeyce basitleşir:
$$ \begin{matrix} \mathbf{v}'_1 = \mathbf{v}_1 + m_2 k P \Delta \mathbf{x} \\[8px] \mathbf{v}'_2 = \mathbf{v}_2 − m_1 k P \Delta \mathbf{x} \\[8px] k = 2/(m_1 + m_2), \quad P = \langle\Delta \mathbf{v}, \Delta \mathbf{x}\rangle / \lVert \Delta \mathbf{x}\rVert^2 \\[8px] \Delta \mathbf{v} = (\mathbf{v}_2 − \mathbf{v}_1), \quad \Delta \mathbf{x} = (\mathbf{x}_2 − \mathbf{x}_1) \end{matrix} $$

Bu genel çözümün iki farklı özel halini yukarıda incelemiştik:
1. Vektör yerine skalar $(P \Delta x = \Delta v)$ kullanırsak, formül tek boyuta indirgenir.
2. Eşit kütleler haline indirgemek için $m \text{ ve } k$ değerlerini silmek yeterli $(mk = 1)$.
$$ \begin{matrix} \textit{Tek boyut} & \textit{Eşit kütleler} \\ v'_1 = v_1 + m_2 k \Delta v & \mathbf{v}'_1 = \mathbf{v}_1 + P \Delta \mathbf{x} \\ v'_2 = v_2 − m_1 k \Delta v & \mathbf{v}'_2 = \mathbf{v}_2 − P \Delta \mathbf{x} \\[10px] k = 2/(m_1 + m_2) & \quad P = \langle\Delta \mathbf{v}, \Delta \mathbf{x}\rangle / \lVert \Delta \mathbf{x}\rVert^2  \end{matrix} $$


Yazılımın ana hatları

Çarpışan iki top b2 ve b1 olsun. Topların yeri, hızı, kütlesi:
  x2 = b2.pos,  x1 = b1.pos
  v2 = b2.vel,  v1 = b1.vel
  m2 = b2.size, m1 = b1.size

Çarpışma sonrası hızların hesabı şöyle yapılır:
  let dx = b2.pos.minus(b1.pos) // x2-x1
  let dv = b2.vel.minus(b1.vel) // v2-v1
  let m  = b1.size + b2.size    // m1+m2
  let kP = (2/m)*dv.inner(dx)/dx.inner(dx)
  b1.vel.add(+kP*b2.size, dx)
  b2.vel.add(-kP*b1.size, dx)

Bu formülü uygulamadan önce, iki topun tam dokunduğuna emin olmak gerekir. Benzetim sırasında zaman sürekli akmadığı için, çarpışmayı fark ettiğimizde iki top birbirinin içine girmiş olabilir. Dokunma zamanını hesaplayıp tam o andaki koordinatları kullanmak gerekiyor.
  let a = dv.inner(dv)  // |Δv|²
  if (a < 0.0001) continue //same velocity
  let b = dv.inner(dx)/a // <Δv,Δx>/<Δv,Δv>
  let c = (dx.inner(dx) - m*m)/a
  //solve t² + 2b*t + c = 0
  if (b*b < c) continue //no real solution 
  if (1+2*b+c > 0) continue //solution t>1
  let tt = (-b-Math.sqrt(b*b-c))
  b1.update(tt); b2.update(tt)

Uygulamadaki en önemli zorluk, topların sayısı artınca ortaya çıkıyor. Aynı zaman aralığında bir top iki topa birden çarparsa, iki çarpışmayı zaman sırasında ayrı ayrı ele almak gerekiyor. Aynı aralıkta ikiden fazla çarpışma olursa basit formüller hata veriyor ve süreksiz bir hareket gözleniyor. Top sayısının girildiği kutunun rengi (beyazdan sarı ve kırmızıya) bu durumun işareti: Temel varsayımın ihlali nedeniyle benzetim doğru çalışmıyor. Top sayısını azaltmak gerekecek. (Formülün ilginç bir sonucu olarak, toplam enerjinin bu halde bile korunduğunu gözledik)





Doğrulama (validation)

Her benzetim çalışmasının doğrulanması gerekir. (Ref: Osman Balcı) Bu yazılımda iki doğrulama aracı kullandım:

1. Toplam enerji on binlerce çarpışma sonunda aynı kalıyor, o halde esnek çarpışmalar doğru modellenmiş (Dev Tools'da total() yazarak bunu görebilirsiniz)

2. Görsel doğrulama. Programın ilk sürümünde ilginç hatalar gözledik:
* toplar birbirine kenetlenip dönüyordu
* görünen topların sayısı zamanla azalıyordu
* ekranın kenarlarına takılıp kalan toplar vardı
Bunların hepsi yukarıda anlatılan hassas zaman hesabı ile düzeltildi


Referans

1. Mozilla eğitim sayfalarında uygulamanın temelini buldum (bu modelde toplar birbirinin içinden geçerken sadece renk değiştiriyor, hızları aynı kalıyor)

2. Genel anlatım ve çözüm formülü Wikipedia'da:
https://en.wikipedia.org/wiki/Elastic_collision

3. Esnek çarpışmaları vektörlerle modelleyen bir makale ve Bouncescope uygulaması:
http://www.vobarian.com/collisions/

4. Yazılım sayfası:
https://maeyler.github.io/JS/canvas/colliding