Solusi Numerik Persamaan Differensial Biasa
Contents
Solusi Numerik Persamaan Differensial Biasa¶
Pendahuluan¶
Persamaan Differensial (PD) dapat didefinisikan sebagai suatu persamaan yang berisi satu atau lebih turunan. Kondisi awal (initial condition) adalah nilai dari variabel terikatnya ketika variabel bebasnya bernilai nol. Solusi dari PD adalah suatu fungsi yang mememuhi persamaannya dan kondisinya.
Misalkan perubahan populasi penduduk dari waktu ke waktu di kota Jakarta digambarkan oleh persamaan
dimana \(r\) adalah tingkat pertumbuhan populasi penduduknya dan \(P\) adalah jumlah populasi penduduknya pada waktu ke \(t\). Kemudian diketahui pertumbuhan populasi per tahunnya adalah 10% dan penduduk di kota Jakarta berjumlah 10 juta jiwa pada saat ini. Maka perubahan populasi penduduk dari waktu ke waktu dapat digambarkan dengan persamaan
Dengan demikian, solusi dari PD tersebut adalah suatu fungsi, \(P(t)\) yang memiliki turunan \(0.10P(t)\) dengan \(P(0) = 10^{6}\). Untuk mencari solusi analitiknya, pertama
sehingga
atau
dimana \(k = e^C\).
Jika diketahui \(P(0)=10^{6}\), maka
Sehingga solusinya adalah
atau secara umum dapat ditulis
untuk suatu nilai kondisi awal \(P_0\).
Contoh 1.¶
Misalkan \(y = y(t)\) merupakan suatu fungsi dari \(t\), contoh PDB dari fungsi tersebut diantaranya \(y' = y^2\), \(y'' + y.y' + 4 = 0\), dan lainnya.
Masalah dalam PDB dibagi menjadi dua yaitu Masalah Nilai Awal (MNA) dan Masalah Syarat Batas (MSB). MNA untuk orde pertama PDB didefinisikan:
Sebagai contoh:
Dalam banyak masalah, solusi eksak sangat sulit untuk didapatkan.
Solusi Numerik: Diberikan
Cari \(y_n = y(t_n)\) untuk \(n = 1,2,\dots ,N\) dan \(t_0 < t_1 < \dots <t_N\). Disini \(t_N\) menyatakan waktu akhir komputasi. Ambil step waktu yang seragam: Misalkan \(h\) adalah panjang step waktu
Metode Deret Taylor (MDT)¶
Diberikan
Misalkan kita ingin mencari \(y_1 = y(t_1) = y(t_0+h)\). Ekspansi Taylornya adalah
MDT untuk order \(m\): Ambil suku ke \((m+1)\) pertama dari Ekspansi Taylor
Error di masing-masing step:
untuk suatu \(\xi \in (t_0, t_1).\)
Untuk \(m=1\), kita dapatkan Metode Euler:
Bentuk umum untuk \(k\) step:
Untuk \(m=2\), kita dapatkan
Bentuk \(y''(t_0)\) dapat dicari menggunakan
sehingga kita dapatkan
Bentuk umum untuk \(k\) step:
Contoh 2. Terapkan MDT dengan \(m=1,2,3\) untuk
(Solusi eksaknya adalah \(y(t)=te^{-t}\).)
Jawaban. Diberikan inisial data \(y_0 = 0\). Untuk \(m=1\), kita dapatkan
Untuk \(m=2\) dan \(m=3\), kita cari terlebih dahulu \(y''\) dan \(y'''\) dengan cara
Sehingga bentuk iteratif untuk \(m=2\) menjadi
dan untuk \(m=3\) adalah
Penerapan. Kita terapkan bentuk iteratif MDT untuk \(m=1\) dan \(m=2\) pada Contoh 2 menggunakan Python 3. Langkah pertama kita definisikan library yang kita pakai,
import numpy as np
import math
import matplotlib.pyplot as plt
h = 0.1
T = 2
N = int(T/h)
t = np.zeros(N+1)
y_m1 = np.zeros(N+1)
y_m2 = np.zeros(N+1)
y_m3 = np.zeros(N+1)
y_a = np.zeros(N+1)
for k in range(N):
t[k+1] = t[0] + (k+1)*h
y_a[k+1] = t[k+1]*math.exp(-t[k+1])
y_m1[k+1] = y_m1[k] + h*(-y_m1[k] + math.exp(-t[k]))
y_m2[k+1] = y_m2[k] + h*(-y_m2[k] + math.exp(-t[k])) + 0.5*(h**2)*(y_m2[k] - 2*math.exp(-t[k]))
plt.title('Solusi Analitik vs Solusi MDT ($m=1$ dan $m=2$)')
plt.xlabel('$t$')
plt.ylabel('$y(t)$')
plt.plot(t,y_a, label="$y_{analitik}$")
plt.plot(t,y_m1, 'o', label="$y_{m1}$")
plt.plot(t,y_m2, 'o', label="$y_{m2}$")
plt.legend(loc=4);
error_m1 = abs(y_a-y_m1)
error_m2 = abs(y_a-y_m2)
plt.title('Error MDT $m=1$ vs Error MDT $m=2$')
plt.xlabel('$t$')
plt.ylabel('Error')
plt.plot(t,error_m1, '-o', label="MDT($m=1$)")
plt.plot(t,error_m2, '-o', label="MDT($m=2$)")
plt.legend();
Contoh 3. Terapkan MDT dengan \(m=1,2,3,4\) untuk
(Solusi eksaknya adalah \(y(t)=e^t\).)
Jawaban. Perhatikan bahwa
Diberikan inisial \(y_0=1\), maka kita dapatkan
Penerapan.
h = 0.1
T = 2
N = int(T/h)
t = np.zeros(N+1)
y_m1 = np.zeros(N+1)
y_m2 = np.zeros(N+1)
y_m3 = np.zeros(N+1)
y_m4 = np.zeros(N+1)
y_a = np.zeros(N+1)
y_a[0] = 1
y_m1[0] = 1
y_m2[0] = 1
y_m3[0] = 1
y_m4[0] = 1
for k in range(N):
t[k+1] = t[0] + (k+1)*h
y_a[k+1] = math.exp(t[k+1])
y_m1[k+1] = (1+h)*y_m1[k]
y_m2[k+1] = (1 + h + (1/2) * (h**2)) * y_m2[k]
y_m3[k+1] = (1 + h + (1/2) * (h**2) + (1/6) * (h**3)) * y_m3[k]
y_m4[k+1] = (1 + h + (1/2) * (h**2) + (1/6) * (h**3) + (1/24) * (h**4)) * y_m4[k]
plt.title('Solusi Analitik vs Solusi MDT ($m=1,2,3,4$)')
plt.xlabel('$t$')
plt.ylabel('$y(t)$')
plt.plot(t,y_a, label="$y_{analitik}$")
plt.plot(t,y_m1, 'o', label="$y_{m1}$")
plt.plot(t,y_m2, 'o', label="$y_{m2}$")
plt.plot(t,y_m3, 'o', label="$y_{m3}$")
plt.plot(t,y_m4, 'o', label="$y_{m4}$")
plt.legend(loc=4);
error_m1 = abs(y_a-y_m1)
error_m2 = abs(y_a-y_m2)
error_m3 = abs(y_a-y_m3)
error_m4 = abs(y_a-y_m4)
plt.title('Error MDT $m=1,2,3,4$')
plt.xlabel('$t$')
plt.ylabel('Error')
plt.plot(t,error_m1, '-o', label="MDT($m=1$)")
plt.plot(t,error_m2, '-o', label="MDT($m=2$)")
plt.plot(t,error_m3, '-o', label="MDT($m=3$)")
plt.plot(t,error_m4, '-o', label="MDT($m=4$)")
plt.legend();
Contoh 3. Terapkan MDT dengan \(m=1,2,3,4\) untuk
(Solusi eksaknya adalah \(y(t) = -e^{-t} -\cos(t) + 2.)\)
Jawaban. Perhatikan bahwa
Bentuk iteratif untuk \(m=1\) adalah
untuk \(m=2\)
untuk \(m=3\)
untuk \(m=4\)
h = 0.2*math.pi
T = 5*math.pi
N = int(T/h)
t = np.zeros(N+1)
y_m1 = np.zeros(N+1)
y_m2 = np.zeros(N+1)
y_m3 = np.zeros(N+1)
y_m4 = np.zeros(N+1)
y_a = np.zeros(N+1)
y_a[0] = 0
y_m1[0] = 0
y_m2[0] = 0
y_m3[0] = 0
y_m4[0] = 0
for k in range(N):
t[k+1] = t[0] + (k+1)*h
y_a[k+1] = - math.exp(-t[k+1]) - math.cos(t[k+1]) + 2
y_m1[k+1] = y_m1[k] + h*(math.sin(t[k]) + math.exp(-t[k]))
y_m2[k+1] = y_m2[k] + h*(math.sin(t[k]) + math.exp(-t[k])) + (1/2) * (h**2) * (math.cos(t[k]) - math.exp(-t[k]))
y_m3[k+1] = y_m3[k] + h*(math.sin(t[k]) + math.exp(-t[k])) + (1/2) * (h**2) * (math.cos(t[k]) - math.exp(-t[k])) - (1/6) * (h**3) * (math.sin(t[k]) - math.exp(-t[k]))
y_m4[k+1] = y_m4[k] + h*(math.sin(t[k]) + math.exp(-t[k])) + (1/2) * (h**2) * (math.cos(t[k]) - math.exp(-t[k])) - (1/6) * (h**3) * (math.sin(t[k]) - math.exp(-t[k])) - (1/24) * (h**4) * (math.cos(t[k]) + math.exp(-t[k]))
plt.title('Solusi Analitik vs Solusi MDT ($m=1,2,3,4$)')
plt.xlabel('$t$')
plt.ylabel('$y(t)$')
plt.plot(t,y_a, label="$y_{analitik}$")
plt.plot(t,y_m1, 'o', label="$y_{m1}$")
plt.plot(t,y_m2, 'o', label="$y_{m2}$")
plt.plot(t,y_m3, 'o', label="$y_{m3}$")
plt.plot(t,y_m4, 'o', label="$y_{m4}$")
plt.legend(loc=4);
error_m1 = abs(y_a-y_m1)
error_m2 = abs(y_a-y_m2)
error_m3 = abs(y_a-y_m3)
error_m4 = abs(y_a-y_m4)
plt.title('Error MDT $m=1,2,3,4$')
plt.xlabel('$t$')
plt.ylabel('Error')
plt.plot(t,error_m1, '-o', label="MDT($m=1$)")
plt.plot(t,error_m2, '-o', label="MDT($m=2$)")
plt.plot(t,error_m3, '-o', label="MDT($m=3$)")
plt.plot(t,error_m4, '-o', label="MDT($m=4$)")
plt.legend(loc=1);
Analisis Error. Diberikan PDB
Error pemotongan lokal (error di tiap step waktu) untuk MDT untuk order ke \(m\) adalah
untuk \(\xi \in \left( t_k, t_{k+1} \right)\). Kita tahu bahwa
Sekarang asumsikan bahwa
Dengan demikian kita dapatkan