Modellierung des Universums: Himmelsmechanik klar



Stellen wir uns vor, wir müssen einen Fußball in die Erdumlaufbahn bringen. Keine Raketen benötigt! Genug Berge, eine Höhe von 100 Kilometern und bemerkenswerte Stärke. Aber wie viel brauchen Sie, um den Ball zu treten, damit er nie zur Erde zurückkehrt? Wie kann man den Ball auf eine Reise zu den Sternen schicken, wenn man nur rohe Gewalt und Kenntnisse der Himmelsmechanik besitzt?

Heute im Programm:

  • Unendliche Möglichkeiten einer Formel
  • Wie man Jupiter Energie entzieht
  • Woher kommen Planeten?
  • Wie Mathematik dazu beitrug, Neptun zu entdecken

Glücklicherweise leben wir im Zeitalter der Computertechnologie. Wir müssen nicht auf einen hohen Berg klettern und den Ball mit aller Kraft treten, alles kann modelliert werden! Lass uns anfangen.

Eine Formel


Dasselbe, bekannt aus den Lehren der Physik und Astronomie:



Es zeigt, wie stark die Körper in Abhängigkeit von ihrer Masse, dem Abstand zwischen ihnen und der Gravitationskonstante G

interagieren. Ich habe ein Programm geschrieben, in dem Sie Bälle platzieren können, die durch Gravitationskräfte miteinander interagieren Jeder Ball hat seine eigene Masse, Geschwindigkeit und Koordinaten. Aus Gründen der Klarheit hinterlassen die Kugeln eine Spur.

Lassen Sie uns eine große und massive blaue Kugel (Erde) und eine kleine rote Kugel daneben platzieren. Führen Sie die Simulation aus:



Er ist gefallen!

Um in die Umlaufbahn zu gelangen, ist Geschwindigkeit erforderlich, damit der Ball fällt und die Erde ständig verfehlt. Aber welche Geschwindigkeit? Und wieder kommt das Schulwissen zur Rettung:

Die Mindestgeschwindigkeit, die erforderlich ist, um in die Erdumlaufbahn zu gelangen, wird genannterste kosmische Geschwindigkeit .

Für die Erde sind es 7,91 km / s. Und für die Simulation kann es leicht berechnet werden: Wir



zerstreuen den Ball und sehen das Ergebnis:



Normaler Flug!

Der Ball beschreibt einen Kreis mit der Erde im Zentrum. Was passiert, wenn Sie es etwas schneller machen?



Lassen Sie uns nun überprüfen: Jetzt ist die Form der Umlaufbahn elliptisch. Wir können zwei sehr wichtige Punkte unterscheiden - Apogäum und Perigäum .

Apogee ist der Punkt, an dem der Ball so weit wie möglich von der Erde entfernt ist.

Perigäum - im Gegenteil der Punkt, der der Erde am nächsten liegt.

Mit zunehmender Anfangsgeschwindigkeit ändert sich das Perigäum nicht, aber der Apogäum wird weiter und hat am Ende einen unendlichen Abstand zur Erde. Hier kommen wir dem Konzept nahezweite Raumgeschwindigkeit . Dies ist die Geschwindigkeit, die dem Ball gegeben werden muss, damit er die Schwerkraft der Erde überwindet und wegfliegt, um die Weiten des Universums zu pflügen. Für Land sind es 11,2 km / s.

Ein interessanter Trick: Wenn wir die erste kosmische Geschwindigkeit mit √2 multiplizieren, erhalten wir die zweite kosmische Geschwindigkeit.

Multipliziert. Gestartet. Erhalten:



Er flog unwiderruflich weg! Übrigens hat es jetzt eine parabolische Umlaufbahn. Und wenn Sie den Ball noch stärker laufen lassen, bekommen wir eine Hyperbel. Es stellt sich interessanterweise heraus, dass uns die Mathematik überall verfolgt.

In diesem Fall bleibt die Formel gleich. Der Kreis verwandelt sich aufgrund der Verlängerung der Umlaufbahn in eine Ellipse, eine Ellipse in eine Parabel und eine Parabel in eine Hyperbel (erhöhte Exzentrizität ).

Wie kann man Jupiter Energie entziehen?


Lassen Sie uns unser Modell erweitern, die Sonne hinzufügen und die Erde darum drehen.



Stellen Sie sich vor, der Ball muss so schnell sein, dass er außerhalb des Sonnensystems fliegt - der dritten kosmischen Geschwindigkeit . In der realen Welt sind es 16,7 km / s. Leider ist diese Geschwindigkeit zu hoch, ich fürchte, wir werden nicht genug Kraft haben ...

Warte! Aber was ist, wenn Sie ein wenig Geschwindigkeit von einem massiven Körper nehmen, zum Beispiel Jupiter. Wir können zu etwas sehr Massivem fliegen und ein Gravitationsmanöver durchführen . Beim Vorbeiflug an Jupiter ziehen die Gravitationskräfte den Ball und den Gasriesen gegenseitig an, aber die Masse des Balls ist so gering, dass sie fast keinen Einfluss auf die Bewegung des Jupiter hat, und Jupiter selbst beschleunigt den vorbeiziehenden Körper mit hoher Geschwindigkeit.

Weniger reden, mehr arbeiten:



Der Moment des Gravitationsmanövers - der Ball flog auf Jupiter zu.



Hurra! Wir haben eine Geschwindigkeit, die ausreicht, um das Sonnensystem zu verlassen, ohne etwas auszugeben. Jupiter bewegte sich zwar etwas langsamer, aber wir werden es definitiv nicht bemerken.

Alle vom Menschen jenseits der Grenzen des Sonnensystems abgefeuerten Raumschiffe (Voyager 1 und 2, Pioniere 10 und 11, New Horizons) verwendeten eine solche Beschleunigungsmethode.

Hineinzoomen!


Ich habe die Reibung der Partikel hinzugefügt, damit sie bei einer Kollision einen Teil der Energie aufeinander übertragen. Ich habe auch die Kraft einer normalen Reaktion eingeführt. Jetzt respektieren die Partikel ihren persönlichen Raum und drücken andere von sich weg.

Wir setzen die zufällige Erzeugung von Bällen und geben ihnen eine zufällige Richtung und Geschwindigkeit. Lassen Sie sie zum Beispiel 100 Stück sein.



Komplettes Chaos, jedes Teilchen bewegt sich, wohin es will, aber dennoch fordern die Gravitationskräfte ihren Tribut und es bilden sich Kugelkugeln:



Und nach einer Weile bildet sich ein großer Körper, der aus 99 Kugeln und einer einzelnen Kugel besteht, die um sie herum kreist:



Mit einem weiteren Start die folgenden :



Zwei massive Körper, die einen gemeinsamen Schwerpunkt umkreisen. Wenn wir uns vorstellen, dass diese beiden Objekte Sterne sind, erhalten wir einen Doppelstern. Interessanterweise ist ungefähr die Hälfte der Sterne in unserer Galaxie binär. Wenn unsere Sonne einen Begleitstern hätte, könnten wir am Himmel das folgende Bild beobachten:



Woher kommen Planeten?


Der Hauptgrund für das Auftreten von Ringen ist die Zerstörung von Satelliten, die zu nahe am Planeten fliegen oder vielmehr die Roche-Grenze überschreiten . In diesem Fall werden die durch die Schwerkraft des Planeten verursachten Gezeitenkräfte größer als die Kräfte, die den Satelliten intakt halten, und er zerfällt in viele Teile und hinterlässt einen Ring, der den Planeten umgibt. Simulieren wir diese Situation:



Der Satellit ist etwas weiter als die Roche-Grenze, er dreht sich in einer stabilen Kreisbahn um den Planeten. Aber was passiert, wenn Sie es etwas näher am Planeten erzeugen?



Der Satellit zerstreute sich in viele kleine Teile, die Ringe um den Planeten bildeten. So ist es in der realen Welt. Triton (Satellit von Neptun) nähert sich allmählich dem Planeten und wird in 2 Milliarden Jahren zerrissen, und Neptun wird mehr Ringe als Saturn haben.

Wie wurde Neptun entdeckt und was hat Mathematik damit zu tun?


Da es sich um Neptun handelt, sprechen wir über seine Entdeckung. "Ein Planet, der an der Spitze eines Stifts offen ist" hat eine Masse, was bedeutet, dass er auf Objekte in der Umgebung einwirkt. Astronomen des 19. Jahrhunderts bemerkten Veränderungen in der Umlaufbahn des Uranus, seine Umlaufbahn war anders als die berechnete, anscheinend wirkte sich etwas auf sie aus. Die Umlaufbahn von Uranus hatte Störungen:



Dieses übertriebene Modell zeigt, wie ein unbekannter Körper jenseits von Uranus seine Umlaufbahn beeinflusste. Astronomen konnten nur die Position eines geheimen Planeten berechnen und durch ein Teleskop schauen. In der Tat war der Planet Neptun genau dort, wo er vorhergesagt wurde!



Fazit


Natürlich verallgemeinert diese Simulation nicht alle im Raum auftretenden Gesetze und Phänomene, zum Beispiel wird Einsteins Relativitätstheorie hier nicht berücksichtigt, da die Geschwindigkeit der Teilchen weit von der Lichtgeschwindigkeit entfernt ist. Es gibt jedoch noch viele weitere interessante Dinge, die in dieser Simulation implementiert werden können. Versuch es selber! Sie benötigen lediglich Python3 und die Pygame-Bibliothek.

Quelle
# 
Track = True

# 
Track_time = 5

# 
G = 5

#  (  -
#,  - )
MagnConst = 0

# 
count = 100

#  
kv = 6

#  
RANDOM = True

#  
r = 3

#   
WIN_WIDTH, WIN_HEIGHT = 900, 650


''',  ,   '''

#   
zg = 2

#   
zm = 2

#. ,    -   
k = 40

# 
antiG = 0.1

max_speed = 3

ResDist = 1

# 
EarthG = 0

#   
Mirror = True

import pygame
from math import hypot, ceil, sqrt
from random import randint, random


def custom_pos():
    '''      '''
    '''   RANDOM = FALSE'''
    B.append(Ball(200, 300, YELLOW, r = 10, mass = 200, vx = 0.151))    #x, y, col, r, vx, vy, mass
    B.append(Ball(200, 50, GREEN, r = 6, mass = 10, vx = -(200 * G / 250)**0.5))
    

class Ball:
    def __init__(self, x, y, col, r = 4, vx = 0, vy = 0, mass = 4):
        self.x = x
        self.y = y
        self.r = r
        self.col = col
        self.vx = vx
        self.vy = vy
        self.mass = mass
        
    def move(self, Walls, WIN_WIDTH, WIN_HEIGHT, ofs_x, ofs_y):
        if Walls:
            x = self.x - ofs_x
            y = self.y - ofs_y
            if x <= 0 and self.vx < 0:
                if Mirror:
                    self.vx = -self.vx
                else:
                    self.x += WIN_WIDTH
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            if x >= WIN_WIDTH and self.vx > 0:
                if Mirror:
                    self.vx = -self.vx
                else:
                    self.x -= WIN_WIDTH
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            if y <= 0 and self.vy < 0:
                if Mirror:
                    self.vy = -self.vy
                else:
                    self.y += WIN_HEIGHT
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            if y >= WIN_HEIGHT and self.vy > 0:
                if Mirror:
                    self.vy = -self.vy
                else:
                    self.y -= WIN_HEIGHT
                self.vx, self.vy = self.v_norm(self.vx, self.vy)
            
        self.x += self.vx
        self.y += self.vy

        
    def force(self, ind, selfind):
        ox = B[ind].x
        oy = B[ind].y
        m = B[ind].mass
        if m < 0.01 and self.mass < 0.01:
            return 0
        r = B[ind].r
        vx = B[ind].vx
        vy = B[ind].vy
        dist = hypot(self.x - ox, self.y - oy)
        min_dist = (self.r + B[ind].r) * ResDist
        f = 0
        m_relative = self.mass / B[ind].mass
        if dist <= min_dist:
            newVx = (vx * m + self.vx * self.mass) / (m + self.mass)
            newVy = (vy * m + self.vy * self.mass) / (m + self.mass)
            self.vx = (newVx + k * self.vx) / (k + 1)
            B[ind].vx = (newVx + k * B[ind].vx) / (k + 1)
            self.vy = (newVy + k * self.vy) / (k + 1)
            B[ind].vy = (newVy + k * B[ind].vy) / (k + 1)
            f -= antiG * min(abs(min_dist - dist), min(m, self.mass) * 3)
        else:
            f += min(self.mass * B[ind].mass * G  / (dist ** zg), G / 10)
            mf = MagnConst * self.mass / (dist ** zm)
            if B[ind].col == B[selfind].col:
                mf = - mf
            f += mf
        fx = f * ((ox - self.x) / dist)
        fy = f * ((oy - self.y) / dist)
        ax = fx / self.mass
        ay = fy / self.mass
        self.vx += ax
        self.vy += ay + EarthG
        B[ind].vx -= ax * m_relative
        B[ind].vy -= ay * m_relative - EarthG

    @staticmethod
    def v_norm(vx, vy):
        v = hypot(vx, vy)
        if v > max_speed:
            vx = max_speed * (vx / v)
            vy = max_speed * (vy / v)
        return vx, vy


