Monte Carlo İntegrali Alan Hesabı

Bir eğrinin altında yer alan alanı istatiksel bir yöntemle hesaplamak için Monte Carlo integral algoritması kullanılabilir. Bu algoritma ile, rasgele üretilen N adet noktanın kaç tanesinin fonksiyon eğrisinin altında yer aldığına bakılır. Rasgele seçilen noktaların yüzde kaçının eğri altında yer aldığına bakılarak, yaklaşık olarak alan hesabı yapılabilir.

Algoritma adımları aşağıdaki şekilde sıralanabilir:

  • Fonksiyonun verilen aralıktaki tüm değerlerini içine alacak şekilde bir dikdörtgen belirlenir.
  • Bu dörtgen içerisinde, N adet nokta rastgele olarak oluşturulur.
  • Bu noktaların ne kadarının, fonksiyonun belirlediği alanın altında olduğuna bakılır.
  • N değerinin, eğri altında olan nokta sayısına oranı, bize yaklaşık olarak, dikdörtgenin alanın fonksiyon eğrisi alanına oranını verecektir.

Aşağıda, Monte Carlo algoritmasının C# dilinde yazılmış kaynak kodu yer almaktadır.

using System;

namespace SG.Algoritma
{
    partial class MonteCarlo
    {
        // Deneme adet
        public uint N { get; set; }

        public MonteCarlo(uint n)
        {
            if (n == 0)
            {
                throw new ArgumentException(nameof(N));
            }

            this.N = n;
        }

        /// <summary>
        /// Verilen fonksiyon eğrisinin altında bulunan alan hesaplanıyor.
        /// </summary>
        /// <param name="func">Fonksiyon</param>
        /// <param name="x1">X ekseni üzerinde, aralık başlangıcı</param>
        /// <param name="x2">Aralık bitiş</param>
        public double CalculateArea(Func<double, double> func, double x1, double x2)
        {
            // Verilen aralıkta, fonksiyonun aldığı minimum ve maksimum değerler
            double min;
            double max;

            // Fonksiyonun minimum ve maksimum değeri hesaplanıyor
            this.CalculateMinMaxValue(func, x1, x2, out min, out max);

            // Denemelerden kaç tanesi, fonksiyon eğrisinin altında
            var hit = 0;

            // Rasgele sayı üretici
            var rand = new Random();

            // N adet dememe yap
            for (int i = 0; i < this.N; i++)
            {
                // Dikdörtgen içerisinde rasgele bir nokta üret
                var x = x1 + (x2 - x1) * rand.NextDouble();
                var y = min + (max - min) * rand.NextDouble();

                // Rasgele seçilen nokta ve fonksiyonun değeri, eğrinin aynı tarafındaysa. (İki negatif sayının çarpımı pozitiftir)
                if (func(x) * y > 0)
                {
                    // Fonksiyon değeri pozitifse
                    if (func(x) > 0)
                    {
                        // Rasgele üretilen y değeri fonsiyon eğrisinin altındaysa
                        if (func(x) > y) hit++;
                    }
                    else
                    {
                        // Rasgele üretilen y değeri fonsiyon eğrisinin üstündeyse
                        if (y < 0 && func(x) < y) hit++;
                    }
                }
            }

            var areaRectangle = Math.Abs(x2 - x1) * (max - min);

            // Seçilen rasgelen noktaların yüzde hit / N kadarı dikdörtgenin içerisinde.
            // Noktaların yüzde kaçının dikdörtgen içerisinde olduğuna bakılarak alan hesabı yapılıyor.

            return areaRectangle * (double)hit / this.N;
        }

        /// <summary>
        /// Verilen aralıkta, fornksiyonun minimum ve maksimum değerleri hesaplanıyor.
        /// </summary>
        /// <param name="func">Fonksiyon</param>
        /// <param name="x1">Aralık başlangıç</param>
        /// <param name="x2">Aralık bitiş</param>
        /// <param name="min">Hesaplanan minimum değer</param>
        /// <param name="max">Hesaplanan maksimum değer</param>
        private void CalculateMinMaxValue(Func<double, double> func, double x1, double x2, out double min, out double max)
        {
            min = double.MaxValue;
            max = double.MinValue;

            // Aralık N parçaya bölünüyor.
            var h = (x2 - x1) / this.N;

            // Verilen aralıkta, N adet nokta için, her bir noktanın fonksiyon değeri hesaplanıyor.
            for (int i = 0; i <= this.N; i++)
            {
                var x = x1 + i * h;
                var y = func(x);

                if (y < min) min = y;
                if (y > max) max = y;
            }
        }
    }
}

Monte Carlo alan hesabı algoritması ile, istediğiniz fonksiyon grafiği altında yer alan bölgenin alanını çok rahat bir şekilde hesaplayabiliriz. Fonksiyonun ne kadar karmaşık olduğunu bir önemi yok. Örneğin f(x) = x - sin(x) - 1 fonksiyon eğrisinin x ekseni {0,3} aralığındaki alanı hesaplamak için, alan hesaplama metodunu aşağıdaki gibi çalıştırabiliriz.

var mc = new MonteCarlo(1000);
var area = mc.CalculateArea(x => x - Math.Sin(x) - 1, 0, 3);

