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;