05-Poisson 2D Metode Langsung
05-Poisson 2D Metode Langsung
∂2u ∂2u
+ 2 = f (x, y) (1)
∂x2 ∂y
akan diterapkan pada domain bujur sangkar 0 ≤ x, y ≤ 1, dengan suku sumber dinyatakan dengan
" #
1 1 1 1 2 1
f (x, y) =1000 2 sinh x − +4 x− cosh x − + x− sinh x − +
2 2 2 2 2
" #
1 1 1 1 2 1
1000 2 sinh y − +4 y− cosh y − + y− sinh y − (2)
2 2 2 2 2
" #
1 1 1 2 1
u(0, y) = 1000 sinh − + y− sinh y − (3)
4 2 2 2
" #
1 1 1 2 1
u(1, y) = 1000 sinh + y− sinh y − (4)
4 2 2 2
" #
1 2 1 1 1
u(x, 0) = 1000 x − sinh x − + sinh − (5)
2 2 4 2
" #
1 2 1 1 1
u(x, 1) = 1000 x − sinh x − + sinh (6)
2 2 4 2
Tentukan solusi menggunakan metode beda hingga. Bandingkan galatnya dengan solusi analitik
berikut.
" 2 #
1 1 1 2 1
u(x, y) = 1000 x− sinh x − + y− sinh y − (7)
2 2 2 2
1
1.1 Diskretisasi
Kita lakukan diskretisasi ruang menggunakan metode beda hingga (finite difference).
∂ 2 u ui+1,j − 2ui,j + ui−1,j
2 ≈
∂x i,j ∆x2
∂ 2 u ui,j+1 − 2ui,j + ui,j−1
≈
∂y 2 i,j ∆y 2
atau
1 1 2 2 1 1
2
ui−1,j + ui+1,j − + ui,j + ui,j−1 + ui,j+1 = fi,j
∆x ∆x2 ∆x 2 ∆y 2 ∆y 2 ∆y 2
Kita akan menyelesaikan persamaan diferensi ini menggunakan metode langsung, sehingga kita
perlu menyusun matriks [A] untuk menyelesaikan persamaan matriks berikut
[A][u] = [f]
Kita tentukan banyaknya interval ke arah sumbu x sebanyak N dan interval ke arah sumbu y
sebanyak M . Dengan demikian akan diperoleh N + 1 titik ke arah sumbu x dan M + 1 titik ke
arah sumbu y. Matriks [A] yang akan kita susun berukuran (N + 1)(M + 1) × (N + 1)(M + 1)
elemen.
1.2 Coding
Pertama kita tentukan terlebih dahulu banyaknya interval dan menginisialisasi semua variabel yang
diperlukan.
[1]: import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
2
# tentukan lebar interval
dx = (xmax - xmin)/N
dy = (ymax - ymin)/M
# inisialisasi
A = np.zeros(((N+1)*(M+1),(N+1)*(M+1))) # matriks A
u = np.zeros((N+1)*(M+1)) # vektor u
f = np.zeros((N+1)*(M+1)) # vektor f
u2d = np.zeros((N+1,M+1)) # matriks u untuk plotting 2 dimensi
uanal = np.zeros((N+1,M+1)) # matriks solusi analitis untuk␣
,→plotting 2 dimensi
# Inner grids
for i in range(1,N):
for j in range(1,M):
k = j*(N+1)+i # lakukan mapping dari (i,j) ke k
3
u[k] = 1000*(0.25*np.sinh(-0.5) + (y[j] - 0.5)**2 * np.sinh(y[j]-0.
,→5)) # BC u(0,y) / kiri domain
else:
u[k] = 1000*(0.25*np.sinh(0.5) + (y[j] - 0.5)**2 * np.sinh(y[j]-0.
,→5)) # BC u(1,y) / kanan domain
f[k] = u[k]
[9]: plt.figure(figsize=(10,10))
plt.spy(A)
plt.show()
4
Tampak bahwa matriks [A] merupakan sparse matrix di mana banyak elemen-elemennya bernilai
0 dan elemen yang tidak bernilai 0 akan membentuk penta diagonal (diagonal 5 baris).
Setelah tersusun matriks [A] dan vektor [f] selanjutnya kita selesaikan persamaan matriks.
5
[6]: # Analytic solution
for i in range(N+1):
for j in range(M+1):
uanal[i,j] = 1000*((x[i]-0.5)**2 * np.sinh(x[i]-0.5) + (y[j]-0.5)**2 *␣
,→np.sinh(y[j]-0.5))
# Nilai galat
galat = u2d - uanal
6
contours = plt.contour(X,Y,galat, 20, colors='black')
plt.clabel(contours, inline=True, fontsize=8)
plt.xlabel("x", fontsize=12)
plt.ylabel("y", fontsize=12)
ax.set_title("Kontur dari Galat")
plt.show()
Silakan mencoba dengan jumlah interval solusi yang lebih banyak, untuk mengetahui bagaimana
pengaruhnya terhadap solusi dan galatnya.
[ ]: