Membuat model alam semesta: mekanika langit dengan jelas



Mari kita bayangkan bahwa kita perlu meluncurkan bola sepak ke orbit Bumi. Tidak perlu roket! Cukup gunung, ketinggian 100 kilometer dan kekuatan luar biasa. Tetapi berapa banyak yang Anda butuhkan untuk menendang bola sehingga tidak pernah kembali ke Bumi? Bagaimana cara mengirim bola dalam perjalanan ke bintang-bintang, yang hanya memiliki kekuatan kasar dan pengetahuan tentang mekanika selestial?

Hari ini dalam program:

  • Kemungkinan tak terbatas dari satu formula
  • Cara mengambil energi dari Jupiter
  • Dari mana planet berasal
  • Bagaimana matematika membantu menemukan Neptunus

Untungnya, kita hidup di zaman teknologi komputer. Kita tidak perlu memanjat gunung yang tinggi dan menendang bola dengan seluruh kekuatan kita, semuanya bisa dimodelkan! Mari kita mulai.

Satu formula


Yang sama, yang diketahui dari pelajaran fisika dan astronomi:



Ini menunjukkan seberapa kuat tubuh akan berinteraksi, tergantung pada massa mereka, jarak antara mereka dan konstanta gravitasi G.

Saya menulis sebuah program di mana Anda dapat menempatkan bola berinteraksi satu sama lain oleh kekuatan gravitasi, dengan Setiap bola memiliki massa, kecepatan, dan koordinatnya sendiri. Untuk kejelasan, bola meninggalkan jejak.

Mari kita meletakkan bola biru besar (Bumi) dan bola merah kecil di dekat itu. Jalankan simulasi:



Dia jatuh!

Untuk memasuki orbit, kecepatan diperlukan agar bola jatuh dan merindukan bumi setiap saat. Tapi kecepatan APA? Dan lagi, pengetahuan sekolah datang untuk menyelamatkan:

Kecepatan minimum yang diperlukan untuk memasuki orbit Bumi disebutkecepatan kosmik pertama .

Untuk Bumi, itu adalah 7,91 km / s. Dan untuk simulasi dapat dengan mudah dihitung: Kami



membubarkan bola dan melihat hasilnya:



Penerbangan normal!

Bola menggambarkan lingkaran dengan Bumi di tengah. Apa yang akan terjadi jika Anda memberinya kecepatan lebih? Sekarang



mari kita periksa: Sekarang bentuk orbitnya elips, kita dapat membedakan 2 titik yang sangat penting - apogee dan perigee .

Apogee adalah titik di mana bola berada sejauh mungkin dari Bumi.

Perigee - sebaliknya, titik paling dekat dengan Bumi.

Dengan peningkatan kecepatan awal, perigee tidak berubah, tetapi apogee semakin jauh, dan pada akhirnya memiliki jarak tak terbatas ke Bumi. Di sini kita mendekati konsepnyakecepatan ruang kedua . Ini adalah kecepatan yang harus diberikan kepada bola sehingga mengatasi gravitasi Bumi dan terbang menjauh untuk membajak bentangan alam semesta. Untuk tanah, jaraknya 11,2 km / s.

Trik yang menarik: jika kita mengalikan kecepatan kosmik pertama dengan √2, kita mendapatkan kecepatan kosmik kedua.

Berlipat ganda. Diluncurkan. Diterima:



Dia terbang tanpa dapat ditarik kembali! Omong-omong, sekarang ia memiliki orbit parabola. Dan jika Anda menjalankan bola lebih kuat, kami mendapatkan hiperbola. Ternyata menarik, matematika menghantui kita di mana-mana.

Dalam hal ini, rumusnya tetap sama. Lingkaran berubah menjadi elips, elips menjadi parabola, dan parabola menjadi hiperbola karena perpanjangan orbit (peningkatan eksentrisitas ).

Bagaimana cara mengambil energi dari Jupiter?


Mari kita memperluas model kita, menambahkan Matahari, membuat Bumi berputar di sekitarnya.



Bayangkan bahwa bola harus diberi kecepatan sedemikian rupa sehingga ia terbang di luar tata surya - kecepatan kosmik ketiga . Di dunia nyata, itu adalah 16,7 km / s. Sayangnya, kecepatan ini terlalu tinggi, saya khawatir kita tidak akan memiliki kekuatan yang cukup ...

