planety1Od tysięcy lat wpatrywaliśmy się w niebo, a dopiero od 300 rozumiemy jak i dlaczego się to wszystko kręci. Kto uczył się pilnie fizyki wie, że to wszystko dzięki grawitacji i dzięki wielkiemu „BUM”, które wydarzyło się prawie 14 miliardów lat temu. Dawni uczeni poświęcali lata swojego życia na obserwacje i żmudne obliczenia. Dzisiaj dzięki komputerom i prostej aplikacji GRAWILAB napisanej w Excelu możemy symulować ruchy planet oraz badać ich wzajemne oddziaływania.

Jak to można obliczyć i pokazać? Podstawowego równania dostarczył Newton i uczy się go każde dziecko. Nie powinno sprawiać większych problemów wyliczenia czasu spadania przysłowiowego newtonowskiego jabłka. Problem staje się skomplikowany, gdy obliczamy wzajemne oddziaływania pomiędzy Ziemią, a Księżycem, a praktycznie nierozwiązywalny bez użycia komputerów, gdy chcemy zbadać tę kwestię dla większej ilości obiektów kosmicznych.

Z matematycznego punktu widzenia zagadnienie również wydaje się proste: należy podwójnie zróżniczkować po czasie równanie grawitacyjne Newtona. Mając masy potrafimy wyliczyć działające siły, z nich przyspieszenia, prędkości i wreszcie położenia obiektów. Otrzymane wyniki, to znane wszystkim tzw. krzywe stożkowe (np. elipsy), po których mogą poruszać się obiekty w przestrzeni. Trzeba też zaznaczyć, że dokładność obliczeń zależy od przyjętego skoku czasowego. 

To proste laboratorium grawitacyjne zostało napisane jako wstęp do dużego programu, który zostanie niebawem opisany. Zawiera mnóstwo niedoróbek i nie jest odporne na różne podawane przez użytkownika parametry. Mimo tego, przy odrobinie prób i błędów możemy:

  • zasymulować ruch w polu grawitacyjnym 4 obiektów.
  • podać ich masy, początkowe położenia i początkowe prędkości
  • podać tzw. „skok czasowy” – jak szybko będzie upływał czas
  • skalować obszar wykresu - przestrzeni kosmicznej
  • zmieniać wielkość i kolor planet

Tylko dzięki takim minimalnym parametrom możemy na przykład:

  • zbadać oddziaływanie Słońca, Ziemi i Księżyca
  • zasymulować rzut pionowy, poziomy, ukośny i swobodny spadek na ziemi
  • wystartować rakietą i „zaparkować” na orbicie ziemskiej
  • przetestować prędkości kosmiczne
  • obejrzeć „działanie” pulsara
  • przetestować wyrzutnię grawitacyjną
  • sprawdzić "dlaczego wszystko się kręci"
  • i wiele, wiele innych zjawisk kosmicznych

Symulacja komputerowa pulsara z księżycami:

 


Program nie jest zbyt skomplikowany i korzysta ze znanego ogólnie algorytmu Eulera, który wylicza podstawowe parametry poruszających się w polu grawitacyjnym obiektów w przestrzeni dwuwymiarowej.

Dla wszystkich zainteresowanych program GRAWILAB do pobrania

planety2

W tablicach przechowywane są:
RX i RY - położenia obiektów
VX i VY – prędkości obiektów
AX i AY – przyspieszenia obiektów

 

Public tt, dt As Double
Public koniec As Boolean
Public pauza As Boolean
  
Sub auto_open()
  koniec = True
  pauza = True
  ActiveSheet.Shapes("STST").Select
  Selection.Characters.Text = "START"
  Range("A6").Select
End Sub

'zmiana na suwaku czasu
Sub zmianaDT()
  dt = Range("B11")
End Sub

''klawisz START-STOP
Sub Obsługa()
  If koniec = True Then
      t = "STOP"
      koniec = False
      ActiveSheet.Shapes("STST").Select
      Selection.Characters.Text = t
      Range("A6").Select
      sym3
    Else
      t = "START"
      koniec = True
      ActiveSheet.Shapes("STST").Select
      Selection.Characters.Text = t
      Range("A6").Select
    End If
End Sub
'klawisz pauza
Sub Pauzowanie()
  If pauza = True Then
      pauza = False
      tt = dt
      dt = 0
    Else
      pauza = True
      dt = tt
    End If
