İçeriğe geç

Ders 19.2 · Seviye 5 · Modül 19

Astropy ile ilk adımlar

1.861 kelime · 2 kaynak pasajı · yaklaşık 8 dakika okuma · seslendirme 12 dk

Önce özete göz atDersin sonundaki özet, okumaya başlamadan önce yol haritası olarak.
  1. Astropy, gökbilimciler tarafından yazılmış açık kaynaklı bir Python paketleri topluluğudur; birimleri sayılarla birlikte taşır, uyumsuz birimleri toplamaya kalkınca hata verir ve Wien sabiti gibi fiziksel sabitleri güncel değerleriyle içinde bulundurur.
  2. SkyCoord gök koordinatlarını tutar; «SkyCoord.from_name» bir yıldızı adıyla bulur, «separation» iki yıldız arasındaki açıyı, «transform_to(AltAz(...))» bir yıldızın belirli bir yer ve zamanda ufuktan yüksekliğini verir.
  3. Time yapısı gökbilimsel zaman ölçeklerini ve Jülyen günü gibi biçimleri tanır; iki an arasındaki farkı doğrudan hesaplar. Bu üç araç, gökbilimdeki hesapların çoğunun temelidir.

Kanca

23 Eylül 1999. NASA'nın Mars Climate Orbiter aracı, dokuz aylık yolculuğun sonunda Mars'ın arkasına geçiyor ve bir daha ondan haber alınamıyor. NASA'ya göre soruşturma, yer yazılımının İngiliz ölçü birimleriyle, aracın kendi yazılımınınsa metrik birimlerle çalıştığını ortaya çıkardı. Bir birim çevrilmemişti. Yörünge hesapları kaydı, araç gezegene fazla yaklaştı ve atmosferde yanarak yok oldu.

Bir sayının yanında birimi taşımak, kod yazarken ilk ihmal edilen şeydir. Bu derste tanıyacağın araç takımı birimleri sayılarla birlikte taşır, gökyüzündeki konumları anlar ve zamanı gökbilimcilerin kullandığı ölçeklerde tutar. Üstelik yalnızca bir satırla, adını bildiğin herhangi bir yıldızın gökteki yerini öğrenebilirsin.

Merkezi soru

Astropy nedir, birimler, gök koordinatları ve zamanla çalışmayı nasıl kolaylaştırır, ve bununla bir yıldızın bu gece senin şehrinden nerede görüneceğini nasıl hesaplayabilirsin?

Anlatım

Astropy nedir?

Astropy, gökbilimcilerin gökbilim için yazdığı, açık kaynaklı Python paketlerinin ortak adıdır. Astropy ekibinin 2022 makalesine göre projenin merkezinde, daha özel paketlerin üstüne kurulduğu çekirdek bir paket vardır; çevresinde birbirine uyumlu çalışan paketlerden bir ekosistem büyür. Bu paketi herkes ücretsiz kullanabilir, kodunu okuyabilir, hatta geliştirmesine katkı yapabilir.

Astropy'yi kullanmak için önce çağırırız. Birimler için «import astropy.units as u», fiziksel sabitler için «import astropy.constants as const» yazarız. Buradaki as, uzun adı kısaltır: bundan sonra astropy.units yerine yalnızca u yazmak yeter. Colab'da Astropy çoğu zaman hazır gelir; gelmezse bir hücreye «!pip install astropy» yazıp kurabilirsin.

Birimler sayıya yapışır

Astropy'de bir sayıyı bir birimle çarptığında, sonuç bir nicelik olur; sayı ile birim birlikte yol alır. «d = 1 * u.au» yazdığında d, bir astronomik birimdir. «d.to(u.km)» yazınca bilgisayar onu kilometreye çevirir: 149.597.870,7 kilometre. Bu, Uluslararası Astronomi Birliği'nin astronomik birim için benimsediği tam değerdir; Astropy onu içinde taşır.