Tunggu! Tetapi bagaimana jika Anda mengambil sedikit kecepatan dari beberapa benda besar, misalnya, Jupiter. Kita bisa terbang ke sesuatu yang sangat masif dan melakukan manuver gravitasi . Ketika terbang melewati Jupiter, gaya gravitasi saling menarik bola dan raksasa gas, tetapi massa bola sangat kecil sehingga hampir tidak berpengaruh pada pergerakan Jupiter, dan Jupiter sendiri mempercepat tubuh yang lewat dengan kecepatan tinggi.

Lebih sedikit bicara, lebih banyak bekerja:



Momen manuver gravitasi - bola terbang ke Jupiter.



Hore! Kami mendapat kecepatan yang cukup untuk keluar dari tata surya, sementara tidak menghabiskan apa pun. Benar, Jupiter mulai bergerak sedikit lebih lambat, tetapi kita pasti tidak akan menyadarinya.

Semua pesawat ruang angkasa diluncurkan oleh manusia di luar batas tata surya (Voyagers 1 dan 2, Pioneers 10 dan 11, New Horizons) menggunakan metode percepatan seperti itu.

Perbesar!


Saya menambahkan gesekan pada partikel sehingga ketika mereka bertabrakan, mereka mentransfer sebagian energi satu sama lain. Saya juga memperkenalkan kekuatan reaksi normal, sekarang partikel menghargai ruang pribadi mereka, mendorong orang lain menjauh dari diri mereka sendiri.

Kami menempatkan bola secara acak dan memberi mereka arah dan kecepatan acak. Biarkan mereka, katakanlah, 100 buah.



Kekacauan total, setiap partikel bergerak ke mana pun ia inginkan, namun demikian, gaya gravitasi mengambil korbannya dan kelompok-kelompok bola mulai terbentuk:



Dan setelah beberapa saat tubuh besar terbentuk, terdiri dari 99 bola dan satu bola tunggal yang mengorbit di sekitarnya:



Dengan peluncuran lain, berikut ini :



Dua benda besar yang mengorbit pusat massa bersama. Jika kita membayangkan bahwa kedua benda ini adalah bintang, maka kita mendapatkan bintang ganda. Menariknya, sekitar setengah dari bintang di galaksi kita adalah biner. Jika Matahari kita memiliki bintang pendamping, maka di langit kita dapat mengamati gambar berikut:



Dari mana asal planet?


Alasan utama kemunculan cincin adalah penghancuran satelit yang terbang terlalu dekat dengan planet, atau lebih tepatnya, melewati batas Roche . Dalam hal ini, gaya pasang surut yang disebabkan oleh gravitasi planet ini menjadi lebih besar daripada kekuatan yang menahan satelit, dan ia pecah menjadi banyak bagian, meninggalkan cincin yang mengelilingi planet. Mari kita simulasikan situasi ini:



Satelit sedikit lebih jauh dari batas Roche, ia berputar mengelilingi planet dalam orbit melingkar yang stabil. Tetapi apa yang terjadi jika Anda membuatnya sedikit lebih dekat ke planet ini?



Satelit tersebar ke banyak bagian kecil yang membentuk cincin di sekitar planet ini. Begitu juga di dunia nyata. Triton (satelit Neptunus) secara bertahap mendekati planet ini, dan dalam 2 miliar tahun akan terkoyak, dan Neptunus akan memiliki lebih banyak cincin daripada Saturnus.

Bagaimana Neptunus ditemukan dan apa hubungannya dengan matematika?


Karena kita berbicara tentang Neptunus, mari kita bicara tentang penemuannya. "Planet yang terbuka di ujung pena" memiliki massa, yang berarti benda itu bekerja pada benda-benda di sekitarnya. Para astronom abad ke-19 memperhatikan perubahan dalam orbit Uranus, orbitnya berbeda dari yang diperhitungkan, tampaknya, sesuatu memengaruhinya. Orbit Uranus mengalami gangguan:



Model berlebihan ini menunjukkan bagaimana benda tak dikenal di luar Uranus memengaruhi orbitnya. Astronom hanya bisa menghitung posisi planet rahasia dan melihat melalui teleskop. Memang, planet Neptunus persis seperti yang diperkirakan!



Kesimpulan


Tentu saja, simulasi ini tidak menyamaratakan semua hukum dan fenomena yang terjadi di ruang angkasa, misalnya, teori relativitas Einstein tidak diperhitungkan di sini, karena kecepatan partikel jauh dari kecepatan cahaya. Tetapi ada banyak hal lebih menarik yang dapat diimplementasikan dalam simulasi ini. Cobalah sendiri! Yang Anda butuhkan adalah Python3 dan perpustakaan Pygame.

Sumber
# 
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)


Saya harap artikel ini bermanfaat bagi Anda. Terimakasih atas perhatiannya!

All Articles