Bir keresinde C++ ile integral hesabı yapmam gerekmişti, başta çok kolay olacağını düşünmüştüm. O zamanlar daha üniversiteye başlamamıştım. Lisede integral hesaplamak için bir yöntem öğreniriz. $\int x^a dx = \frac{x^{(a+1)}}{a+1} + c$ Bu yöntemi kağıt üzerinde kullanabilsem de bilgisayarda yapamadım. Daha sonra araştırmalarım Simpson Kuralı diye bir şey gördüm ve çok üstüne araştırmadan sadece gördüğüm formülü kodlayıp geçmiştim. Şimdi Matematik ve Bilgisayar Bilimleri okuyorum ve bazı şeyler hakkında daha fazla bilgim, fikrim var. Gördüm ki Nümerik Analiz çok ilgi çekici bir konuymuş. Bu konu hakkında bildiklerim ile bir şeyler yazmaya çalıştım. Konu hakkında uzman değilim eğer yanlış gördüğünüz bir yer varsa bana eposta göndermekten çekinmeyin lütfen.
Nümerik analizin amacı çözümünü analitik yöntemlerle yapamadığımız herhangi bir matematik problemini çözmek için yöntemler/algoritmalar bulmak ve yaklaşık sonuç bulmaktır. Genelde mühendisler tarafından sürekli kullanılır. Daha fazla bilgi için vikipedi:Sayısal Analiz sayfasına bakabilirsiniz.
Nümerik analizin farklı hesaplamalar için farklı alt türleri var. Bu yazıda göz atacağımız tür iste Sayısal İntegral. Bu noktada kullanabileceğimiz birçok yöntem var; Yamuklar Yöntemi, Simpson Yöntemi, Ramberg Algoritması, Gaussion Kuadroture Yöntemi… Bu yazıda ben Simpson Yöntemine değineceğim.
İsmini Thomas Simpson’dan alır. Basitçe fonksiyona benzer bir veya birden fazla polinomun alanını bularak yaklaşık integral bulmayı hedefler. Örneğin $\int_{a}^{b} f(x)dx$ için $a$ ve $b$ den geçen, tepe noktası $m = (a+b)/2$ olan bir $P(x)$ polinomu bulup $\int_{a}^{b} P(x)dx$ alırsak yaklaşık olarak bir sonuç bulabiliriz.
Bu eğri uydurma işlemine interpolasyon denir. Polinomlar için Lagrange İnterpolasyon Polinomu kullanılabilir.
$(x_0, f_0), (x_1, f_1), (x_2, f_2)$ gibi üç noktadan $f(x) = a_0 + a_1 x + a_2 x^2$ polinomunun geçtiğini düşünelim. \(L_0 = \frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}, L_1 = \frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}, L_2 = \frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}\) olmak üzere $f(x) = L_0f_0 + L_1f_1 + L_2f_2$ dir. Daha genel bir tanım ve interpolasyonlar hakkında daha detaylı bilgiler için kaynaklara göz atabilirsiniz.
Simpson yönteminde $n$ farklı parçaya ayırabilirsiniz, benim kullanacağım yöntem 2’ye ayırmak ve bir 2. dereceden polinom oluşturmak olacak. Bunun özel adı Simpson’un 1/3 kuralı veya Simpson’un 1. kuralıdır.
Lagrange interpolasyonu ile bir polinom oluşturalım. Yukarıdaki görseli hatırlayın. $a,b$ ve $m$.
\(P(x)dx = f(a)\frac{(x-m)(x-b)}{(a-m)(a-b)} + f(m)\frac{(x-a)(x-b)}{(m-a)(m-b)} + f(b)\frac{(x-a)(x-m)}{(b-a)(b-m)}\) olur. İki tarafında integralini alıp düzenlersek şu ifadenin doğruluğunu gösterebiliriz: \(\int_a^b P(x)dx = \frac{b-a}{6}[f(a)+4f(\frac{a+b}{2})+f(b)]\) Artık elimizde bir formül olduğuna göre bunu kodlayabiliriz.
# main.py
def simpson(f, x_0, x_2):
h = (x_2 - x_0)/2
x_1 = (x_2 + x_0)/2
area = (h/3)*(f(x_0) + 4*f(x_1) + f(x_2))
return area
Şimdi python da bu fonksiyon aracılığıyla integral hesaplayabiliriz. Örnek olarak $\int_0^2 x^2 dx$ i çözelim.
>>> from main import simpson
>>> def f(x):
... return x*x
...
>>> simpson(f, 0, 2)
2.6666666666666665
Gerçekten de sonuç olarak $\frac{8}{3}$ yani $2.6666$ verdiğini görebiliriz.
Merak edenler için formülü elde etmenin başka bir yöntemi daha var. Taylor Teoremi kullanabiliriz.
Kaynakça
Vikipedi:Sayısal Analiz
Wikipedia:Simpson’s rule
Wikipedia:Lagrange polynomial
numerikanaliz.com:Nümerik Analiz Nedir?
itu.edu.tr:Eğri uydurma ve İnterpolasyon
KBUZEM:Sayısal Analiz 11. Hafta İnterpolasyon
KBUZEM:Sayısal Analiz 14. Hafta Sayısal Türev ve İntegral
Kerem Ü.
kerem.ullen@proton.me