Asıl güç, birimlerin işlemlerle birlikte hareket etmesindedir. «(1 * u.au / const.c).to(u.min)» yazalım: bir astronomik birimi ışık hızına bölüp dakikaya çeviriyoruz. Sonuç yaklaşık 8,32 dakika. Yani ışık, Güneş'ten buraya sekiz dakika yirmi saniye kadarda gelir. Bilgisayar ışık hızının değerini kendisi bildi, metreyi kilometreye, saniyeyi dakikaya kendisi çevirdi.

Şimdi bilerek bir hata yapalım: «1 u.m + 1 u.s». Bir metreyle bir saniyeyi toplamak anlamsızdır. Astropy bunu hemen yakalar ve bir birim dönüştürme hatası verir: toplama yalnızca uyumlu boyuttaki nicelikler için yapılabilir. Mars Climate Orbiter'ın yazılımı birimleri bu şekilde taşısaydı, uyumsuzluk daha yerdeyken göze batardı.

Çözümlü problem: Wien yasası birimleriyle

Ders 15.2'de ve bir önceki derste Wien yasasını üç milyon bölü sıcaklık diye kullandık. Bu, sabitin yuvarlanmış hâliydi. Astropy'nin sabitler listesinde Wien sabiti CODATA 2018 değeriyle durur: metre çarpı kelvin olarak yaklaşık 0,0028978. Kodu şöyle yazarız: «(const.b_wien / (5772 * u.K)).to(u.nm)».

Sonuç yaklaşık 502 nanometre. Sesli okunuşu: Wien sabiti bölü Güneş'in yüzey sıcaklığı, nanometreye çevrilince yaklaşık beş yüz iki. Önceki derste bulduğumuz yaklaşık 520 nanometre, üç milyonluk yuvarlamadan geliyordu; gerçek sabit yaklaşık iki milyon dokuz yüz bin ile hesap yapar. Yüzde 3,5'lik bu fark, elle hesabın nerede kısa kestiğini gösteriyor. Birimleri kod taşıdığı için kelvinin sadeleştiğini, metrenin nanometreye döndüğünü de biz izlemek zorunda kalmadık.

Çözümlü problem: Hubble zamanı tek satırda

Ders 18.2'de Hubble zamanını, megaparseği kilometreye, saniyeyi yıla elle çevirerek bulmuştuk. Astropy'de: «(1 / (70 * u.km / u.s / u.Mpc)).to(u.Gyr)». Sonuç yaklaşık 13,97 milyar yıl. Sesli okunuşu: bir bölü megaparsek başına saniyede yetmiş kilometre, milyar yıla çevrilince yaklaşık on üç virgül doksan yedi. Aynı sonucu bulduk, ama bu kez kilometreler birbirini götürürken hiçbir şeyi elle takip etmedik.

Çözümlü problem: Gezegenlere ışık süresi

Birimler tek bir sayıya değil, bir sayı dizisine de yapışabilir. Gezegenlerin Güneş'e ortalama uzaklıklarını astronomik birimle bir liste olarak yazalım: «d = [0.387, 1, 5.2, 30.07] * u.au». Merkür, Dünya, Jüpiter ve Neptün. Sonra tek satırda hepsini ışık hızına bölüp dakikaya çeviririz: «(d / const.c).to(u.min)».

Bizim çalıştırdığımızda dört sonuç birden çıktı: Merkür için yaklaşık 3,2 dakika, Dünya için 8,3, Jüpiter için 43,2 ve Neptün için yaklaşık 250 dakika, yani dört saatten biraz fazla. Sesli okunuşu: uzaklık dizisi bölü ışık hızı, dakikaya çevrilince üç, sekiz, kırk üç ve iki yüz elli. Neptün'deki bir uzay aracına gönderilen bir komut, dört saati aşkın bir süre sonra ulaşır; bir cevap için sekiz saatten fazla beklemek gerekir. Bir döngü bile yazmadan dört hesabı birden yaptık.

Gökyüzünde bir adres: SkyCoord

