2024-25 2. Ara Sınav

2024-25 2. Ara Sınav#

11/12/2024

Dr. Emre S. Taşcı, emre.tasci@hacettepe.edu.tr
Fizik Mühendisliği Bölümü
Hacettepe Üniversitesi

import numpy as np
import matplotlib.pyplot as plt

1#

Verilen \([a,b]\) aralığındaki bütün tamsayıların toplamını hesaplayan kod yazın.

Hide code cell content
a = 5 
b = 55 # diyelim (a ile b halihazırda verilmiş zira)
Hide code cell content
# Çözüm 1_1
np.arange(a,b+1).sum()
1530
Hide code cell content
# Çözüm 1_2
dizi = np.arange(a,b+1)
np.sum(dizi)
1530
Hide code cell content
# Çözüm 2
toplam = 0
for i in range(a,b+1):
    toplam = toplam + i
toplam
1530

2#

(100x2)’lik, her bir değeri -1 ile 1 arasında değişen (sınırları dahil de edebilirsiniz, dışarıda da bırakabilirsiniz, size kalmış) rastgele ondalıklı sayılardan oluşan bir ‘noktalar’ numpy dizisi oluşturun. Bu noktaların (0,0) noktasına olan uzaklıklarını hesaplatıp, sıralı olarak ‘mesafeler’ dizisinde toplayan kod yazın.

Hide code cell content
noktalar = np.random.rand(100,2)*2 - 1
Hide code cell content
# Çözüm 1
mesafeler = np.linalg.norm(noktalar,axis=1)
mesafeler
array([1.07499325, 0.24857006, 0.53011746, 0.33825794, 0.90244808,
       0.65972132, 0.80867328, 0.55730627, 0.38318553, 0.94119047,
       0.85986188, 0.59504123, 0.52640297, 0.55788273, 0.87590805,
       1.03123663, 0.4234794 , 1.13049989, 0.49500217, 0.66923789,
       0.8173986 , 0.62086787, 0.77607322, 0.3600567 , 0.97803954,
       1.16464208, 0.6477279 , 1.24858846, 0.12776746, 0.73782905,
       0.94352583, 0.79596316, 0.49766499, 0.78615852, 0.90252267,
       1.28240098, 0.45298318, 0.66869709, 1.22194719, 0.8948793 ,
       0.80072132, 0.90424402, 1.20478049, 1.2035012 , 0.43539162,
       0.91891848, 0.95159324, 0.84195679, 0.94484373, 0.72068995,
       0.66955766, 1.05708578, 0.72291408, 0.75386648, 0.41852303,
       0.90526113, 0.81902264, 1.02310109, 0.69000516, 0.33265191,
       0.29466093, 0.9470836 , 0.37427474, 1.17479613, 0.98635747,
       0.83233749, 0.93868129, 0.83223256, 0.94929543, 0.95093888,
       0.71430824, 0.89693135, 0.99666871, 1.19938781, 0.56926319,
       1.06800668, 0.59521045, 0.42984011, 1.21592831, 0.67295735,
       1.00060773, 1.24836194, 1.22605376, 0.63632507, 1.22150058,
       0.81876005, 0.55086139, 0.25077739, 0.35889845, 1.01605379,
       1.26484356, 0.19094141, 1.07764201, 0.63874168, 0.65430993,
       1.04937475, 1.01561025, 0.32757134, 0.86172667, 0.51517267])
Hide code cell content
# Çözüm 2
mesafeler = []
for nokta_no in range(100):
    mesafe = np.sqrt(noktalar[nokta_no][0]**2 + noktalar[nokta_no][1]**2)
    mesafeler.append(mesafe)
mesafeler
[1.0749932531532322,
 0.24857006012700233,
 0.5301174568979998,
 0.3382579396431715,
 0.9024480825402901,
 0.6597213160756921,
 0.8086732806686032,
 0.557306273744699,
 0.38318552650300874,
 0.9411904741479746,
 0.8598618810820522,
 0.5950412254761865,
 0.5264029723803276,
 0.5578827336166285,
 0.8759080523521708,
 1.031236633665217,
 0.4234794029232668,
 1.1304998888895774,
 0.49500216730944274,
 0.6692378875225021,
 0.8173985969082364,
 0.620867874072519,
 0.7760732231754672,
 0.3600566975600102,
 0.9780395407273278,
 1.1646420825083845,
 0.6477279016362029,
 1.2485884553028694,
 0.12776745528636171,
 0.7378290546919072,
 0.9435258298215249,
 0.7959631626623935,
 0.4976649932470249,
 0.7861585232283559,
 0.9025226653218213,
 1.2824009752474388,
 0.4529831774426424,
 0.6686970880444807,
 1.2219471923683043,
 0.8948793022344547,
 0.8007213202575266,
 0.9042440207311784,
 1.2047804895795526,
 1.2035011984854858,
 0.4353916245072016,
 0.9189184794641451,
 0.9515932445075661,
 0.8419567911564683,
 0.9448437330988667,
 0.7206899468768239,
 0.669557658551504,
 1.057085775084724,
 0.7229140759799426,
 0.7538664812390713,
 0.41852302610462133,
 0.9052611319529201,
 0.8190226394356356,
 1.0231010901309237,
 0.6900051575946105,
 0.33265190776153336,
 0.2946609303821488,
 0.9470835955190158,
 0.3742747432133454,
 1.1747961293554265,
 0.9863574749964108,
 0.8323374942327499,
 0.9386812864520837,
 0.8322325626578744,
 0.9492954265456318,
 0.9509388754490776,
 0.7143082438814035,
 0.8969313537211883,
 0.9966687091508356,
 1.1993878092804187,
 0.5692631923872371,
 1.0680066812650506,
 0.5952104526955956,
 0.42984010616652507,
 1.2159283077327283,
 0.6729573471460032,
 1.0006077311125603,
 1.2483619436234492,
 1.2260537570880463,
 0.6363250656632813,
 1.2215005751784074,
 0.8187600534581477,
 0.5508613912188493,
 0.2507773888686439,
 0.35889845424329375,
 1.0160537893623225,
 1.2648435619203455,
 0.19094140601300835,
 1.0776420109392846,
 0.6387416767888818,
 0.6543099270223515,
 1.0493747505834994,
 1.0156102532006415,
 0.32757134474389404,
 0.8617266709894644,
 0.5151726714137445]

