Ödev 3: Cevaplar

Teslim Tarihi: 31 Ekim 2019, Perşembe 09:30

Soru 1. (30 puan) Bir teleskobun açısal ayırma gücü

$$ \theta = 1.22 \frac{\lambda}{D} $$

ile verilir. Burada $\theta$ radyan cinsinden açısal ayırma gücünü, $\lambda$ gözlem yapılan ışığın dalgaboyunu ve $D$ teleskobun çapını göstermektedir.

Gözlem yapılan dalgaboyu ve teleskobun çapı sırasıyla Angstrom ve metre biriminde argüman olarak sağlanan acisal_ayirma_gucu isimli bir fonksiyon yazınız. Fonksiyonunuza $\lambda$ = 5000 A ve D = 0.35 m değerlerini göndererek, bu çapta bir teleskobun ayırma gücünü fonksiyonunuzla hesaplayarak ekrana yazdırınız.

In [31]:
def acisal_ayirma_gucu(wl,D):
    # Fonksiyona dalgaboyu A, teleskop m biriminde gonderilmektedir.
    # Bu durumda Angstromu metreye cevirmeliyiz (1 A = 10^-10 m)
    # Hesapladigimiz theta radyan biriminde olacaktir.
    theta = 1.22*(wl*1e-10) / D
    return theta

# test
dalgaboyu = 5000.0 # A
teleskop_capi = 0.35 # m
ayirma_gucu = acisal_ayirma_gucu(dalgaboyu, teleskop_capi)
print("{:.2f} capinda bir teleskobun {:.1f} Angstrom'deki acisal ayirma gucu {:g} radyandir.".\
      format(teleskop_capi, dalgaboyu, ayirma_gucu))
# Zorunda degilsiniz ama ayirma gucunu ifade etmek icin yaysaniyesi daha yaygin kullanilir
print("Bu acisal ayirma gucunun yaysaniyesi karsiligi {:.2f} yaysaniyesidir.".\
     format(ayirma_gucu*206265))
0.35 capinda bir teleskobun 5000.0 Angstrom'deki acisal ayirma gucu 1.74286e-06 radyandir.
Bu acisal ayirma gucunun yaysaniyesi karsiligi 0.36 yaysaniyesidir.

Soru 2. (45 puan) Doppler kayması formülü aşağıdaki ifadeyle verilir:

$$ \frac{V_{r}}{c} = \frac{\lambda - \lambda_{0}}{\lambda_{0}} $$

Burada $\lambda_{0}$ üzerinden ölçüm yapılan çizginin laboratuvar dalgaboyunu, $\lambda$ ise gözlenen yıldız tayfındaki dalgaboyunu göstermektedir. $V_r$ ise dikine hız değeridir ve ışık hızı ($c$) ile aynı birimde alınmalıdır.

Doppler kayması formülünü $\lambda_{0}$ ve $\lambda$ için sırasıyla wl_0 ve wl adlarıyla fonksiyon argümanı olarak tanımlı listelerden aldığınız çizgilere uygulayarak ortalama dikine hızı ve standart sapmasını hesaplayan ve programa geri döndüren bir fonksiyon yazınız. Fonksiyonunuzu balmer_0 = [3646, 4102, 4341, 4861, 6563] ve balmer_gozlenen = [3646.71, 4102.58, 4341.36, 4861.43, 6563.64] serilerine uygulayarak, bu çizgilerden hesaplayacağınız ortalama dikine hız ve standart sapması değerleri ile test ediniz.

In [24]:
def dikine_hiz(wl_0, wl):
    # Oncelikle ortalama ve standart sapma alan ifadeleri kendimiz kodlayalim
    # Once ortalamayi hesaplayan bir donguye ihtiyacimiz var
    # Zira standart sapma ortalama uzerinden hesaplanir.
    from math import sqrt
    toplam_Vr = 0.
    c = 299792.458  # km/s
    for i in range(len(wl_0)):
        Vr = c * (wl[i] - wl_0[i]) / wl_0[i]  
        toplam_Vr += Vr
    ortalama = toplam_Vr / len(wl_0)
    # Simdi standart sapmayi hesaplayan bir donguye ihtiyacimiz var.
    toplam_kare = 0. 
    for i in range(len(wl_0)):
        Vr = c * (wl[i] - wl_0[i]) / wl_0[i]
        print(Vr)
        toplam_kare += (Vr - ortalama)**2
    standart_sapma = sqrt(toplam_kare / (len(wl_0) - 1))
    return(ortalama, standart_sapma)