Ders 5.5'te gökyüzünün adres sistemini, yani göğün boylamı ile enlemini, görmüştük. Astropy bu adresleri SkyCoord adlı bir yapıyla tutar. Bir yıldızın koordinatlarını biliyorsan elle girersin. Bilmiyorsan, işte o tek satır: «SkyCoord.from_name("Vega")». Astropy'nin belgelerine göre bu komut, Strasbourg'daki CDS merkezinin ad çözücüsüne sorar ve yıldızın koordinatlarını getirir. Bunun için internete bağlı olman gerekir.

Bizim çalıştırdığımızda Vega için sağ açıklık 18 saat 36 dakika 56 saniye, dik açıklık +38 derece 47 dakika çıktı. Aynı nesneye «get_constellation» sorunca cevap Lyra, yani Çalgı takımyıldızı oldu. Deneb için Cygnus, yani Kuğu; Altair için Aquila, yani Kartal.

Çözümlü problem: Yaz Üçgeni'nin kenarları

Vega, Deneb ve Altair, yaz ve sonbahar akşamlarında göğün yüksek bir yerinde büyük bir üçgen çizer. Kenarlarını ölçmek için iki SkyCoord arasındaki açıyı «V.separation(D)» ile sorarız. Bizim hesabımızda Vega ile Deneb arası yaklaşık 23,8 derece, Vega ile Altair arası 34,2 derece, Deneb ile Altair arası 38,0 derece çıktı.

Bu açıları gökyüzünde elinle ölçebilirsin. Kolunu uzatıp parmaklarını açtığında elinin başparmak ucundan serçe parmak ucuna kadarki açıklık kabaca yirmi derece eder. Vega ile Deneb arasına bir karış biraz fazlası sığmalı; Deneb ile Altair arasına iki karışa yakın.

Başka bir adres defteri: galaksi koordinatları

Aynı yıldızın birden çok adresi olabilir. Gök ekvatoruna göre verilen adres, Dünya'nın ekseninden türer. Galaksimizin yapısını incelerken ise Samanyolu'nun düzlemine göre bir adres daha kullanışlıdır: galaksi koordinatları. Burada enlem, yıldızın Samanyolu düzleminden ne kadar yukarıda ya da aşağıda göründüğünü söyler.

Astropy'de bu çeviri tek sözcüktür: «V.galactic». Bizim hesabımızda Vega'nın galaksi enlemi yaklaşık 19 derece, Deneb'inki yaklaşık 2 derece çıktı. Deneb neredeyse tam Samanyolu şeridinin üstünde duruyor; karanlık bir gecede onu Samanyolu'nun parlak bulutlarının içinde görmen bu yüzden. Vega ise şeridin biraz kenarında kalır.

Senin gökyüzün: AltAz

Bu iki açı yıldızın gökteki sabit adresidir; ama sen belirli bir yerde, belirli bir anda duruyorsun. Yıldızın ufuktan ne kadar yüksekte, hangi yönde olduğunu bilmek istersin: yükseklik ve yön açısı. Astropy'de önce yerini tanımlarsın: «ist = EarthLocation(lat=41.01u.deg, lon=28.98u.deg)» İstanbul'dur. Sonra zamanı: «t = Time("2026-10-01 17:00:00")», bu saat eşgüdümlü evrensel zamandır, İstanbul'da akşam sekiz.

Son adım: «V.transform_to(AltAz(obstime=t, location=ist))». Bizim hesabımızda Vega o akşam İstanbul'dan yaklaşık 78 derece yükseklikte, yani neredeyse tepede görünüyordu. Aynı hesabı ertesi sabah saat sekiz için yapınca yükseklik yaklaşık eksi 9 derece çıktı: Vega ufkun altındaydı. Eksi bir yükseklik, yıldızın o an görünmediğini söyler.

Zaman da bir birimdir

Gökbilimde zaman, takvim tarihinden fazlasıdır. Astropy'nin belgelerine göre Time yapısı, gökbilimin kullandığı zaman ölçeklerini, örneğin eşgüdümlü evrensel zamanı ve uluslararası atom zamanını, ve gösterim biçimlerini, örneğin Jülyen günü ile değiştirilmiş Jülyen gününü destekler. Jülyen günü, geçmişte seçilmiş bir başlangıçtan bu yana sayılan kesintisiz gün sayısıdır; takvimlerin, ayların ve artık yılların karmaşasını ortadan kaldırır.

