Trapezoidal Kuralı
21 Şubat 2021Sayısal İntegral Yöntemlerinin Kıyaslaması
21 Şubat 2021Simpson yöntemi diğer bir sayısal integral alma yöntemi.Bu sefer eğrinin altını dikdörtgenler ve yamuğa bölmüyoruz bunun yerine üst tarafı eğriye daha yakın bir eğri olan dikdörtgenimsi şekillere bölüyor ve bu alanları topluyoruz. Sanırım olayın görselleştirilmiş hali kafanızda canlandırmanız açısından daha iyi olacaktır. Şekilde farklı adım miktarları için simpson yöntemi ile alan hesaplamayı gösteriyor.
İki farklı simpson kuralı var: simpson 1/3 ve 3/8 kuralı. Yukarıdaki şekil her ne kadar 3/8 kuralını gösterse de, burada biz 1/3 kuralını kodlayacağız. Denklem olarak ifade edersek şu şekilde gösterilebilir.
\int_{0}^{n} f(x) d x \approx \frac{\Delta x}{3} \sum_{i=0}^{n / 2}\left(f\left(x_{2 i-2}\right)+4 f\left(x_{2 i-1}\right)+f\left(x_{2 i}\right)\right)
Simpson 1/3 kuralının bir sınırlaması da yöntemin uygulanması için integral aralığının eşit aralıklı çift sayıda alt-bölgeye ayrılmış olması gereklidir. Şimdi daha önceleri yaptığımız gibi matematiksel ifadeyi programlamada ifade edeceğiz. Yalnız seriyi bir kaç basamak yazarsanız göreceksiniz ki serinin son elemanı bir sonraki adımın, ilk ifadesi olacak böylece 2 kere hesaplanacak ve aslında açılım şu şekilde olacak.
f(0)+4 f(1)+2f(2)+4 f(3)+2f(4)........4f(n-1)+f(n)
def simpson13(y,x): if (len(x)-1) % 2 == 1: print("Çift sayıda bölgeye ayrılmalı") deltax = x[1] - x[0] alan = y[0] + y[-1] for i in range(1,len(x)): if i%2 == 0: alan = alan + 2 * y[i] else: alan = alan + 4 * y[i] - alan = alan * deltax/3 return alan
Tabi ki diğer yöntemlerde olduğu gibi bu yöntemde de fonksiyonumuzun girdisi eğriyi temsil eden x ve y noktaları. Fonksiyonun ilk satırlarında simpson kuralının şartlarından olan çift sayıda bölgenin olmasını kontrol ediyoruz. Bunun için % (modulus) oparatörünü kullanıyoruz. (len(x)-1) % 2 == 1 ile x listensinin boyutunun 2’ye bölümünden kalan 1 ise yani tek sayıda aralık varsa bir uyarı gösteriyoruz konsola.
Sonrasında serinin çarpanı olan adım miktarını deltax olarak hesaplıyoruz. sonrasında toplam sembolünün kodlamasında her zaman kullandığımız üzere bir başlangıç değeri ve döngü oluşturuyoruz. alan = y[0] + y[-1] ifadesi aslında yukarıdaki seri açılımında görüleceği üzere ilk terim ve son terimin çarpanı 1 bu sebeple başlangıç değerini ilk terim ve son terimin toplamı olarak alabiliriz.
Sonrasında döngüye başlıyoruz. Döngü kaç kere dönecek sorusu biraz kafa karıştırıcı olabilir. Denklem üzerinden incelersek seri n/2’ye kadar gidecek buradan nokta sayısının yarısını alabiliriz gibi düşünebiliriz, biz burada her döngüde serinin içindeki bir ifadeyi hesaplayacağımız için döngüyü nokta sayısı kadar aldık. Yani bir döngüde 4 çarpanlı diğer döngüde 2 çarpanlı ifadeyi hesaplayarak gideceğiz böylece her bir ifade n/2 kere hesaplanmış olacak. Birde başlangıç değerini ilk nokta ile hesapladığımız için döngüyü 1’den başlatıyoruz.
Şimdi döngüde her tek sayıdaki döngüde 4 çarpanlı ifadeyi hesaplıyor, her çift sayılı döngüde 2 çarpanlı ifadeyi hesaplayarak ilerliyoruz. Böylece döngüyü n kadar döndürsek de aslında yukarıdaki denklemdeki seri kadar n/2 kadar yapıyoruz işlemi.
Kod biraz karışık geldiyse daha basit haliyle simpson yöntemi şöyle de yazılabilir.
def simps(y,x): if (len(x)-1) % 2 == 1: print("Çift sayıda bölgeye ayrılmalı") deltax= x[1] - x[0] alan = deltax/3 * np.sum(y[0:-1:2] + 4*y[1::2] + y[2::2]) return alan
Burada döngü kullanmadan listelerin slice özelliğini kullanıyoruz. Yukarıdaki koddan tek farkı olan satırı açıklarsak; y listesinin 0. elemanından son elemanına kadar 2 şer atlayarak tüm elemanları alıyoruz sonra, ilk elemandan başlayarak sona kadar 2’şer atlayarak elemanları alıp 4 ile çarpıyoruz, sonrasında ikinci elemanından sona kadar 2’şer atlayarak son elemana kadar alıyoruz ve bunların hepsini topluyoruz np.sum() ile. Aslında denklemdeki seri ifadelerini slice ile alıyoruz.
Kafanız karıştıysa sizi uygulamaya davet ediyorum. O zaman simpson 3/8’i de siz kodlayın. Denklemi mi? o da şurada:
\int_{0}^{n} f(x) d x \approx \frac{3\Delta x}{8} \sum_{i=0}^{n / 3}\left(f\left(x_{3 i-3}\right)+3 f\left(x_{3 i-2}\right)+3 f\left(x_{3 i-1}\right)+f\left(x_{3 i}\right)\right)
Bu arada unutmadan bu yöntemin uygulanması için de integral aralığının eşit aralıklı üçle bölünebilir sayıda alt-bölgeye ayrılmış olması gereklidir. Birde bu kısıtlamalar sebebiyle tek sayıdaki nokta sayısına sahip listelerde önce simpson 3/8 ile nokta sayısını çift hale getirip sonrasında kalanına 1/3 uygulayan kompozit yöntemler var bunun içinde basit bir wikipedia aramasıyla onu da kodlayabilirsiniz.
Ders 2.4: İntegral Yöntemlerinin Kıyaslanması
Serdar Turgut İnce