ก่อนอื่น ให้ผู้อ่านทำการติดตั้งโมดูล 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 ความคิดเห็น:
แสดงความคิดเห็น
แสดงความคิดเห็นได้ครับ :)