«t.jd» yazınca 1 Ekim 2026 akşamı için 2.461.315,208 çıktı. «t.mjd», yani değiştirilmiş Jülyen günü, 61.314,708 verdi; bu ikincisi, büyük sayıyı kısaltmak için 2.400.000,5 çıkarılmış hâlidir. İki zaman arasındaki farkı da doğrudan çıkarabilirsin: Apollo 11'in Ay'a indiği 20 Temmuz 1969 akşamından bu tarihe kadar, bizim hesabımızda, yaklaşık 20.892 gün, yani 57,2 yıl geçmiş.

Neden bu kadar önemli?

Birimler, koordinatlar ve zaman, gökbilimin neredeyse her hesabının temelidir. Bir yıldızın ışığını ölçmek, bir gezegen geçişinin saatini belirlemek, iki teleskobun gözlemini birleştirmek, hepsi bu üçünü doğru tutmaya bağlıdır. Astropy bu temeli sağlam kurar ki sen asıl soruya odaklanabilesin.

Yine de kodun verdiği her sayıya körü körüne güvenme. İyi bir alışkanlık, sonucu kabaca elle sağlamaktır: Hubble zamanı on dört milyar yıla yakın çıkmalı, Güneş'in ışığı dakikalar içinde gelmeli, bir yıldızın yüksekliği eksi doksan ile artı doksan derece arasında kalmalı. Beklediğin mertebeden çok farklı bir sonuç, genellikle yanlış yazılmış bir birimin ya da yanlış bir saat diliminin işaretidir. Kod hesabı hızlandırır; yargıyı sen verirsin.

Aslında…

Yaygın yanlış✗ "Birimler yalnızca kâğıt üzerinde önemlidir; kod yazarken sayıları doğru girmek yeter, bilgisayar hata yapmaz." ✓ Bilgisayar, kendisine verilen sayıyla ne yapması söylendiyse onu yapar; o sayının metre mi fit mi, saniye mi saat mi olduğunu bilmez.
Doğrusu

NASA'ya göre Mars Climate Orbiter, yer yazılımı İngiliz birimleriyle, araç yazılımı metrik birimlerle çalıştığı için yörüngesini şaşırdı ve 1999'da kayboldu. Astropy gibi araçlar birimleri sayıyla birlikte taşıyarak bu tür hataları işlem anında yakalar. Yanılgı, bilgisayarın hesap hatası yapmamasını, girdinin anlamını da anladığı biçiminde yorumlamaktan doğuyor.

Büyük resim

Astropy, gökbilim topluluğunun ortak alet çantası gibidir. Bir gökbilimcinin yazdığı kod, başka bir gökbilimcinin koduyla aynı birimleri, aynı koordinat yapılarını, aynı zaman tanımlarını konuşur. Bu uyum, dünyanın farklı yerlerindeki ekiplerin birbirinin sonuçlarını kontrol etmesini ve üstüne inşa etmesini kolaylaştırır.

Sonraki derslerde bu temel üstüne katlar ekleyeceğiz: gökbilimsel görüntülerin nasıl saklandığı, herkese açık arşivlerden veri indirme, bir yıldızın parlaklığını ölçme. Bu derste yazdığın her satır, o adımların yapı taşı olacak.

Özet

  1. Astropy, gökbilimciler tarafından yazılmış açık kaynaklı bir Python paketleri topluluğudur; birimleri sayılarla birlikte taşır, uyumsuz birimleri toplamaya kalkınca hata verir ve Wien sabiti gibi fiziksel sabitleri güncel değerleriyle içinde bulundurur.
  2. SkyCoord gök koordinatlarını tutar; «SkyCoord.from_name» bir yıldızı adıyla bulur, «separation» iki yıldız arasındaki açıyı, «transform_to(AltAz(...))» bir yıldızın belirli bir yer ve zamanda ufuktan yüksekliğini verir.
  3. Time yapısı gökbilimsel zaman ölçeklerini ve Jülyen günü gibi biçimleri tanır; iki an arasındaki farkı doğrudan hesaplar. Bu üç araç, gökbilimdeki hesapların çoğunun temelidir.

