Ödev 5: Cevaplar

Teslim Tarihi: 4 Aralık 2019, Çarşamba 13:30

  1. Uzaklıkları 10 ile 12 parsek arasında değişen yıldızların paralaktik kaymalarını hesaplamak üzere, i) 10'dan başlayıp 12'ye kadar (12 dahil!) 0.1 pc aralıkla bir uzaklik listesi oluşturup, bu listedeki her bir eleman için paralaktik kaymayı ($\pi$ (") = 1 /d (pc)) yaysaniyesi (") cinsinden hesaplayınız. Bulduğunuz her paralaks değerini paralaks listesine kaydettikten sonra uzaklik ve paralaks listelerini ekrana getiriniz. ii) $numpy$ $zeros$ fonksiyonunu kullanarak bir önceki sorudaki uzaklik listesiyle aynı uzunlukta bir uzaklik nümerik dizisi ve bu diziyle aynı uzunlukta bir paralaks dizisi oluşturunuz. Bir $for$ döngüsü içerisinde bu iki diziyi sırasıyla 0.1 pc aralıklarla 10-12 pc (12 dahil!) arası uzaklıklar ve bu uzaklıklara karşılık gelen paralaktik kayma değerleriyle doldurunuz. Oluşan iki diziyi ekrana yazdiriniz (iii) $numpy$ $linspace$ fonksiyonunu kullanarak 10-12 pc (12 dahil!) arası uzaklıkları içeren uzaklik nümerik dizisi oluşturunuz. Bu diziye paralaktik kayma formülünü uygulayarak tek bir seferde (döngü kullanmadan) paralaktik kaymaları hesaplayıp paralaks dizisine yazdırınız. Oluşan her iki diziyi ekrana yazdırınız.
In [1]:
import numpy as np
# i) Listelerle cozum
uzaklik = []
paralaks = []
adim_sayisi = int((12-10) / 0.1) + 1
for i in range(0,adim_sayisi,1):
    d = 10 + i*0.1
    p = 1 / d
    uzaklik.append(d)
    paralaks.append(p)
print("Liste yontemiyle olusturulan uzaklik ve paralaks listeleri:")
print("Uzakliklar: ", uzaklik)
print("Paralakslar: ", paralaks)
print("------------------------------------------------------------")
# ii) numpy.zeros ile cozum
uzaklik = np.zeros(len(uzaklik))
parlaks = np.zeros(len(paralaks))
for i in range(len(uzaklik)):
    d = 10 + i*0.1
    p = 1 / d
    uzaklik[i] = d
    paralaks[i] = p
print("numpy.zeros ile olusturulan uzaklik ve paralaks dizileri:")
print("Uzakliklar: ", uzaklik)
print("Paralakslar: ", paralaks)
print("------------------------------------------------------------")
# iii) numpy.linspace ile cozum
uzaklik = np.arange(10.0, 12.0, adim_sayisi)
# alternatif: numpy.arange ile cozum
# uzaklik = np.arange(10.0, 12.1, 0.1)
print(uzaklik)
paralaks = 1 / uzaklik
print("numpy.linspace ile olusturulan uzaklik ve paralaks dizileri:")
print("Uzakliklar: ", uzaklik)
print("Paralakslar: ", paralaks)
print("------------------------------------------------------------")
Liste yontemiyle olusturulan uzaklik ve paralaks listeleri:
Uzakliklar:  [10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0]
Paralakslar:  [0.1, 0.09900990099009901, 0.09803921568627452, 0.0970873786407767, 0.09615384615384615, 0.09523809523809523, 0.09433962264150944, 0.09345794392523366, 0.09259259259259259, 0.09174311926605504, 0.09090909090909091, 0.0900900900900901, 0.08928571428571429, 0.08849557522123894, 0.08771929824561403, 0.08695652173913043, 0.08620689655172414, 0.08547008547008547, 0.0847457627118644, 0.08403361344537814, 0.08333333333333333]
------------------------------------------------------------
numpy.zeros ile olusturulan uzaklik ve paralaks dizileri:
Uzakliklar:  [10.  10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 11.  11.1 11.2 11.3
 11.4 11.5 11.6 11.7 11.8 11.9 12. ]
