Adi diferansiyel denklem sistemlerini çözmek için Euler yöntemini vektör haline getirip kullanabiliriz. Bunun için bilYonMod.py modülündende tanımlanan add_coz_euler_sistem(fonk_yVek_x, xBaslangic, xBitis, yBaslangic_vek, adimSayisi) fonksiyonunu kullanılmalıdır.
Not
add_coz_euler_sistem fonksiyonunu inceleyiniz.
Euler Yönteminin Denklem Sistemleri İçin Uygulanması
Örneğin aşağıdaki denklem sistemini ele alalım. Denklem sisteminde iki adet birbirinden bağımsız diferansiyel denklem olsun. Bu denklemleri, bilgisayar açısından daha ekonomik olması adına birlikte çözülmelidir. (Az döngü, vektörleştirme, paralelleştirme, …)
Başlangıç koşulları \(y(0)=1\) ve \(v(0)=1\) olsun. Çözüm aralığını \(x=0\) ile \(x=10\) arasında bulmaya çalışalım, \(x=[0,10]\). Çözüm adım sayısı \(n=100\) olsun.
################################################## 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 plt# Fonksiyondef fonk_yVek_x(yVek, x): y = yVek[0] v = yVek[1] dydx = x dvdx = x**2return np.array([dydx, dvdx])# Başlangıç koşullarıy0 =1v0 =1x0 =0xSon =10n =100# Çöz# xTum, yTum_Vek= add_coz_euler_sistem(fonk_yVek_x, xBaslangic, xBitis, yBaslangic_vek, adimSayisi)# yTum_Vek[0] => y(x)# yTum_Vek[1] => v(x)xTum, yTum_Vek = bym.add_coz_euler_sistem(fonk_yVek_x, x0, xSon, np.array([y0, v0]), n)# Analitik çözümyAnalitik = xTum**2/2+1vAnalitik = xTum**3/3+1# Çizplt.plot(xTum, yTum_Vek[0], 'o-', color='red', label='y(x)')plt.plot(xTum, yAnalitik, label='y(x) analitik', color='black', linestyle='--')plt.plot(xTum, yTum_Vek[1], 'o-',label='v(x)', color='blue')plt.plot(xTum, vAnalitik, label='v(x) analitik', color='cyan', linestyle='--')plt.xlabel('x')plt.ylabel('y(x), v(x)')plt.legend()plt.show()
Alıştırma 1
Birbirine bağlı iki adet diferansiyel denklemi çözmek için Euler yöntemini kullanınız.
Bu durumda sağ taraftaki vektör fonksiyonu aşağıdaki gibi tanımlanır.
def fonk_yVek_x(yVek, x):# İlk çözülmesi gereken denklem y'(v,x) = v(x). # fonk_yVek_x fonksiyonu girdi olarak (yVek,x) alacak. Bu yVek vektörünün# ilk elemanı y'(x) 'in sağ tarafı olmalı. dydx diyelim.# dydx <= yVek[0] dydx = yVek[1]# İkinci çözülmesi gereken denklem v'(y,x) = x.# fonk_yVek_x fonksiyonu girdi olarak (yVek,x) alacak. Bu yVek vektörünün# ikinci elemanı v'(x) 'in sağ tarafı olmalı. dvdx diyelim.# dvdx <= yVek[1] # dvdx = x# Sonuç olarak da [dydx, dvdx] vektörünü döndürmeli.return np.array([dydx, x])
Başlangıç koşulları \(y(0)=1\) ve \(v(0)=0\) olsun. Çözüm aralığı \(x=0\) ile \(x=10\) arasında olsun. Çözüm adım sayısı \(n=100\) olsun.
Analitik çözümü elde ederken önce \(v(x)\)’i çözmek gerekir. \(v(x)=\frac{x^2}{2}\) olur. Bu durumda \(y(x)=\frac{x^3}{6}+1\) olur.
Çö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 plt# Fonksiyondef fonk_yVek_x(yVek, x): dydx = yVek[1]return np.array([dydx, x])# Başlangıç koşullarıy0 =1v0 =0x0 =0xSon =10n =100# ÇözxTum, yTum_Vek = bym.add_coz_euler_sistem(fonk_yVek_x, x0, xSon, np.array([y0, v0]), n)# Analitik çözümyAnalitik = xTum**3/6+1vAnalitik = xTum**2/2# Çizfig, ax = plt.subplots(1, 2)# Sol grafikax[0].plot(xTum, yTum_Vek[0], 'o-', label='y(x)', color='red')ax[0].plot(xTum, yAnalitik, label='y(x) analitik', color='black', linestyle='--')ax[0].set_xlabel('x')ax[0].set_ylabel('y(x)')ax[0].legend()# Sağ grafikax[1].plot(xTum, yTum_Vek[1], 'o-', label='v(x)', color='blue')ax[1].plot(xTum, vAnalitik, label='v(x) analitik', color='cyan', linestyle='--')ax[1].set_xlabel('x')ax[1].set_ylabel('v(x)')ax[1].legend()plt.show()
Problemler
Problemi 1
Lorenz atraktörünün denklemini Euler yöntemiyle çözünüz. Sabitler için \(\rho=28\), \(\sigma=10\) ve \(\beta=8/3\) alınız. Başlangıç koşullarını: \(x_{0}=1\), \(y_{0}=1\) ve \(z_{0}=1\) olarak alınız. En iyi sonucu görebilmek için \(t=0-10\) aralığında ve \(n= 1000\) adımda yapınız. 3 boyutlu grafik çizilirse ünlü şekil ortaya çıkacaktır.
\[
\frac{dx}{dt}=\sigma(y-x)
\]
\[
\frac{dy}{dt}=x(\rho-z)-y
\]
\[
\frac{dz}{dt}=xy-\beta z
\]
Problem 2
Lotka-Volterra Modelini Euler yöntemiyle çözünüz. Sabitler için \(a=1.5\), \(b=1\), \(c=3\) ve \(d=1\) alınız. Başlangıç koşulu olarak 10 tavşan (\(x_{0}\)) ve 5 vaşak (\(y_{0}\)) alınız. En iyi sonucu görebilmek için \(t=0-20\) aralığında ve \(n= 1000\) adımda yapınız. Bu model av-avcı popülasyonunu veya tavşan-vaşak popülasyonu simülasyonudur.