Euler yöntemi için Taylor serisini birinci dereceden türevli terimden kesmiştik. Eğer Taylor serisinde daha yüksek mertebelerden türevler kullanılırsa, bu yöntemlere Runge-Kutta yöntemleri adı verilir.
Dikkat
Yüksek mertebeden türevler kullanmak demek, yüksek mertebe diferansiyel denklem çözümü anlamına gelmez. Örneğin, birinci dereceden diferansiyel denklemi, Taylor serisinin üçüncü dereceden teriminden keserek çözebiliriz. Runge-Kutta yöntemleri, Euler yönteminin bir genelleştirilmesidir.
İkinci Derece Runge-Kutta Yöntemi
Ana denklemi yazalım.
\[
y'(x)=f(y,x)
\]
Euler yöntemini hatırlayalım. \(y'(x)=f(y,x)\) bağıntısını da kullanalım.
\[
y(x+h)= y(x)+hy'(y,x) = y(x)+hf(y,x)
\]
Taylor serisinin ikinci mertebesinden kesmeden önce en genel formülü yazalım. Bu formül Runge-Kutta yöntemlerinin genel formülüdür.
ifadesini elde ederiz. Şimdi genelleştirilmiş formülü, yani \(y(x+h)= y(x)+c_{0}hF(y,x) + c_{1}hF(x+ph,y+qhF(y,x))\) terimindeki \(F(x+ph,y+qhF(y,x))\) terimi açalım.
olursa, iki formül de aynı olur. Buradaki \(c_{0}, c_{1},q,p\) parametreleri farklı farklı seçilebilir. Bazı farklı seçimler için özel isimlendirme yapılır.
İsim
\(c_{0}\)
\(c_{1}\)
p
q
Değiştirilmiş (Modified) Euler
0
1
1/2
1/2
Heun Yöntemi
1/2
1/2
1
1
Ralston Yöntemi
1/3
2/3
3/4
3/4
Tüm bu sınıflandırma 2. derece Runge-Kutta yöntemleri altındadır.
Bu yöntemler birbirlerinden üstün değildir.
Birinci derece Runge-Kutta yöntemi olan Euler yönteminde ise \(c_{0}=1\) ve diğer terimler sıfırdır.
Genelleştirmek adına değiştirilmiş Euler motdunu aşağıdaki gibi yazabiliriz.
Python kodunu yazalım. add_coz_rk4_sistem adlı fonksiyon bilYonMod.py modülünde tanımlıdır.
Not
add_coz_rk4_sistem fonksiyonunu inceleyiniz.
Alıştırma 1
Birbirine bağlı iki adet diferansiyel denklemi çözmek için Euler yöntemini, 4. Mertebe Runge-Kutta ve scipy.integrate.odeint yöntemlerini kullanınız. Toplamda 10 adım kullanın.
\(L_{1}= 0.5\) m, \(L_{2}=1.0\) m: Yayların kuvvet yokkenki uzunluğu
Başlangıç koşulları:
\(x_{1}=0.5\) m
\(v_{1}=0.0\) m/s
\(x_{2}=2.25\) m
\(v_{2}=0.0\) m/s
Çözüm
################################################## Modül yolunu varsayılan yol olarak ekleme ve modülü içe aktarmaimport osimport sys# Bu dosyanın bulunduğu dizini alcurrent_dir = os.path.abspath('')# 3 üst dizine çıkmodule_dir = os.path.join(os.path.abspath(os.path.join(current_dir, os.pardir, os.pardir, os.pardir)), 'moduller')# moduller dizinini yol olarak eklesys.path.append(module_dir)# bilYonMod.py modülünü içe aktarimport bilYonMod as bym################################################import numpy as npimport matplotlib.pyplot as pltimport scipy.integrate as spInt# Global değişkenlerm1 =1.0m2 =1.5k1 =8.0k2 =40.0L1 =0.5L2 =1.0b1 =0.8b2 =0.5# Fonksiyonlardef fonkVek(yVek, t): x1= yVek[0] v1= yVek[1] x2= yVek[2] v2= yVek[3]return np.array([v1\ , (-b1 * v1 - k1 * (x1 - L1) + k2 * (x2 - x1 - L2)) / m1 \ , v2 \ , (-b2 * v2 - k2 * (x2 - x1 - L2)) / m2])# Başlangıç koşullarıyVek0= np.array([0.5, 0.0, 2.25, 0.0])t0=0tSon=50n=100# Çöz, EulertTumEuler, yTum_VekEuler = bym.add_coz_euler_sistem(fonkVek, t0, tSon, yVek0, n)# Çöz, 4. Mertebe Runge-KuttatTumRK4, yTum_VekRK4 = bym.add_coz_rk4_sistem(fonkVek, t0, tSon, yVek0, n)# Çöz, scipy.integrate.odeinttTumScipy= np.linspace(t0, tSon, n)yTumScipy= spInt.odeint(fonkVek, yVek0, tTumScipy)# Çizfig, ax = plt.subplots(2, 2)# Sol üst grafikax[0,0].plot(tTumEuler, yTum_VekEuler[0], lw='5', label='x1(t) Euler', color='red')ax[0,0].plot(tTumRK4, yTum_VekRK4[0], lw='3', label='x1(t) RK4', color='green')ax[0,0].plot(tTumScipy, yTumScipy[:,0], lw='1', label='x1(t) Scipy', color='blue')ax[0,0].set_xlabel('t')ax[0,0].set_ylabel('x1(t)')ax[0,0].legend()# Sağ üst grafikax[0,1].plot(tTumEuler, yTum_VekEuler[1], lw='5', label='v1(t) Euler', color='blue')ax[0,1].plot(tTumRK4, yTum_VekRK4[1], lw='3', label='v1(t) RK4', color='green')ax[0,1].plot(tTumScipy, yTumScipy[:,1], lw='1', label='v1(t) Scipy', color='red')ax[0,1].set_xlabel('t')ax[0,1].set_ylabel('v1(t)')ax[0,1].legend()# Sol alt grafikax[1,0].plot(tTumEuler, yTum_VekEuler[2], lw='5', label='x2(t) Euler', color='red')ax[1,0].plot(tTumRK4, yTum_VekRK4[2], lw='3', label='x2(t) RK4', color='green')ax[1,0].plot(tTumScipy, yTumScipy[:,2], lw='1', label='x2(t) Scipy', color='blue')ax[1,0].set_xlabel('t')ax[1,0].set_ylabel('x2(t)')ax[1,0].legend()# Sağ alt grafikax[1,1].plot(tTumEuler, yTum_VekEuler[3], lw='5', label='v2(t) Euler', color='blue')ax[1,1].plot(tTumRK4, yTum_VekRK4[3], lw='3', label='v2(t) RK4', color='green')ax[1,1].plot(tTumScipy, yTumScipy[:,3], lw='1', label='v2(t) Scipy', color='red')ax[1,1].set_xlabel('t')ax[1,1].set_ylabel('v2(t)')ax[1,1].legend()plt.show()
Runge-Kutta-Fehlberg (RK45) Yöntemi
Runge-Kutta-Fehlberg (RK45) yöntemi, dördüncü ve beşinci mertebe Runge-Kutta yöntemi kullanarak çözüm elde eder.
RK45, değişken adım aralığı (adaptive step size) kullanır.
RK45’in girdilerinden (input) biri rölatif (relative) hata değeridir. RK4 ile elde edilen sonuç ile RK5 ile elde edilen sonuç arasındaki fark rölatif hatadan büyükse adım aralığı küçültülür ve o adım tekrar hesaplanır.
Bunun gibi metotlara değişken (adaptive) adım aralığı yöntemleri denir.
Runge-Kutta metotları açık (explicit) yöntemlerdir.
Scipy Paketleri Hakkında
Scipy içerisinde başlangıç değer problemi çözümleri için birçok fonksiyon var [2].
Eski api olarak odeint hala kullanılabiliyor ancak scipy’ın gelecekteki versiyonlarında çıkarılma ihtimali çok yüksek.
odeint fonksiyonunda çağırılan \(f\) fonksiyonunda \(f(y,t)\) olmak zorunda. solve_ivp’de ise bu durum tam tersi. Bu farklılığı tfirst=True parametresi ile değiştirebilirsiniz - 1.1.0 versiyonundan itibaren.
odeint ile ilgili bilgi için [3] referansına bakabilirsiniz.
Problemler
Problem 1
Aşağıdaki matris denklemlerini yazdığımız rk4 fonksiyonu ile çözün.
Yukarıda verilen formülden diferansiyel denklem setini oluşturun. Burada \(F^{dis}=-\frac{1}{2}bv^{2}\) sönümleyici kuvvettir. \(t=0-50\) arasındaki değerler için ve \(n=1000\) adımda, - Runge-Kutta-4 (veya 5(4) mertebe için Runge-Kutta methodu) yöntemi ile çözün. - x ile t’nin oluşturduğu grafiği çizdirin.
Başlangıç koşulları ve sabitler aşağıdaki gibidir.
\(m=1\) kg
\(k=1\) N/m
\(b=0.1\) Ns/m
\(x(t=0)=1\) m
\(v(t=0)=0\) m/s
Problem 4
Aşağıdaki diferansiyel denklemi Runge Kutta 4(5) yöntemini kullanarak \(N=100\) adımda çözün. Analitik sonuçla karşılaştırın.
Düşey düzlemde \(l=1\) m uzunluğunda bir ipin ucunda birim kütleli bir cisim salınsın. Bu cisim denge noktasından \(\theta(t=0s)=\pi/9\) rad açı ile harekete başlıyor. \(g=9.81\) m/\(s^{2}\). Cisim bırakıldığı anda açısal hızı \(\omega(t=0s)=0\) rad/s. Bu cismin hareket denklemini \(t=(0,10)\) arasında
Euler yöntemiyle çözün.
RK4 (veya RK45 veya LSODA) yöntemiyle çözün.
Analitik çözümü de dikkate alın ve tüm çözümleri üst üste bindirerek çizdirin.