Bu durumda aşağıdaki eğri altında yer alan alan yaklaşık olarak hesaplanacaktır. Daha hassas bir hesaplamak için N değerinin artırılması gerekmektedir.

Monte Carlo Integration

Aynı algoritmada yapılacak küçük bir değişiklikle, fonksiyonun integral değeri de rahatlıkla hesaplanabilir. İntegral hesabında, pozitif alanlardan negatif alanlar çıkarılacağı için, bu alanlara düşen noktalar ayrı ayrı sayılır.

Etiketler:  C#

Workshop Başvuru Sonuçları

Hafta başı, hangi konularda çalışma grupları oluşturacağımıza dair önerilerini topladık. Şimdiye kadar 165 kişi, çalışma gruplarına katılmak istediğini belirtti ve katılmak istediği konuları seçti. Adaylar katılmak istedikleri çalışma gruplarının listesi aşağıdaki gibidir. (Bir aday birden fazla tercihte bulunabiliyor.)

Planlarımız, ilk çalışma grubunun, 19 Mart 2016 Cumartesi günü toplanması şeklinde. Son dakika bir değişiklik olmazsa, ilk workshop konumuz, aşağıdaki listede dördüncü sırada olan, Database Management & SQL konusu olacak. Bu konutu tercih eden kişilerden 10 kişilik bir grup oluşturmaya çalışacağız.

Hafta sonuna kadar, workshop sırasında üzerinde duracağımız konular netleştirilip, Database Management & SQL konusunda workshop yapmak isteyen adaylarla iletişime geçilecek. En uygun 10 aday ile ilk grup oluşturulmaya çalışacağız. sonraki 10 kişi için, ileri bir tarihte, aynı konuda bir çalışma grubu oluşturulabilir.

C#% 70
MS SQL Server% 58
HTML% 52
Database Management & SQL% 48
JavaScript% 45
CSS% 43
OOP% 39
Android Development% 33
MVC% 32
Entity Framework% 30
Bootstrap% 30
jQuery% 27
Web Service% 25
Linq% 24
Linux% 21
Testing% 21
Software Security% 19
XML, Json% 19
AJAX% 19
Data Structures% 19
NoSQL% 18
Design Patterns% 17
Web Api% 17
IOS Development% 16
MongoDB% 12
WCF% 12
MS Office Development% 10
Debugging% 10
Source Control & TFS% 10
Windows Service% 10
Azure% 9
Architecture% 8
SSAS% 5
SSIS% 5
Caching% 5
SharePoint% 5
SSRS% 5
Functional Programming & F#% 3
SignalR% 3

Yazılım Çalışma Grupları

Empatik Akademi tarafından, Birbirimizi Eğitelim Okulları kapsamında düzenlenecek olan Çalışma Grupları için ön başvurular başladı.

Yazılım sektöründe ilerleyen profesyonellerin katılımıyla oluşturulacak ve C#, NoSQL, Twitter Bootstrap vb. farklı konularda yapılacak workshoplar ile, katılımcıların konular hakkında derinleme bilgi sahibi olmaları, bu teknolojilerin kullanım alanları hakkında fikir alış verişinde bulunmaları ve örnek projeler ile konuların pekiştirilmesi amaçlanmaktadır.

Workshop

Her bir çalışma grubunun 10 kişiden oluşması ve bir konu hakkındaki çalışmanın bir ya da birkaç hafta sürmesi, adayların sadece istedikleri ve öncesinde bilgi sahibi oldukları çalışma grubuna katılmaları istenmektedir. Çalışmalar Empatik'in Merter ofisinde, Cumartesi sabahları yapılacaktır. Talebe göre, hafta içi bir akşam da, çalışma grubu oluşturulabilir.

C#, Linq, Entity Framework, MS Office Development, HTML, CSS, Bootstrap, XML, Json, JavaScript, jQuery, AJAX, Source Control & TFS, OOP, Functional Programming & F#, Architecture, Data Structures, Database Management & SQL, Design Patterns, MS SQL Server, NoSQL, MongoDB, SSIS, SSRS, SSAS, WCF, MVC, Web Api, Web Service, Windows Service, SignalR, Debugging, Testing, Caching, Software Security, SharePoint, Android Development, IOS Development, Bluetooth Beacon, Linux, Azure ve talep edilecek diğer konularda, yıl içerisinde çalışma grupları oluşturulması planlanmaktadır.

Çalışma gruplarının biri ya da bir kaçında yer almak için, ön talep anketini doldurmanız ve katılmak istediğiniz grupları seçmeniz gerekmektedir. Katılmak istediğiniz konuları seçtikten sonra, yıl içerisinde oluşturulacak gruplar için, gerekli duyurular e-posta adresinize gönderilecek ve istemeniz durumunda çalışma gruplarına katılımınız sağlanacaktır.

Ön talep formunu doldurmak için:

www.empatik.net/anket/ata.aspx?f=5AF3EC8218154F00AC7379C63E69579B

Sayfa 1 2 3 4

Kategoriler

Algoritma (5), Cheat Sheet (2), Framework (3), İpucu (5), Kendime Not (1), Kitap (4), Kod (5), Matematik (1), Proje (5), Veritabanı (3), Workshop (3)

Etiketler

C# (13) HTML (1) JavaScript (2) SQL (3)

İngilizce / Türkçe

İngilizce / Türkçe kelime listesi kendime not