Görev

Quiz

  1. Mars Climate Orbiter neden kayboldu ve bu olay birimlerle çalışan kodun önemini nasıl gösterir?
  2. Astropy'de «1 u.m + 1 u.s» yazarsan ne olur ve neden?
  3. Wien sabitinin gerçek değeriyle Güneş'in tepe dalga boyu yaklaşık kaç nanometre çıkar ve üç milyonluk yuvarlama neden farklı sonuç verir?
  4. «SkyCoord.from_name("Vega")» ne yapar ve çalışması için ne gerekir?
  5. Bir yıldızın AltAz yüksekliği eksi dokuz derece çıkarsa ne demektir?

Cevaplar

  1. Yer yazılımı İngiliz, araç yazılımı metrik birimlerle çalıştığı için yörünge hesapları kaydı; birimleri sayıyla taşıyan bir kod bu uyumsuzluğu hesap anında yakalardı.
  2. Birim dönüştürme hatası verir; çünkü metre ile saniye farklı boyutlardadır ve toplanamaz.
  3. Yaklaşık 502 nanometre; üç milyon, gerçek değer olan yaklaşık iki milyon dokuz yüz binin yuvarlanmış hâli olduğu için sonucu yaklaşık yüzde 3,5 büyütür.
  4. CDS'nin ad çözücüsüne sorarak Vega'nın gök koordinatlarını getirir; bunun için internet bağlantısı gerekir.
  5. Yıldızın o an ufkun dokuz derece altında olduğu, yani o yerden görünmediği anlamına gelir.

Kaynaklar

Sonraki derse köprü

Bu derste yıldızların adreslerini ve zamanlarını hesapladık; ama gökbilimin ham maddesi görüntülerdir. Uzay teleskoplarının renkli fotoğrafları aslında renkli çekilmez: her biri, belirli bir süzgeçle alınmış siyah beyaz sayı tablolarından birleştirilir. Bu sayılar hangi dosya biçiminde saklanır, ve sen bir gökbilimsel görüntüyü nasıl açıp inceleyebilirsin?

Anlamadığın bir yer mi var?

Mentor yalnız bu dersin metnine dayanarak cevap verir. Metinde geçmeyen bir şey sorarsan uydurmaz, geçmediğini söyler.

Animasyon ve seslendirme notları

Animasyon ve seslendirme notları

  • Kanca: Mars'a yaklaşan bir uzay aracı; ekranın bir yanında "pound-second", öbür yanında "newton-second" yazan iki hesap kartı; aracın yolu kırmızı bir çizgiyle gezegene fazla yaklaşır ve sinyal kesilir.
  • Ekran kaydı, birimler: import astropy.units as u / import astropy.constants as const / (1u.au).to(u.km) → 149597870.7 km / (1u.au/const.c).to(u.min) → 8.3167 min / 1u.m + 1u.s → UnitConversionError.
  • Ekran kaydı, Wien: (const.b_wien/(5772*u.K)).to(u.nm) → 502.04 nm; yanında önceki dersin 519.75 sonucu üstü çizili değil, "yuvarlanmış sabit" notuyla.
  • Ekran kaydı, koordinat: V = SkyCoord.from_name("Vega") / V.separation(D) → 23.85 deg; ardından Yaz Üçgeni'nin gökyüzü çizimi ve kenarlarda açılar.
  • Ekran kaydı, AltAz: EarthLocation(lat=41.01u.deg, lon=28.98u.deg) / Time("2026-10-01 17:00:00") / alt ≈ 78.3 deg; ardından İstanbul semasında tepeye yakın parlayan Vega.
  • Seslendirme: Matilda. "Nicelik", "ad çözücü", "yükseklik ve yön açısı" ve "Jülyen günü" ilk geçişte vurgulu okunur; kod satırları yavaş okunur, noktalama sesli söylenmez.

Modül 19 — Veriyle Astronomi

Öğrenme hedefi: Birimler, koordinatlar ve zamanla çalışabilmek