balmer_0 = [3646, 4102, 4341, 4861, 6563]
balmer_gozlenen = [3646.71, 4102.58, 4341.36, 4861.43, 6563.64] 
mu_Vr, sigma_Vr = dikine_hiz(balmer_0, balmer_gozlenen)
print("Verilen Balmer cizgilerinden olculen ortalama hiz {:.2f} km/s, standart sapmasi {:.2f} km/s 'dir".\
     format(mu_Vr, sigma_Vr))
58.37977103127013
42.388987235489566
24.86184862471823
26.51939044231377
29.234675166859386
Verilen Balmer cizgilerinden olculen ortalama hiz 36.28 km/s, standart sapmasi 14.15 km/s 'dir
In [27]:
# Alternatif cozum: gerek ortalama, gerek standart sapma icin
# dikine hizi birden fazla kez hesapiiyoruz. Bunlarin
# her birinin birer kez hesaplandigi birer fonksiyon yazmak
# daha zarif (ve Pythonik) bir cozum olacaktir.
def dikine_hiz(db_0, db):
    # Verilen iki dalgaboyunu kullanarak Doppler kaymasi
    # formuluyle sadece dalgaboyu hesaplayan fonksiyon
    c = 299792.458  # km/s
    Vr = c * (db - db_0) / db_0  
    return Vr
def ortalama(liste):
    # Bir listedeki degerlerin ortalamasini alan fonksiyon
    toplam = 0.
    for sayi in liste:
        toplam += sayi
    return toplam / len(liste)
def standart_sapma(liste):
    # Bir listedeki degerlerin standart sapmasini alan fonksiyon
    from math import sqrt
    mu = ortalama(liste)
    toplam_kare = 0.
    for sayi in liste:
        toplam_kare += (sayi - mu)**2
    return sqrt(toplam_kare / (len(liste)-1))
# Simdi bu uc fonksiyonu kullanarak test edebiliriz
balmer_0 = [3646, 4102, 4341, 4861, 6563]
balmer_gozlenen = [3646.71, 4102.58, 4341.36, 4861.43, 6563.64] 
# dikine_hiz fonksiyonunu kullanarak hesap yapan ve elde ettigi
# dikine hizi daha sonra ortalama ve standart sapmasini alacagimiz 
# Vr_liste listesini hizli liste olusturma yontemiyle olusturalim
# Bu cozum belki bir oncekiyle benzer sayida kod satiri iceriyor 
# ancak dikinze_hiz, ortalama ve standart_sapma fonksiyonlarini
# defalarca kullanabileceginiz, bir kere yazip bir daha yazmaya
# ihtiyac duymayacaginiz icin cok daha pratik!
Vr_liste = [dikine_hiz(balmer_0[i], balmer_gozlenen[i]) for i in range(len(balmer_0))]
mu_Vr = ortalama(Vr_liste)
sigma_Vr = standart_sapma(Vr_liste)
print("Verilen Balmer cizgilerinden olculen ortalama hiz {:.2f} km/s, standart sapmasi {:.2f} km/s 'dir".\
     format(mu_Vr, sigma_Vr))
Verilen Balmer cizgilerinden olculen ortalama hiz 36.28 km/s, standart sapmasi 14.15 km/s 'dir

Soru 3. (25 puan) Herhangi bir n tam sayısı için n! (faktöriyel) ‘i hesaplayan faktoriyel adında bir fonksiyon yazınız. Fonksiyonunuz doğru çalışıp çalışmadığını 10! sayısını hesaplayarak kontrol ediniz.

In [28]:
from functools import reduce
def faktoriyel(n):
    fact = 1
    for i in range(1, n+1):
        fact *= i
    return fact

N = 10
print("{:d}! = {:d}".format(N, faktoriyel(N)))

# Tek satirlik kod
# Bu cozumu konunun ilerleyen derslerinde goreceksiniz!
print("{:d}! = {:d}".format(N, reduce(lambda x,y:x*y, range(1,N+1))))
10! = 3628800
10! = 3628800