BDP - Euler Yöntemi

Yazar

Taygun Bulmus

Yayınlanma Tarihi

26 Ağustos 2024

\[ y'(x)= \frac{y(x+h)-y(x)}{h} \]

Çözüm olarak Taylor serisini kullanacağız. \[ y(x+h)=y(x)+h\times y'(x)+\cdot \]

Not

Alternatif olarak her (x+h) noktası için integral de alabiliriz ancak diferansiyel denklem çözerken sayısal integral alma yöntemleri kullanmak sakıncalıdır.

Hata Analizi

Bir uygulamada Taylor serisi kullanılırsa hata analizi aşağıdaki gibi yapılır. Farz edelim ki \(f(x+h)\) fonksiyonunu \(f(x)\) etrafında seriye açıyoruz ve \(n\)’nci dereceden terimden sonrasını atıyoruz. \(E_{n}\) terimi ise kestiğimiz terimden sonraki terimler yani hata terimi olarak tanımlansın.

\[ f(x+h)=f(x)+f'(x)h+\frac{f''(x)}{2!}h^2+\cdots+\frac{f^{(n)}(x)}{n!}h^n+E_{n} \]

Hata terimi \(E_{n}\)’e kesme hatası (truncation error) adı verilir. Bu hatanın en büyük değeri Taylor teoreminden bulunabilir.

\[ E_{n}=f^{n+1}(\xi)\frac{h^{n+1}}{(n+1)!} \]

Burada \(\xi\), \(x\) ile \(x+h\) arasında bir değerdir. Bu değer ulaşılabilir değilse kesme hatasını belirleyen terim \(h\) adım aralığı olacaktır. Yani

\[ E_{n}=\mathcal{O}(h^{n+1}) \]

Euler Yöntemi ile Çözümde Hata Analizi

Euler yöntemi kullanılırken her bir adımdaki kesme hatası \(\mathcal{O}(h^2)\)’dir çünkü ikinci dereceden türev terimlerini ihmal ediyoruz. Her \(h\) adımda bu hata üst üste binecektir. Yani denklem \(n\) adımda çözülüyorsa kesme hatası da \(n\) kere tekrarlanacaktır.

\[ E_{acc}=nE_{2}=\frac{x_{n}-x_{0}}{h}E_{2}=O(h) \]

Euler yöntemi ile diferansiyel denklem çözümünde kesme hata payı \(h\) adım aralığı ile orantılı olacaktır.

Euler Yönteminin Geometrik Tasviri

Basitlik için çözmek istediğimiz \(y(x)\) fonksiyonu tek değişkene bağlı olsun. Bu fonksiyonun \(x\) ve \(x+h\) arasındaki değişimi aşağıdaki gibi olur  [1].

\[ y(x+h)=y(x)+h\times y'(x) \]

Buradan şu sonuç çıkarılabilir. Bulmak istediğimiz \(y(x+h)\) terimi, \(y(x)\) terimine ve o noktadaki eğiminin (türevinin) adım aralığı kadar katının toplamına eşittir.

Euler Yönteminin Geometrik Tasviri

Euler Yönteminin Kodlanması

add_coz_euler adlı fonksiyon bilYonMod.py modülünde tanımlıdır.

Not

add_coz_euler fonksiyonunu inceleyiniz.

Dikkat

add_coz_euler(fonk_y_x, xBaslangic, xBitis, yBaslangic, adimSayisi) fonksiyonunu çağırırken diferansiyel denklemin (\(y'(x)=f(y,x)\)) sağ tarafında yer alan ve çözmeniz gereken fonksiyonda, \(f(y,x)\), önce y ardından x tanımlanmalıdır. Yani kodda fonksiyon \(f(y,x)\) şeklinde yazılmalıdır. Burada \(y\) değişkeni \(y(x)\) olarak tanımlanır, \(x\) ise bağımsız değişkendir.

Aşağıdaki diferansiyel denklemi çözen bir örneği inceleyelim.

\[ \frac{d}{dx}y(x) = x, \quad y(0)=1, \quad x=[0, 1], \quad n=10000 \]

Çözüm aşağıdaki gibi olacaktır.

\[ y(x)=1+\frac{x^{2}}{2} \]

################################################
## Modül yolunu varsayılan yol olarak ekleme ve modülü içe aktarma
import os
import sys
# Bu dosyanın bulunduğu dizini al
current_dir = os.path.abspath('')
# 3 üst dizine çık
module_dir = os.path.join(os.path.abspath(os.path.join(current_dir, os.pardir, os.pardir, os.pardir)), 'moduller')
# moduller dizinini yol olarak ekle
sys.path.append(module_dir)
# bilYonMod.py modülünü içe aktar
import bilYonMod as bym
################################################

import numpy as np
import matplotlib.pyplot as plt
# Fonksiyon
def fonk_y_x(y, x):
    return x
# Başlangıç koşulları
x0 = 0
y0 = 1
xSon = 1
n = 10
# Çöz
xTum, yTum = bym.add_coz_euler(fonk_y_x, x0, xSon, y0, n)
# Çiz
plt.plot(xTum, yTum, 'o-', color='r', label='Euler')
plt.plot(xTum, 1+(xTum**2)/2, 'k', label='Analitik')
plt.xlabel('$x$')
plt.ylabel('$y(x)$')
plt.legend()
plt.show()

Alıştırma 1

Euler yöntemi ile aşağıdaki diferansiyel denklemi çözün ve analitik çözüm ile karşılaştırın.

\[ y' + 4y = x^{2}, \quad y(0)=1, \quad x=[0, 0.03], \quad n=10 \]

Analitik çözüm:

\[ y(x)=\frac{31}{32}e^{-4x} + \frac{1}{4}x^{2}- \frac{1}{8}x + \frac{1}{32} \]

Çözüm

################################################
## Modül yolunu varsayılan yol olarak ekleme ve modülü içe aktarma
import os
import sys
# Bu dosyanın bulunduğu dizini al
current_dir = os.path.abspath('')
# 3 üst dizine çık
module_dir = os.path.join(os.path.abspath(os.path.join(current_dir, os.pardir, os.pardir, os.pardir)), 'moduller')
# moduller dizinini yol olarak ekle
sys.path.append(module_dir)
# bilYonMod.py modülünü içe aktar
import bilYonMod as bym
################################################

import numpy as np
import matplotlib.pyplot as plt
# Fonksiyon
def fonk_y_x(y, x):
    return -4*y + x**2
# Başlangıç koşulları
x0 = 0
y0 = 1
xSon = 0.03
n = 10
# Çöz
xTum, yTum = bym.add_coz_euler(fonk_y_x, x0, xSon, y0, n)
# Analitik çözüm
yAnalitik=(31/32)*np.exp(-4*xTum) + (1/4)*(xTum**2) - (1/8)*xTum + (1/32)
# Çiz
plt.plot(xTum, yTum, 'o-', color='r', label='Euler')
plt.plot(xTum, yAnalitik, 'k', label='Analitik')
plt.xlabel('$x$')
plt.ylabel('$y(x)$')
plt.legend()
plt.show()

Problemler

Problem 1

  1. Basit bir RC devresi ele alalım. Bu devrede voltaj kaynağı olmasın, kondansatör \(t=0\) s’de \(V_{0}=10\) V gerilime sahip olsun. Devrede \(R=220\) k \(\Omega\) direnci ve \(C=10\) \(\mu\) F kondansatörü olsun. Devre bu haldeyken devreyi tamamlayalım. Devrenin voltajı-zaman grafiğini Euler yöntemi kullanarak çiziniz.

\[ C\frac{dV}{dt}+\frac{V}{R}=0 \]

Analitik çözüm: \(V(t) = V_{0}e^{-t/RC}\)

Problem 2

Thoryum-234’ün yarılanma ömrü \(\tau=24.1\) gündür. \(N_{0}=150\) g saf Thoryum-234 izotopu \(100\) gün bekletilmektedir. İçerisinde kalan içerisinde kalan Thoryum-234 miktarı-zaman grafiğini Euler metodu kullanarak çiziniz.

\[ \frac{dN}{dt}= -\frac{\ln 2}{\tau}N \]

Analitik çözüm: \(N(t) = N_{0}e^{-t(\ln 2/\tau)}\)