12 กุมภาพันธ์ 2560

Published กุมภาพันธ์ 12, 2560 by with 0 comment

ดาราศาสตร์กับ Python : หาระยะห่างระหว่างดวงดาว

สวัสดีผู้อ่านที่สนใจด้านดาราศาสตร์ทุกท่านครับ บทความชุด "ดาราศาสตร์กับ Python" จะพาผู้อ่านไปเขียนโปรแกรมพร้อมกับเรียนรู้ด้านดาราศาสตร์ไปพร้อมกันครับ


ก่อนอื่น ให้ผู้อ่านทำการติดตั้งโมดูล Skyfield ก่อน

โมดูล Skyfield เป็นโมดูลสำหรับช่วยคำนวณงานด้านดาราศาสตร์โดยใช้ข้อมูล SPK มาประมวลผลใน Python

ข้อมูล SPK คืออะไร ?
SPK ย่อมาจาก Spacecraft and Planet Kernel จากนาซ่า (NASA) โดยจะให้ค่าพิกัด (x,y,z) ของวัตถุในอวกาศที่อยู่ในระบบสุริยะจักรวาล เป็นไฟล์นามสกุล bsp

โมดูล Skyfield ใช้ MIT License รองรับ Python 2 , Python 3 ต้องการโมดูล NumPy ในการทำงาน
ติดตั้งได้ด้วยคำสั่ง : pip install skyfield

เมื่อทำการติดตั้งแล้ว เราจะไปหาไฟล์ข้อมูล SPK กันครับ

ไฟล์ข้อมูล SPK สามารถโหลดได้จากเว็บนาซ่า โดยพิมพ์คีย์ ".bsp" site:nasa.gov ในกูเกิล
สำหรับบทความนี้ขอใช้ไฟล์ de432s.bsp จาก https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/

เมื่อทำการโหลดมาแล้ว ให้ทำการเขียนโค้ด Python ดังนี้

from skyfield.api import load
planets = load('de432s.bsp')

ก่อนอื่น ให้ทำการดูรายชื่อการคำนวณที่รองรับ
print(planets)

ผลลัพธ์
ในนี้จะแสดงรายละอียดข้อมูลที่สามารถคำนวณได้
SPICE kernel file 'de432s.bsp' has 14 segments
  JD 2433264.50 - JD 2469808.50  (1949-12-13 through 2050-01-01)
      0 -> 1    SOLAR SYSTEM BARYCENTER -> MERCURY BARYCENTER
      0 -> 2    SOLAR SYSTEM BARYCENTER -> VENUS BARYCENTER
      0 -> 3    SOLAR SYSTEM BARYCENTER -> EARTH BARYCENTER
      0 -> 4    SOLAR SYSTEM BARYCENTER -> MARS BARYCENTER
      0 -> 5    SOLAR SYSTEM BARYCENTER -> JUPITER BARYCENTER
      0 -> 6    SOLAR SYSTEM BARYCENTER -> SATURN BARYCENTER
      0 -> 7    SOLAR SYSTEM BARYCENTER -> URANUS BARYCENTER
      0 -> 8    SOLAR SYSTEM BARYCENTER -> NEPTUNE BARYCENTER
      0 -> 9    SOLAR SYSTEM BARYCENTER -> PLUTO BARYCENTER
      0 -> 10   SOLAR SYSTEM BARYCENTER -> SUN
      3 -> 301  EARTH BARYCENTER -> MOON
      3 -> 399  EARTH BARYCENTER -> EARTH
      1 -> 199  MERCURY BARYCENTER -> MERCURY
      2 -> 299  VENUS BARYCENTER -> VENUS

จะเห็นได้ว่า ในนี้รองรับการคำนวณระยะห่างหลายอย่าง ตามเวลาที่กำหนดนับตั้งแต่ 1949-12-13  ถึง 2050-01-01

ต่อไปเรามาคำนวณระยะห่างจากโลกไปดาวพฤหัสกัน
เรามาดึงข้อมูล ณ เวลาปัจจุบันของดาวพฤหัสและโลก
earth, jupiter = planets['EARTH'], planets['JUPITER BARYCENTER']
ts = load.timescale()
t = ts.now() # เวลา Julian Date ตอนนี้

เวลาที่ t = ts.now() จะเป็นเวลา Julian Date เราสามารถแปลงเป็นวันเดือนปี เวลาปกติได้โดยการใช้โค้ดจาก https://gist.github.com/jiffyclub/1294443
บันทึกไฟล์ jdutil.py แล้วให้เรียกใช้งานด้วยโค้ด
from jdutil import *
timenow = jd_to_datetime(float(t.tt))

แล้วคำนวณระยะห่างจากโลกไปดาวพฤหัสต่อ
astrometric = earth.at(t).observe(jupiter)
ra, dec, distance = astrometric.radec()
print('โปรแกรมคำนวณระยะห่างจากโลกกับดาวพฤหัส')
print(timenow.strftime('%Y-%m-%d %H:%M:%S'))
print(ra)
print(dec)
print("ระยะห่าง %s" % distance) # ระยะทาง คืนค่าหน่วยดาราศาสตร์

ผลลัพธ์
โปรแกรมคำนวณระยะห่างจากโลกกับดาวพฤหัส
2017-02-11 17:10:23
13h 26m 44.09s
-07deg 32' 20.7"
ระยะห่าง 4.89463 au

ข้อควรรู้
1 au คือ 1 หน่วยดาราศาสตร์ เป็นระยะทางเฉลี่ยจากโลกถึงดวงอาทิตย์ โดย 1 au มีค่าประมาณ 149.598 ล้านกิโลเมตร อ่านเกี่ยวกับการหาค่าระยะห่างหน่วยดาราศาสตร์ได้ที่ http://www.atom.rmutphysics.com/charud/oldnews/0/278/cosmos/116.htm

โค้ดฉบับเต็ม
from skyfield.api import load
planets = load('de432s.bsp')
earth, jupiter = planets['EARTH'], planets['JUPITER BARYCENTER']
ts = load.timescale()
t = ts.now() # เวลา Julian Date ตอนนี้
from jdutil import *
timenow = jd_to_datetime(float(t.tt))
astrometric = earth.at(t).observe(jupiter)
ra, dec, distance = astrometric.radec()
print('โปรแกรมคำนวณระยะห่างจากโลกกับดาวพฤหัส')
print(timenow.strftime('%Y-%m-%d %H:%M:%S'))
print(ra)
print(dec)
print("ระยะห่าง %s" % distance) # คืนค่าหน่วยดาราศาสตร์

นอกจากคำนวณหาระยะห่างระหว่างดวงดาวแล้ว โมดูล skyfield ยังมีความสามารถหลายอย่าง รอผู้สนใจด้านดาราศาสตร์นำไปใช้งาน ค้นหาได้ที่ http://rhodesmill.org/skyfield/

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)