Paralakslar:  [0.1, 0.09900990099009901, 0.09803921568627452, 0.0970873786407767, 0.09615384615384615, 0.09523809523809523, 0.09433962264150944, 0.09345794392523366, 0.09259259259259259, 0.09174311926605504, 0.09090909090909091, 0.0900900900900901, 0.08928571428571429, 0.08849557522123894, 0.08771929824561403, 0.08695652173913043, 0.08620689655172414, 0.08547008547008547, 0.0847457627118644, 0.08403361344537814, 0.08333333333333333]
------------------------------------------------------------
[10.]
numpy.linspace ile olusturulan uzaklik ve paralaks dizileri:
Uzakliklar:  [10.]
Paralakslar:  [0.1]
------------------------------------------------------------
  1. $numpy$ $linspace$ fonksiyonunu kullanarak, 0 ile $\pi$ arasında, aralarında eşit mesafe bulunan 20 adet açıyı (radyan birimlerinde) içeren bir $acilar$ nümerik dizisi oluşturunuz. Bu dizideki açıların sırasıyla sinus, kosinus, tanjant, kotanjant, sekant ve kosektantını alarak ayrı ayrı birer nümerik dizide toplayan bir Python kodu yazınız. Sonsuz (ya da eksi sonsuz) çıkabilecek sınırları çözüm dışında bırakınız.
In [2]:
import numpy as np
acilar = np.linspace(0,np.pi,20)
print("acilar dizisi: ", acilar)
sin_acilar = np.sin(acilar)
cos_acilar = np.cos(acilar)
# 0'a bolunmelerden kacinmak icin sirasiyla sinus ve kosinus'un
# O'a cok kucuk bir tolerans degeri kadar yakin degerlerini almiyoruz.
# Ancak negatif degerleri de 0'la karsilastirmak icin
# mutlak deger (np.abs) almamiz gerekecek.
tolerans = 1e-24
sec_acilar = 1 / cos_acilar[np.abs(cos_acilar) > tolerans]
cosec_acilar = 1 / sin_acilar[np.abs(sin_acilar) > tolerans]
print("-------------------------------------------")
print("i) sin(acilar) -->", sin_acilar)
print("i) cos(acilar) -->", cos_acilar)
print("iii) sec(acilar) -->", sec_acilar)
print("iv) cosec(acilar) -->", cosec_acilar)
print("-------------------------------------------")
acilar dizisi:  [0.         0.16534698 0.33069396 0.49604095 0.66138793 0.82673491
 0.99208189 1.15742887 1.32277585 1.48812284 1.65346982 1.8188168
 1.98416378 2.14951076 2.31485774 2.48020473 2.64555171 2.81089869
 2.97624567 3.14159265]
-------------------------------------------
i) sin(acilar) --> [0.00000000e+00 1.64594590e-01 3.24699469e-01 4.75947393e-01
 6.14212713e-01 7.35723911e-01 8.37166478e-01 9.15773327e-01
 9.69400266e-01 9.96584493e-01 9.96584493e-01 9.69400266e-01
 9.15773327e-01 8.37166478e-01 7.35723911e-01 6.14212713e-01
 4.75947393e-01 3.24699469e-01 1.64594590e-01 1.22464680e-16]
i) cos(acilar) --> [ 1.          0.9863613   0.94581724  0.87947375  0.78914051  0.67728157
  0.54694816  0.40169542  0.24548549  0.08257935 -0.08257935 -0.24548549
 -0.40169542 -0.54694816 -0.67728157 -0.78914051 -0.87947375 -0.94581724
 -0.9863613  -1.        ]
iii) sec(acilar) --> [  1.           1.01382728   1.05728671   1.1370436    1.26720145
   1.47649079   1.82832684   2.48944832   4.07356057  12.10956559
 -12.10956559  -4.07356057  -2.48944832  -1.82832684  -1.47649079
  -1.26720145  -1.1370436   -1.05728671  -1.01382728  -1.        ]
iv) cosec(acilar) --> [6.07553382e+00 3.07977097e+00 2.10107254e+00 1.62810046e+00
 1.35920552e+00 1.19450554e+00 1.09197328e+00 1.03156563e+00
 1.00342721e+00 1.00342721e+00 1.03156563e+00 1.09197328e+00
 1.19450554e+00 1.35920552e+00 1.62810046e+00 2.10107254e+00
 3.07977097e+00 6.07553382e+00 8.16561968e+15]
