Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

大概是這樣;such and such

未关闭
#4 0 条评论 1 个 reaction 已指派 1 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

这个 Issue 还没有评估数据。

描述

專案簡介

本專案示範如何使用 Python 及開源套件(Astropy、SciPy 等)實作天體力學(Celestial Mechanics),涵蓋

  • 現代經典力學:行星運動、開普勒問題
  • 廣義相對論修正:近星行星進動、時鐘延遲

範例程式碼基於 Astropy 與 SciPy 撰寫,並搭配 NumPy、Matplotlib 做數值計算與可視化。


環境安裝

# 建議使用 virtualenv / conda 建立隔離環境
pip install astropy scipy numpy matplotlib

理論背景

1. 經典力學(Newtonian Mechanics)
  • 牛頓萬有引力定律:

    $$
    F = G \frac{m_1 m_2}{r^2}
    $$

  • 行星的二體問題、開普勒三定律

  • 開普勒方程式數值求解

2. 廣義相對論(General Relativity)修正
  • 施瓦茲席爾德 (Schwarzschild) 度規下的行星軌道進動

    $$
    \Delta\omega \approx \frac{6\pi GM}{c^2 a(1 - e^2)}
    $$

  • 時間延遲(Shapiro Delay)


目錄結構範例

celestial_mechanics/
│
├── data/                  # 觀測或模擬資料
├── src/
│   ├── classical.py       # 經典力學相關函式
│   ├── relativity.py      # 相對論修正函式
│   └── utils.py           # 公用工具函式
│
├── notebooks/             # Jupyter 筆記本示例
│   ├── kepler.ipynb
│   └── precession.ipynb
│
├── tests/                 # 單元測試
└── README.md

範例一:經典二體問題與開普勒方程式

# src/classical.py
import numpy as np
from scipy.optimize import newton

G = 6.67430e-11  # 萬有引力常數 [m^3 kg^-1 s^-2]

def kepler_equation(E, M, e):
    """開普勒方程式:E - e*sinE = M"""
    return E - e * np.sin(E) - M

def solve_kepler(M, e):
    """
    求解偏近點角 E
    M: 平均近點角 [rad]
    e: 離心率
    """
    return newton(kepler_equation, M, args=(M, e))

def orbital_elements_to_state(a, e, M, mu):
    """
    將軌道要素轉換為位置與速度向量(經典力學)
    a: 半長軸, e: 離心率, M: 平均近點角, mu = G*(m1+m2)
    """
    E = solve_kepler(M, e)
    # 球座標距離與真近點角
    r = a * (1 - e * np.cos(E))
    nu = 2 * np.arctan2(
        np.sqrt(1+e)*np.sin(E/2),
        np.sqrt(1-e)*np.cos(E/2)
    )
    # 平面座標
    x = r * np.cos(nu)
    y = r * np.sin(nu)
    # 速度計算略...
    return np.array([x, y, 0.0]), np.array([-np.sin(E), np.sqrt(1-e**2)*np.cos(E), 0.0]) * np.sqrt(mu*a) / r

範例二:廣義相對論進動修正

# src/relativity.py
import numpy as np

def pericenter_precession(a, e, M_central):
    """
    計算近日點進動角度 Δω(rad/週期)
    a: 半長軸 (m)
    e: 離心率
    M_central: 中心天體質量 (kg)
    """
    c = 299792458.0  # 光速 (m/s)
    return 6 * np.pi * G * M_central / (c**2 * a * (1 - e**2))

def shapiro_delay(r1, r2, M_central):
    """
    計算 Shapiro 時延 (秒)
    r1, r2: 訊號傳輸起訖距離向量長度 (m)
    """
    c = 299792458.0
    return 2 * G * M_central / c**3 * np.log((r1 + r2 + np.linalg.norm(r2-r1)) / (r1 + r2 - np.linalg.norm(r2-r1)))

Jupyter 筆記本示例

kepler.ipynb
  1. 載入 src/classical.py
  2. 設定地球–太陽系參數
  3. 演示開普勒方程式求解
  4. 畫出橢圓軌道位置
precession.ipynb
  1. 載入 src/relativity.py
  2. 以水星軌道為例,計算近日點進動
  3. 與觀測值比較
  4. 可視化進動角隨時間之變化

可視化範例

import matplotlib.pyplot as plt
from src.classical import orbital_elements_to_state
from src.relativity import pericenter_precession

# 假設參數:以水星為例
a = 5.79e10      # m
e = 0.2056
M_central = 1.9885e30  # 太陽質量 kg
mu = G * M_central

# 計算近日點進動
delta_omega = pericenter_precession(a, e, M_central)
print(f"每軌道進動角: {np.degrees(delta_omega):.6f} 度")

# 繪製一個軌道週期的軌跡
M_vals = np.linspace(0, 2*np.pi, 500)
coords = [orbital_elements_to_state(a, e, M, mu)[0] for M in M_vals]
xs, ys = zip(*[(c[0], c[1]) for c in coords])

plt.figure()
plt.plot(xs, ys)
plt.scatter([0], [0], color='orange', label='中央天體')
plt.axis('equal')
plt.legend()
plt.title("開普勒橢圓軌道示意圖")
plt.xlabel("x (m)")
plt.ylabel("y (m)")
plt.show()

測試與持續整合

  • 使用 pytest 撰寫單元測試,驗證 Kepler 解、近日點進動公式

  • GitHub Actions 自動化:

    name: CI
    on: [push, pull_request]
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - uses: actions/setup-python@v2
          with: python-version: '3.10'
        - run: pip install -r requirements.txt pytest
        - run: pytest --maxfail=1 --disable-warnings -q
    

未來拓展

  • 多體問題:N-體模擬、Barnes–Hut 或螺旋法加速
  • 數值積分器:Runge–Kutta、Symplectic integrator 比較
  • 更深入相對論:利用 EinsteinPy 或自行實作 GR 數值积分
  • 資料驅動:整合實際天文觀測資料,進行參數擬合

參考資料

主要语言
Astro
星标
1
派生
1
PR 合并指标
30 天内没有已合并 PR

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

ewdlop/AstroLibrary 的其他 Issue

查看 ewdlop/AstroLibrary 的全部 Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。