Runge-Kutta Yöntemi ile Diferansiyel Denklem Çözümü (Python)

Bir önceki yazıda bahsettiğim, diferansiyel denklemlerin çözümünde kullanılan diğer bir yöntem olan Euler yöntemine buradan ulaşabilirsiniz.

Image for post
Image for post
Carl David Runge (1856–1927) ve Martin Wilhelm Kutta (1867–1944).

Runge-Kutta yöntemi, diferansiyel denklemlerin sayısal çözümü için kullanılan yöntemlerden birisidir. Diğer sayısal yöntemlere nazaran, oldukça iyi sonuçlar veren bir yöntemdir.

Image for post
Image for post

Yukarıdaki 4'üncü dereceden Runge-Kutta formülüne aittir. Formül ile belirlenen adım aralıkları (h) boyunca her bir y değeri hesaplanır. Adım aralığı ise:

Image for post
Image for post

formülü ile iterasyon boyunca hesaplanır. Adım aralığı sabit ise, bir kez hesaplayıp tanımlamak yeterlidir. Formülün en sağındaki k değerlerinin hesaplanması ise şu şekildedir:

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

Burada f, diferansiyel denklemi ifade etmektedir. k değerleri hesaplandıktan sonra, yukarıdaki formülde yerine yazılarak y’nin n’inci değeri hesaplanır ve iterasyon boyunca bu işlem devam eder. İterasyon sonucunda elde edilen y dizisi, diferansiyel denklemin sayısal çözümünü tutmaktadır.

Runge-Kutta yöntemini Python üzerinde kodlamayı deneyelim:

Image for post
Image for post
  • Fonksiyon parametreleri sırasıyla: diferansiyel denklemi (fonksiyon tipinde), x’in başlangıç değerini, y’nin başlangıç değerini, adım aralığını ve iterasyon sayını belirtmektedir.

Dilerseniz, basit bir örnek ile fonksiyonumuzu test edelim:

Image for post
Image for post

Verilen diferansiyel denklemi Runge-Kutta yöntemi ile çözelim.

  • Öncelikle denklemin analitik çözümü şu şekildedir.
Image for post
Image for post
  • y(0) = 1 başlangıç koşulu için c = 0 hesaplanır.
  • Parametrelerimizi oluşturalım ve hem diferansiyel denklemi hem de analitik çözümünü bir fonksiyon olarak tanımlayalım:
Image for post
Image for post
  • Şimdi de diferansiyel denklemi, yukarıda oluşturduğumuz runge_kutta fonksiyonu ile çözdürelim. Karşılaştırmak için analitik çözümün aynı aralıkta üreteceği değerleri de hesaplayalım.
Image for post
Image for post
  • Hesapladığımız değerleri grafiğe dökersek:
Image for post
Image for post
  • Görüldüğü gibi neredeyse tamamen örtüşen bir sonuç elde ettik. Şimdi de oluşan hataya göz atalım:
  • Hata değerinin her bir iterasyondaki miktarını hesapladık. Hata grafiğimiz şekildeki gibi olacaktır:
Image for post
Image for post
  • Hata değerimiz oldukça düşük. Bunun yanında yaklaşık 15'inci iterasyondan itibaren giderek arttığı görülmektedir. Adım aralığını azaltarak hata miktarını düşürmeyi deneyelim:
Image for post
Image for post
  • Hata değerini çok daha küçülttük. Bu ölçekte analitik çözümle neredeyse aynı sonuçları elde edebiliriz. Fakat adım aralığını küçülterek iterasyon sayısını, dolayısıyla işlem maliyetini arttırmış olduk.

Uygulamanın kaynak kodlarına buradan erişebilirsiniz.

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store