-------------------------------------------
  1. Bir önceki soruda oluşturduğunuz $acilar$ nümerik dizisinin $[\pi / 4 , \pi / 2]$ kapalı aralığında yer alan elemanlarını doğru indeksleme koşuluyla belirleyerek, bu elemanlara aşağıdaki fonksiyonu uygulayınız ve sonucu bir $numpy$ dizisinde saklayınız.
$$ f(x) = 4 sin(x) - 2 cos(-x) + 1 $$
In [3]:
import numpy as np
def f(x):
    return 4*np.sin(x) - 2*np.cos(-x) + 1
tolerans = 1e-6 # reel sayi karsilastirmasindan kacinmak icin kullanilan tolerans degeri
x = np.intersect1d(acilar[acilar >= np.pi/4 - tolerans], acilar[acilar < np.pi/2 + tolerans])
print("f([pi/4 <= x <= pi/2]) = ", f(x))
f([pi/4 <= x <= pi/2]) =  [2.5883325  3.2547696  3.85970246 4.38663009 4.82117928]
  1. $numpy$ $arange$ fonksiyonunu kullanarak 5 ile 10 arasında $[5., 5.2, 5.4, …, 10]$ şeklinde bir nümerik dizi oluşturunuz. Bu nümerik dizinin i) tamamını, ii) 4. elemanından sonraki tüm elemanlarını, iii) 20. elemanına kadar tüm elemanlarını, iv) 8 ile 16. elemanların arasındaki tüm elemanlarını, v) birer eleman atlayarak tüm elemanlarnı ($[5., 5.4, 5.8,…]$), vi) bu dizinin 6'dan büyük tüm elemanlarını, vii) bu dizinin 8'den küçük tüm elemanlarını, viii) bu dizinin 6 ile 8 arasındaki (6 ve 8 dahil) tüm elemanlarını ekrana uygun dilimlemeler (slicing) kullanarak yazdırınız.
In [7]:
import numpy as np
a = np.arange(5,10.1,0.2)
# i)
print("i) a[:] = ", a[:])
# ii)
print("ii) a[3:] = ", a[3:])
# iii)
print("iii) a[:20] = ", a[:20])
# iv)
print("iv) a[7:16] = ", a[7:16])
# v)
print("v) a[::2] = ", a[::2])
# vi)
print("vi) a[a > 6] = ", a[a > 6])
# vii)
print("vii) a[a < 8] = ", a[a < 8])
# viii)
tolerans = 1e-10
print("viii) a[6 <= a <= 8] = ", np.intersect1d(a[a > 6 - tolerans], a[a < 8 + tolerans]))
i) a[:] =  [ 5.   5.2  5.4  5.6  5.8  6.   6.2  6.4  6.6  6.8  7.   7.2  7.4  7.6
  7.8  8.   8.2  8.4  8.6  8.8  9.   9.2  9.4  9.6  9.8 10. ]
ii) a[3:] =  [ 5.6  5.8  6.   6.2  6.4  6.6  6.8  7.   7.2  7.4  7.6  7.8  8.   8.2
  8.4  8.6  8.8  9.   9.2  9.4  9.6  9.8 10. ]
iii) a[:20] =  [5.  5.2 5.4 5.6 5.8 6.  6.2 6.4 6.6 6.8 7.  7.2 7.4 7.6 7.8 8.  8.2 8.4
 8.6 8.8]
iv) a[7:16] =  [6.4 6.6 6.8 7.  7.2 7.4 7.6 7.8 8. ]
v) a[::2] =  [5.  5.4 5.8 6.2 6.6 7.  7.4 7.8 8.2 8.6 9.  9.4 9.8]
vi) a[a > 6] =  [ 6.   6.2  6.4  6.6  6.8  7.   7.2  7.4  7.6  7.8  8.   8.2  8.4  8.6
  8.8  9.   9.2  9.4  9.6  9.8 10. ]
vii) a[a < 8] =  [5.  5.2 5.4 5.6 5.8 6.  6.2 6.4 6.6 6.8 7.  7.2 7.4 7.6 7.8]
viii) a[6 <= a <= 8] =  [6.  6.2 6.4 6.6 6.8 7.  7.2 7.4 7.6 7.8 8. ]