2024-25 1. Ara Sınav#

06/11/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#

a) Verilen n elemanlı, 1 boyutlu A dizisinin elemanlarının sırasını tersine çevirip, B dizisine atayan kod yazın. (A dizisinin tanımlı olarak verildiğini ve tam sayılardan oluştuğunu varsayın. Normal bir Python listesi veya numpy dizisi olabilir.)

b) Tanımlanmış bir x değerinin A dizisinin kaçıncı elemanı olduğunu bulan bir kod yazın. (Eğer dizide birden fazla x değerine sahip eleman varsa, ilk bulduğunun sırasını (indisini) yazsın; eğer dizide x değeri yoksa -1 yazsın)

Hide code cell content
# Rastgele sayıda eleman içeren bir dizi oluşturalım 
# (bunun, soruda verilmiş olduğu varsayılıyor, yani
# çözüme dahil değil ;)
n = np.random.randint(5,21)
# n = len(A)
A = np.random.randint(-7,16,n)
A
array([-5,  4, -2, -7, -6, 14, -1, 12, 12,  1,  9, -1,  7,  5, -2, 13])
Hide code cell content
# a
B = A[::-1]
B
array([13, -2,  5,  7, -1,  9,  1, 12, 12, -1, 14, -6, -7, -2,  4, -5])
Hide code cell content
# A'nın içerisinden rastgele bir eleman çekip,
# x_var'ı bu şekilde tanımlayalım; A'da olmayan bir elemanı da 
# x_yok olarak tanımlayalım
# (bunun, soruda verilmiş olduğu varsayılıyor, yani
# çözüme dahil değil ;)
x_var = A[np.random.randint(0,n)]
x_yok = 999
x_var,x_yok
(-7, 999)
Hide code cell content
# b
x = x_var # x'in olduğu durum
#x = x_yok # x'in olmadığı durum
for i in range(n):
    flag_bulundu = False
    if(A[i] == x):
        print(i,". eleman = ",x)
        flag_bulundu = True
        break
if(flag_bulundu == False):
    print(-1)
3 . eleman =  -7

Alternatif Çözümler#

Hide code cell content
# a (alternatif)
B = []
for i in range(n-1,-1,-1):
    B.append(A[i])
B
[13, -2, 5, 7, -1, 9, 1, 12, 12, -1, 14, -6, -7, -2, 4, -5]
Hide code cell content
# a (alternatif)
B = []
for i in range(n):
    B.append(A[n-i-1])
B
[13, -2, 5, 7, -1, 9, 1, 12, 12, -1, 14, -6, -7, -2, 4, -5]
Hide code cell content
# b (alternatif, Python listesi kullanıldığı varsayılırsa)
x = x_var # x'in olduğu durum
#x = x_yok # x'in olmadığı durum
A_list = list(A)
if(x in A_list):
    print(A_list.index(x))
else:
    print(-1)
3
Hide code cell content
# b (alternatif, numpy dizisi kullanıldığı varsayılırsa)
x = x_var # x'in olduğu durum
#x = x_yok # x'in olmadığı durum
A_np = np.array(A)
filtre = A_np == x
if(filtre.sum()>0):
    print(np.arange(n)[filtre][0])
else:
    print(-1)
3

2#

(6x7)’lik, değerleri [-1,10] aralığında, rastgele tam sayılardan oluşan bir A matrisi üretip, ortalamasını hesaplayan kod yazın. (Örneğin, bütün elemanları toplayıp, eleman sayısına bölün)

Hide code cell content
A = np.random.randint(-1,11,(6,7))
m,n = A.shape
A,m,n
(array([[ 9,  7,  4,  3, -1,  7,  7],
        [ 9,  2,  6,  8,  7,  4,  4],
        [ 7,  0,  8,  1,  6,  3,  1],
        [ 3, -1,  0,  2,  8,  5,  9],
        [ 7,  4, 10,  5,  2,  4, 10],
        [-1,  5,  5,  9,  8,  9,  2]]),
 6,
 7)
Hide code cell content
toplam = 0
for i in range(m):
    for j in range(n):
        toplam = toplam + A[i,j]
ortalama = toplam / (m*n)
print(ortalama)
4.928571428571429

Alternatifler#