3#

Verilen bir numpy dizisinin elemanlarının karelerinin toplamını döndüren bir fonksiyon yazın.

Hide code cell content
# Çözüm 1_1
def karetopla1_1(dizi):
    return (dizi**2).sum()

# Çözüm 1_2
def karetopla1_2(dizi):
    return np.sum(dizi**2)

# Çözüm 2
def karetopla2(dizi):
    toplam = 0
    for sayi in dizi:
        toplam = toplam + sayi**2
    return toplam
Hide code cell content
# Üzerinde işlem yapacağımız bir dizi tanımlayıp,
# fonksiyonları çağıralım
dizimiz = np.array([3,6,1,-3.2])

print(karetopla1_1(dizimiz))
print(karetopla1_2(dizimiz))
print(karetopla2(dizimiz))
56.24
56.24
56.24

4#

Elimizde ne olduğu bizden gizlice tanımlanmış bir f(x) fonksiyonu var: fonksiyonun ne olduğunu bilmiyoruz ama mesela ‘f(5)’ deyince fonksiyonun \(x=5\) noktasındaki değeri geliyor. Dahası bize bu fonksiyonun sürekli, türevlenebilir ve \(x\in(-5,5)\) aralığında bir kökü olduğu belirtilmiş. Fonksiyonun kökünü bulan kod yazın.

(İpucu: Örneğin yarılama yöntemini kullanabilirsiniz)

Hide code cell content
def f(x):
    # Örnek fonksiyon
    return np.cos(x) + x/5 + 0.6

x = np.linspace(-5,5,300)
plt.plot(x,f(x),"-")
plt.grid(True)
plt.show()
_images/db47e5a1743423eac7315da8134defd6f9f00c0d6daa921a97072f97aaa2469f.png
Hide code cell content
# Çözüm 1
hassasiyet = 1E-5

a = -5
b = 5
f_a = f(a)
f_b = f(b)

while(np.abs(a-b)>hassasiyet):
    c = (a+b)/2
    f_c = f(c)
    if((f_c * f_a) < 0):
        b = c
        f_b = f_c
    else:
        a = c
        f_a = f_c

print(c,f_c)

# İstenmemiş olsa da, grafikte tekrardan gösterelim:
plt.plot(x,f(x),"-")
plt.plot([-5,5],[0,0],"-k")
plt.plot(c,f_c,"ro")
plt.grid(True)
plt.show()
-1.810922622680664 -9.825057099011048e-06
_images/c7f6fe00da8e93e1088dafbc0096e38c8d5d611f708913557f5e9d13777fcdae.png
Hide code cell content
# Çözüm 2
hassasiyet = 1E-5
a = -5
f_a = f(a)
c = a + hassasiyet
f_c = f(c)
while((f_a*f_c)>0):
    a = c
    f_a = f_c
    c = a + hassasiyet
    f_c = f(c)
print(c,f_c)
-1.8109100000235165 4.959980466789915e-06

5#

Elimizde \(x\in [0,10]\) aralığında, düzgün sıralı \(10^6\) adet fonksiyon değeri var (‘x = np.linspace(0,10,1E6)’ yapmışız, sonrasında da ne olduğu bize söylenmeyen bu fonksiyonun o noktalardaki değerini hesaplatmışız gibi) – bu değerler ‘degerler’ numpy dizisinde tutuluyor olsun. Fonksiyonun türevini hesaplayıp çizdiren kod yazın.

Hide code cell content
# Verileri üretmek için yine aynı örnek fonksiyonu kullanıp,
# sonrasında da unutalım.

def f(x):
    # Örnek fonksiyon
    return np.cos(x) + x/5 + 0.6

x = np.linspace(0,10,int(1E6))
degerler = f(x)
Hide code cell content
# Çözüm

x = np.linspace(0,10,int(1E6))
# 'degerler' verilmiş durumda

delta_x = x[1] - x[0]

turev = (degerler[1:] - degerler[0:-1]) / delta_x

plt.plot(x[:-1],turev,"r--")
plt.show()
_images/c51949f342cf979325a097d3542c9819c597ab2d0ea6954e47b2e1ebbebe9a09.png

Ek olarak (soruda istenmemektedir, bilgi amaçlı olarak yapılmaktadır), türevin köklerinin gerçekten de fonksiyonun minimum/maksimum konumlarına denk geldiğini göstermek için değerlerle birlikte çizdirelim:

Hide code cell content
plt.plot(x,degerler,"b-")
plt.plot(x[:-1],turev,"r--")
plt.grid(True)
plt.xticks(np.arange(0,10.01))
plt.plot([0,10],[0,0],"k-")
plt.legend(["f","f'"])
plt.show()
_images/001a58bbd6bb3b2426ddadbbaf0ed61186d7cadb004b07571371dc0a8b9bf45f.png