top of page

Python ve Nümerik Hesaplama

Güncelleme tarihi: 20 Eyl 2023

Böyle bir görevimiz olduğunu düşününüz; “verilen bir eğrinin altında kalan alanı, nümerik olarak hesaplamaya yarayan bir matematiksel yapı türetiniz ve bunu bilgisayar dili ile ifade edip, hesaplama sonuçlarını gösteriniz.


Öncelikle ilk girişmemiz gereken iş, bu yapıyı ifade edecek bir matematiksel yapı oluşturmaktır. Görsel-1 de bir eğrinin, yani bir fonksiyonun altında kalan, a ile b arası boyalı bölge bir alanı ifade ediyor.


Görsel-1


O halde bu alanı, genişliği küçük dikdörtgenlerle ifade edersek, bunu dikdörtgen sayısına bağlı bir şekilde nümerik bir yaklaşım oluşturabiliriz. (Bakınız Görsel-2, A)


Görsel-2


Görsel-2 de ki fonksiyonun oluşturduğu eğriyi 10 benzer genişliğe sahip dikdörtgenlere böldük. Temel yaklaşımımız şu; her bir dikdörtgenin alanını bulup, toplayacak olursak eğrinin altında kalan alanı yaklaşık olarak hesaplayabiliriz. Nitekim Görsel-2 de bunu yaptık. Ve dikdörtgenlerin alanını f(x) fonksiyonuna bağlı bir şekilde ifade ettik. Burada f(x*), Δx arasında bir örnek nokta ve onun f(x) çıktısı.


Görsel-3


O halde, Görsel-3 de gözüktüğü üzere her bir dikdörtgen alanın toplamını, bu şekilde matematiksel notasyonla ifade edebiliriz. Burada, k=1, ilk dikdörtgenden,k=m son m.(m-inci) dikdörtgene kadar toplayıp, toplam alanı verir. Burada Δx her bir dikdörtgenin genişliğini ifade ettiğini ve f(x*) in ise aslında h(yüksekliğini) ifade ettiğini vurgulamıştık. Dikdörtgen genişliklerini benzer tutacağımızı söylediğimiz için bunu daha da basitleştirebiliriz. a ile b arasında “n” tane benzer genişliğe sahip dikdörtgen olduğunu biliyoruz. O halde bu dikdörtgenlerin genişliği b’den a’nın çıkarılması ve dikdörtgen sayısına bölünmesi ile bulunabilir. Yani Δx =(b – a)/n. O halde,


Görsel-4


Görsel-4 matematiksel yapımımızın son halidir. Artık bunu Python dili ile kodlamaya başlayabiliriz. Matematiksel yapımımıza göre;

  1. Eğri altındaki alanı hesaplayacağımız bir fonksiyonun girilmesini

  2. İlk sınır, son sınır ve kaç tane dikdörtgenle ifade edeceğimizin bilgisini

Kullanıcıdan veri olarak almamız gerekecek.

from sympy import *

x,y,z=symbols('x y z')

alan_verisi = [ ] #kod-1

Bu komutlar ile sembolik hesaplama kütüphanesi SymPy’i çağırdık. Bunu, eğrinin altında ki alanı hesaplayacağımız bir fonksiyona ihtiyaç duyduğumuz için fonksiyonu belirtmek ve fonksiyonun sahip olduğu değişkenleri hızlı bir şekilde ifade etmek için kullanacağız. Ayrıca altta kullanılmak üzere “alan_verisi” adında boş bir liste veri tipi tanımladık.


def alan_bul(y='x değişkenine bağlı fonksiyon', a='alt-sınır', b='üst-sınır', n='dikdörtgen miktarı'): #kod-2 Burada “alan_bul” şeklinde bir metot(fonksiyon) tanımladık. Bu metodun içeriği, “y, a, b ve n” adlı parametrelerden oluşuyor. Kesme işareti içersinde yeşil renkli yazı, kullanıcıya ipucu vermek için tanımlanmıştır. Şimdi bu metodun gövdesine yapacağımız nümerik yaklaşımı ifade edelim.