Hide code cell content
# sum() fonksiyonu ile de kolayca çözülebilir
toplam = A.sum()
ortalama = toplam/A.size
ortalama
4.928571428571429

Derste mean() fonksiyonunu görmemiş olsak da, bazı arkadaşlar o şekilde çözmüş olabileceklerinden, o doğrudan çözümü de paylaşayım:

Hide code cell content
# Derste görmediğimiz mean() fonksiyonu ile daha da pratik
A.mean()
4.928571428571429

3#

\[\begin{split}\begin{gather*} y = 4-3x\\ y = \frac{1-2x}{3} \end{gather*}\end{split}\]

doğrularının kesiştiği noktayı bulup, bileşenlerini x0 ve y0 değişkenlerine atayan kod yazınız.

Hide code cell content
# Denklemleri düzenlersek:
# 3x +  y = 4
# 2x + 3y = 1

# Katsayılar matrisi
A = np.array([[3,1],[2,3]])
# Değerler vektörü
b = np.array([4,1])

x0,y0 = np.linalg.solve(A,b)
x0,y0
(1.5714285714285714, -0.7142857142857142)

Alternatif#

Hide code cell content
# Eşitliğin iki tarafını da soldan A'nın tersiyle 
# çarpmak suretiyle
x0,y0 = np.dot(np.linalg.inv(A),b)
x0,y0
(1.5714285714285714, -0.7142857142857142)

4#

3. soruda denklemleri verilen doğruları \(x\in[0,5]\) aralığında çizdiren kod yazınız (doğrular düz çizgi şeklinde ve farklı renklerde olsunlar).

Bonus: 3. soruda bulduğunuz kesişim noktasını grafikte yıldız şeklinde işaretleyin.

Hide code cell content
x = np.linspace(0,5,300)
y1 = 4-3*x
y2 = (1-2*x)/3

plt.plot(x,y1,"b-")
plt.plot(x,y2,"g-")
# Bonus
plt.plot(x0,y0,"r*")

plt.show()
_images/8dbb5138bb54afb7a86f8d8a896028dfbc6861986d7be576b783d31d31f18610.png

5#

1000’e kadar olan asal sayıları bulup asal_sayilar dizisinde biriktiren kod yazın.

Hide code cell content
asal_sayilar = [2]
for i in range(3,1001):
    #print(i,"**")
    flag_asal_degil = 0
    for kucuk in range(2,i):
        #print(kucuk,sep=",")
        if(i % kucuk == 0):  
            #print("Bölündü! Asal sayı olamaz! 🙀")
            flag_asal_degil = 1
            break
    if(flag_asal_degil == 0):
        asal_sayilar.append(i)
    #print()
asal_sayilar
[2,
 3,
 5,
 7,
 11,
 13,
 17,
 19,
 23,
 29,
 31,
 37,
 41,
 43,
 47,
 53,
 59,
 61,
 67,
 71,
 73,
 79,
 83,
 89,
 97,
 101,
 103,
 107,
 109,
 113,
 127,
 131,
 137,
 139,
 149,
 151,
 157,
 163,
 167,
 173,
 179,
 181,
 191,
 193,
 197,
 199,
 211,
 223,
 227,
 229,
 233,
 239,
 241,
 251,
 257,
 263,
 269,
 271,
 277,
 281,
 283,
 293,
 307,
 311,
 313,
 317,
 331,
 337,
 347,
 349,
 353,
 359,
 367,
 373,
 379,
 383,
 389,
 397,
 401,
 409,
 419,
 421,
 431,
 433,
 439,
 443,
 449,
 457,
 461,
 463,
 467,
 479,
 487,
 491,
 499,
 503,
 509,
 521,
 523,
 541,
 547,
 557,
 563,
 569,
 571,
 577,
 587,
 593,
 599,
 601,
 607,
 613,
 617,
 619,
 631,
 641,
 643,
 647,
 653,
 659,
 661,
 673,
 677,
 683,
 691,
 701,
 709,
 719,
 727,
 733,
 739,
 743,
 751,
 757,
 761,
 769,
 773,
 787,
 797,
 809,
 811,
 821,
 823,
 827,
 829,
 839,
 853,
 857,
 859,
 863,
 877,
 881,
 883,
 887,
 907,
 911,
 919,
 929,
 937,
 941,
 947,
 953,
 967,
 971,
 977,
 983,
 991,
 997]