2. Dönem - Arasınav2

advertisement
21.05.2012
GSÜ Matematik Bölümü
Algoritmalar ve İleri Bilgisayar Programlama - II
2.Arasınav
Ad / Soyad :
1.
Öğrenci No :
Aşağıda matematiksel tanımı verilen Gecikmeli Fibonacci rastgele sayı üretecinin ürettiği her sayı
(LCG’den farklı olarak) üretilen bir önceki sayıyının (Sn-1) değil, seçilen sabitlere göre j ve k önceki
değerlerinin bir fonksiyonudur. Tanımda yıldız ile gösterilen işlem tercihe göre +,-,x yada XOR
işlemlerinden biri olabilir, bu tercih üretecin kendini tekrarlamadan üretebileceği maksimum
uzunluğu etkiler.
a.
Yukarda verilen tanıma göre bu tür bir üretecin sayılar üretmeye devam edebilmesi için
adımlar arasında aklında tutması gereken (state) değerler hangileridir.
Verilen formüle baktığımızda her Sn değerinin kendinden j önceki ve k önceki değerin bir fonksiyonu olduğunu
görüyoruz. Öte yandan sadece bu iki değerin (j önceki ve k önceki) hatırlanması durumunda Sn hesaplanabilse
de Sn+1 hesaplanamaz. Her hangi bir n noktasından itibaren bütün takip eden değerlerin hesaplanabilmesi için
(Sn+1, Sn+2, …, Sn+m) en az Sn’den önceki k adet değerin hatırlanması yeterlidir.
b.
Gecikmeli fibonacci sayı üretecini m=100 , j=2 , k=4 sabitleri ve işlem olarak çarpma (x) ile
gerçekleyen Matlab sınıfına ait kodu yazınız. Sınıfınız:
i. parametre olarak alacağı bir başlangıç durumunu (state) properties’de
tanımladığınız değişkenlere atayan bir başlatma fonksiyonu
ii. sıradaki değeri döndüren parametresiz bir fonksiyon
iii. sıradaki değeri 0..1 aralığına normalize edilmiş olarak döndüren bir fonksiyon
içermelidir.
classdef gecikmeliFib < handle
properties
SN_eksi_1
SN_eksi_2
SN_eksi_3
SN_eksi_4
end
methods
function baslangicDurumuAyarla(obj,A,B,C,D)
obj.SN_eksi_1=A;
obj.SN_eksi_2=B;
obj.SN_eksi_3=C;
obj.SN_eksi_4=D;
end
function y = siradakiDeger(obj)
SN = mod(obj.SN_eksi_2 * obj.SN_eksi_4,100);
y = SN;
%%% bu noktada yeni bir SN ürettiğimiz için SN_eksi_X
%%% degiskenlerindeki değerleri de bir ileri kaydırmalıyız ki
%%% takip eden hesaplamalar doğru olsun
obj.SN_eksi_4 = obj.SN_eksi_3;
obj.SN_eksi_3 = obj.SN_eksi_2;
obj.SN_eksi_2 = obj.SN_eksi_1;
obj.SN_eksi_1 = SN;
end
function y = siradakiDeger01(obj)
%%% 0..m aralığından 0..1 aralığına geçmek için m’ye bölüyoruz
y = obj.siradakiDeger() / 100;
end
end
end
21.05.2012
GSÜ Matematik Bölümü
Algoritmalar ve İleri Bilgisayar Programlama - II
2.Arasınav
c.
başlangıç durumu S0=2 , S1=3 , S2=5 , S3=7 için üretecin üreteceği ilk 10 değer hesaplayınız.
S4 = S4-2 * S4-4 (mod 100) = S2 * S0 (mod 100) = 5 * 2 (mod 100) = 10 (mod 100) = 10
S5 = S5-2 * S5-4 (mod 100) = S3 * S1 (mod 100) = 7 * 3 (mod 100) = 21 (mod 100) = 21
S6 = S6-2 * S6-4 (mod 100) = S4 * S2 (mod 100) = 10 * 5 (mod 100) = 50 (mod 100) = 50
S7 = S7-2 * S7-4 (mod 100) = S5 * S3 (mod 100) = 21 * 7 (mod 100) = 147 (mod 100) = 47
S8 = S8-2 * S8-4 (mod 100) = S6 * S4 (mod 100) = 50 * 10 (mod 100) = 500 (mod 100) = 0
S9 = S9-2 * S9-4 (mod 100) = S7 * S5 (mod 100) = 47 * 21 (mod 100) = 987 (mod 100) = 87
S10 = S10-2 * S10-4 (mod 100) = S8 * S6 (mod 100) = 0 * 50 (mod 100) = 0 (mod 100) = 0
S11 = S11-2 * S11-4 (mod 100) = S9 * S7 (mod 100) = 87 * 47 (mod 100) = 4089 (mod 100) = 89
S12 = S12-2 * S12-4 (mod 100) = S10 * S8 (mod 100) = 0 * 0 (mod 100) = 0 (mod 100) = 0
S13 = S13-2 * S13-4 (mod 100) = S11 * S9 (mod 100) = 89 * 87 (mod 100) = 7743 (mod 100) = 43
2.
2
R ’de yarıçapları 1 ve merkezleri (1,1) ve (2,1) noktalarında olan iki dairenin kesişimlerinin alanınına
ait kestirimi, bu daireleri kapsayan uygun bir dikdörtgen içinde rastgele n adet nokta seçip (ilk
sorudaki sınıfı kullanarak), bunların dairelerin içinde kalıp kalmamasını kontrol ederek hesaplayan ilk
satırı aşağıda verilmiş Matlab fonksiyonunu yazınız.
function a = kesisimAlan(n)
İki daireyi içine alan en küçük dikdörtgen (0,0) ile (3,2) arasında olacağı için rastgele noktaları bu alan içinde
seçelim. Görüldüğü gibi böyle bir dikdörtgenin alanı 6 birim karedir.
function a = kesisimAlan(n)
%%% İlk sorudaki sınıftan bir nesne yaratalım
%%% notlandırmada hangi başlangıç durumunu seçtiğiniz önem taşımıyor
F = gecikmeliFib();
F.baslangicDurumuAyarla(11,17,19,23);
%%% noktalardan iki dairenin kesişimine düşenleri saymak için bir sayaç
kesisim_icinde = 0;
%%% n kez tekrarla:
for p=1:n
%%% rastgele nokta seçmek rastgele koordinatlar seçmek ile aynı şey
%%% noktalar (0,0) – (3,2) dikdörtgeni içinde olsun
x = F.siradakiDeger01()*3;
y = F.siradakiDeger01()*2;
%%% koşul:eğer (x,y) noktasının (1,1)’e uzaklığı <1 ve
%%%
(x,y) noktasının (2,1)’e uzaklığı <1 ise
if ( sqrt((x-1)*(x-1)+(y-1)*(y-1))<1 &&
sqrt((x-2)*(x-2)+(y-1)*(y-1))<1
)
%%% sayacı bir arttır
kesisim_icinde = kesisim_icinde + 1;
end
end
%%% kesişim içine düşen noktaların tüm noktalara oranı, kesişim
%%% alanının dikdörtgen alanına oranına yakınsar.
%%% kesişim alanı = dikdörtgen alanı*(kesişimdeki nokta/toplam nokta)
a = 6 * kesisim_icinde / n;
21.05.2012
GSÜ Matematik Bölümü
Algoritmalar ve İleri Bilgisayar Programlama - II
2.Arasınav
3.
Sin(x) fonksiyonu için, x’in Xa ve Xb değerleri arasında eğrinin altında kalan alanı deltaX parçaya
bölerek, oluşan dikdörtgenlerin alanlarının toplamı ile ilgili belirli integrali hesaplayan, ilk satırı aşağıda
verilmiş Matlab fonksiyonunu yazınız.
function i = sinint(Xa,Xb,deltaX)
function i = sinint(Xa,Xb,deltaX)
%%% soruda deltaX’in parça sayısı olduğu söylenmiş ama deltaX’i her
%%% parçanın genişliği olarak alan cevaplar da doğru sayılacak
genislik = (Xb-Xa) / deltaX;
toplamAlan = 0;
for x = Xa:genislik:Xb
toplamAlan = toplamAlan + genislik*sin(x);
end
i = toplamAlan;
Download