class Point:
    def __init__(self, x, y, col, r = 0, max_age = Track_time):
        self.age = 0
        self.x = x
        self.y = y
        self.col = col
        self.r = r
        self.max_age = max_age
    def vis(self, ofs_x, ofs_y):
        pygame.draw.circle(sc, self.col, (round(self.x - ofs_x),
                                          round(self.y - ofs_y)), self.r, 0)
        self.age += 1
        if self.age > self.max_age:
            T.remove(self)
        
def rand(count, WIN_WIDTH, WIN_HEIGHT):
    global kv
    B = []
    for i in range(count):
        m = r ** 2
        x = randint(0, WIN_WIDTH) + random()
        y = randint(0, WIN_HEIGHT) + random()
        vx = kv * randint(-100, 100) / 100
        vy = kv * randint(-100, 100) / 100
        col = Colors[randint(0, len(Colors) - 1)]
        B.append(Ball(x, y, col, r = r, vx = vx, vy = vy, mass = m))
    return B

def createBall(col, x, y, r = r, m = r):
    m = r
    B.append(Ball(x, y, col))

def get_offset(B):
    sum_x, sum_y = 0, 0
    m = 0
    for i in range(len(B)):
        sum_x += B[i].x * B[i].mass
        sum_y += B[i].y * B[i].mass
        m += B[i].mass
    if len(B) == 0:
        return 0, 0
    return sum_x / m, sum_y / m

def visBalls(B):
    for i in range(len(B)):
        pygame.draw.circle(sc, B[i].col, (round(B[i].x - ofs_x),
                                          round(B[i].y - ofs_y)), B[i].r, 0)
        T.append(Point(B[i].x, B[i].y, B[i].col))
        
FPS = 60
darkblue = (0, 2, 25)
ORANGE = (255, 200, 150)
RED = (255, 150, 150)
GREEN = (150, 255, 150)
BLUE = (150, 150, 255)
YELLOW = (255, 255, 0)
Colors = [RED, BLUE]#, GREEN]#, ORANGE]                       
pygame.init() 
clock = pygame.time.Clock()
sc = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
sc.fill(darkblue)

maxF = 0.3
minv = 0.01
Walls = True
Collisions = True
Same = True
Check = False
tt = []

B = []
if RANDOM:
    B = rand(count, WIN_WIDTH, WIN_HEIGHT)
else:
    custom_pos()
    
Pause = False
delay = 0

if Track:
    T = []
for z in range(100000):
    sc = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
    sc.fill(darkblue)
    ofs_x, ofs_y = get_offset(B)
    ofs_x -= WIN_WIDTH // 2
    ofs_y -= WIN_HEIGHT // 2
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            pygame.quit()
            quit()
        if i.type == pygame.KEYDOWN:
            if i.key == pygame.K_SPACE:
                Pause = not Pause
            elif i.key == pygame.K_w:
                WIN_HEIGHT += 10
                WIN_WIDTH += 10
            elif i.key == pygame.K_s:
                WIN_HEIGHT -= 10
                WIN_WIDTH -= 10
                
    pressed = pygame.mouse.get_pressed()
    pos = pygame.mouse.get_pos()
    x = pos[0]
    y = pos[1]
    if pressed[0] and delay < 0:
        delay = 20
        createBall(RED, x + ofs_x, y + ofs_y)
    if pressed[2] and delay < 0:
        delay = 20
        createBall(BLUE, x + ofs_x, y + ofs_y )
    delay -= 1
    
    if not Pause:
        for i in range(len(B)):
            for j in range(i + 1, len(B)):
                B[i].force(j, i)
        for i in range(len(B)):
            B[i].move(Walls, WIN_WIDTH, WIN_HEIGHT, ofs_x, ofs_y)
    for i in range(len(T)):
        try:
            T[i].vis(ofs_x, ofs_y)
        except IndexError:
            pass
    visBalls(B)
    
    pygame.display.update()
    clock.tick(FPS)


Ich hoffe, dieser Artikel war für Sie informativ. Vielen Dank für Ihre Aufmerksamkeit!

All Articles