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.

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.

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:

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:

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:

  • 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:

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

  • Öncelikle denklemin analitik çözümü şu şekildedir.
  • 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:
  • Ş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.
  • Hesapladığımız değerleri grafiğe dökersek:
  • 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:
  • 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:
  • 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.