def alan_bul(y='x değişkenine bağlı fonksiyon', a='alt-sınır', b='üst-sınır', n='dikdörtgen miktarı'):

delta_x = (float(b) - float(a)) / float(n) alim = a blim = b #kod-3 delta_x dediğimiz ifade üstte Δx = (b – a)/n olarak vurguladığımız ifadenin kendisidir. “float()” yapısı Python’da sayısal işlem yapan gömülü bir fonksiyondur. Tanımladığımız “alan_bul” fonksiyonumuz da “b, a ve n” değerlerini sayısal nicelik olarak ifade etmeyi sağlıyor. “a ve b” değişkenlerini “alim ve blim” adında değişkenler cinsinden ifade ettik. (altta kullanacağız)


while a>=0: a += delta_x i = sympify(y).subs('x', float(a)) print( 'f({})= '.format(a), i)

alan=delta_x * i alan_verisi.append(alan) #kod-4

while döngüsü ile her bir dikdörtgenin alanını toplanmasını sağladık. Yani while döngüsü “∑” notasyonun yaptığı toplama görevini üstlenmiş oldu. “a+=” ifadesi a değerini Δx değeri kadar arttır ve i = sympify(y).subs('x', float(a)) yapısı ise arttırılan bu değeri fonksiyonda karşılığını verir. Böylece “alan=delta_x * i” her bir dikdörtgenin alanını veren bir ifade olmuştur. Burada “i” ifadesi aslında f(x*) fonksiyonun değeridir. Böylece bu “alan” verisini kullanmak üzere alan_verisi.append(alan) olarak #kod-1 de ki alan_verisi liste verisine ekliyoruz. Bu halde döngü devam eder bunu durdurmak ve hesap sonucu vermek için döngüyü kırma kodunu da eklersek;


if a>=float(b)

tüm_alan=sum(alan_verisi)

print("----Yaklaşık alan ~= ",tüm_alan) print("----Net alan = ",integrate(y,(x,alim,blim)).evalf()) alan_verisi.clear() break #kod-5 açık bir şekilde eğer b sınır değerine gelir veya geçerse döngüyü durdurmamızı ve sonucu yazdırmamızı sağlar. Burada sum() ifadesi Python’un gömülü toplama işlemi yapan fonksiyondur. alan_verisine eklediğimiz her bir dikdörtgenin alanını sum() ile toplamış oluyoruz.


Genel kod <çalıştırılabilir kod>:

from sympy import * x,y,z=symbols('x y z') alan_verisi = []

def alan_bul(y='x değişkenine bağlı fonksiyon', a='alt-sınır', b='üst-sınır', n='dikdörtgen miktarı'):

delta_x = (float(b) - float(a)) / float(n) alim = a blim = b

while a>=0: a += delta_x i = sympify(y).subs('x', float(a)) print( 'f({})= '.format(a), i)

alan=delta_x * i alan_verisi.append(alan)

if a>=float(b): tüm_alan=sum(alan_verisi) print("----Yaklaşık alan ~= ",tüm_alan) print("----Net alan = ",integrate(y,(x,alim,blim)).evalf()) alan_verisi.clear() break

Kodun çıktısı ve aşağıda uygulanmış örnekleri inceleyebilirsiniz. Ayrıca yukarıda tanımladığımız matematiksel modelde dikdörtgenlerin sayısı sonsuza giderse net alana ulaşmış oluruz.


Görsel-5


Görsel-6


Görsel-6 da gözüktüğü üzere dikdörtgen sayısı arttıkça net alana gittikçe yaklaşmaktadır.


Görsel-7, x**2 = x^2 (x kare) fonksiyonudur.


Burada sadece sayıların olması kafa karıştırabilir, lakin bu sayılar fonksiyonun oluşturduğu eğrinin altında kalan bölge için dikdörtgen oluşturur ve bunların alanını toplayıp nihayet sayısal bir niceliğe varır ve alanı ifade eder.

Referans:

bottom of page