End Sub

'symulacja
Sub sym3()
  Const WYM = 5
  Const G = 1 '6.67259E-11 'm kg s na potrzeby programu 1
  
  Dim MA(1 To WYM) As Double
  Dim XY(1 To WYM, 1 To 2) As Double
  Dim VV(1 To WYM, 1 To 2) As Double
  Dim AA(1 To WYM, 1 To 2) As Double
  
  Dim i, j, k As Integer
  Dim R, R2, R3, t As Double

  t = 0
  dt = Range("B11") '0.01
  sk = Range("B19")
  N = Range("B10") 'ile obiektów
  'pobranie danych
  For i = 1 To N
    w = i + 1
    MA(i) = Cells(w, 2)
    XY(i, 1) = Cells(w, 3) 'X
    XY(i, 2) = Cells(w, 4) 'Y
    VV(i, 1) = Cells(w, 5) 'VX
    VV(i, 2) = Cells(w, 6) 'VY
  Next i
  
  'pętla główna
  Do
    'wyzerowanie przyspieszeń
    For i = 1 To N
    For k = 1 To 2
      AA(i, k) = 0
    Next k
    Next i
    
    'obliczanie przyspieszeń
    For i = 1 To N
    For j = 1 To N
    If i <> j Then
    
    'odległości pomiędzy planetami
    R2 = (XY(i, 1) - XY(j, 1)) ^ 2 + (XY(i, 2) - XY(j, 2)) ^ 2
    R = R2 ^ (1 / 2)
    R3 = R ^ 3
    ' suma wszystkich składowych
    For k = 1 To 2
      AAch = -G * MA(j) * (XY(i, k) - XY(j, k)) / R3
      AA(i, k) = AA(i, k) + AAch
    Next k
    End If
    Next j
    Next i
    
    'nowe położenia i prędkości
    For i = 1 To N
    For k = 1 To 2
      VV(i, k) = VV(i, k) + AA(i, k) * dt
      XY(i, k) = XY(i, k) + VV(i, k) * dt
    Next k
    Next i
    
    'dane na ekran
    t = t + dt
    For i = 1 To N
      w = 10
      k = 1
      Cells(w + 2, k + i) = XY(i, 1)
      Cells(w + 3, k + i) = XY(i, 2)
      Cells(w + 4, k + i) = VV(i, 1)
      Cells(w + 5, k + i) = VV(i, 2)
      Cells(w + 6, k + i) = AA(i, 1)
      Cells(w + 7, k + i) = AA(i, 2)
      Cells(w + 8, k + 1) = t
    Next i
    'po kalkulacji zmienia się wykres
    Calculate
    DoEvents
  Loop Until koniec Or Abs(XY(1, 1)) > 2 * sk Or Abs(XY(1, 1)) > 2 * sk Or Abs(XY(2, 1)) > 2 * sk Or Abs(XY(2, 2)) > 2 * sk
End Sub


Sub skalaeuler()
    s = Range("B19")
    ActiveSheet.ChartObjects("Wykres 1").Activate
    ActiveChart.Axes(xlCategory).Select
    With ActiveChart.Axes(xlCategory)
        .MinimumScale = -s
        .MaximumScale = s
    End With
    ActiveChart.Axes(xlValue).Select
    With ActiveChart.Axes(xlValue)
        .MinimumScale = -s
        .MaximumScale = s
    End With
    Range("A6").Select
End Sub

Sub Obiekt1()
    s = Range("B21")
    ActiveSheet.ChartObjects(1).Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveChart.SeriesCollection(1).Points(1).Select
    Selection.MarkerSize = s
    Range("A6").Select
End Sub
Sub Obiekt2()
    s = Range("B22")
    ActiveSheet.ChartObjects(1).Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveChart.SeriesCollection(1).Points(2).Select
    Selection.MarkerSize = s
    Range("A6").Select
End Sub
Sub Obiekt3()
    s = Range("B23")
    ActiveSheet.ChartObjects(1).Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveChart.SeriesCollection(1).Points(3).Select
    Selection.MarkerSize = s
    Range("A6").Select
End Sub
Sub Obiekt4()
    s = Range("B24")
    ActiveSheet.ChartObjects(1).Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveChart.SeriesCollection(1).Points(4).Select
    Selection.MarkerSize = s
    Range("A6").Select
End Sub