Metode Finite Difference Untuk Persamaan Poisson 2 Dimensi Batas Campuran
•
Computational Physics
Persoalan
Selesaikan persamaan berikut
∂x2∂2u+∂y2∂2u=f(x,y)
Dengan f(x,y)=xy+yx. Dari 1<x<2 dan 1<y<2. Dengan syarat batas
Persamaan
Lokasi Dalam Grid
∂y∂u(1,y)=0
Grid Kiri
∂x∂u(x,1)=0
Grid Bawah
u(2,y)=h(y)
Grid Kanan
u(x,2)=g(x)
Grid Atas
Dengan g(x)=xln(4x2) dan h(y)=2yln(2y) serta Δx=Δy=10−2. Beruntungnya, nilai g(x) dan h(y) masing-masing pada x=2 dan y=2 adalah sama.
Gridding Model (Metode Center)
Ingat bahwa sumbu horizontal adalah y dan sumbu vertikal adalah x. Dengan mempertimbangkan pendekatan deret Taylor metode center, maka didapat suku-suku dari persamaan di atas
Untuk menyelesaikan persoalan batas Neumann (Batas kiri dan atas) serta Dirichlet (Batas kanan dan bawah), diperlukan model gridding sebagai berikut
Diperlukan pula grid “hantu” untuk menyelesaikan persoalan batas Neumann pada batas-batas yang turunan pertamanya adalah nol. Grid hantu diperlukan untuk menggunakan finite difference metode pendekatan center. Sehingga pada i=0 (Batas kiri) berlaku
∂y∂u≈2Δyu−1,j−u1,ju−1,j=0=u1,j
Sehingga dengan cara yang sama didapatkan batas untuk j=0 (Batas bawah)
ui,−1=ui,1
Akan berlaku 16 persamaan pada model N=4. Maka didapat
Persamaan 1 berlaku untuk i=0 dengan j=1,2,3 (Batas kiri)
Persamaan 2 berlaku pada i=1,2 dan j=1,2 (Grid tengah)
Persamaan 3 berlaku pada j=0 dengan i=1,2,3 (Batas bawah)
Persamaan 4 berlaku pada i=0 dengan j=0
Sehingga kombinasinya menghasilkan 11 persamaan yang berbeda. 5 persamaan terakhir adalah persamaan dari batas grid kanan dan atas. Dari keempat persamaan tersebut, dimasukkan nilai i dan j yang sesuai pada titi grid yang diinginkan.
Apabila dibentuk matriks koefisien, matriks besaran yang tidak diketahui (unknown) dan matriks hasil, terbentuk matriks sebagai berikut yang dapat dicari polanya
## Batas kanan for j in range(1, Ny): B[j + (shape - Ny)] = h(y[j])
Untuk batas atas
## Batas Atas for i in range(2, Nx + 1): B[i * Ny - 1] = g(x[i-1])
Untuk batas bawah
# Batas Bawah for i in range(1, N): k = Ny * i B[k] = f(x[i],y[0]) A[k, k] = b A[k, k+1] = 2*c if k+Ny < shape: A[k, k+Ny] = a A[k, k-Ny] = a
Untuk batas kiri
## Batas Kiri for j in range(1, Ny): B[j] = f(x[0],y[j]) A[j, j] = b A[j, j+1] = c A[j, j-1] = c A[j, j+Ny] = 2*a
Untuk Grid tengah
## Grid Tengah for i in range(1, Nx - 1): for j in range(1, Ny - 1): k = i * Nx + j B[k] = f(x[i],y[j]) A[k, k] = b A[k, k-1] = c A[k, k+1] = c A[k, k-Ny] = a A[k, k+Ny] = a
Penyelesaian Sistem Persamaan Linier
Dalam kode yang diberikan, digunakan kode dari fungsi yang menyelesaikan sistem persamaan linier dengan metode Gauss-Jordan.
def GaussJordan(A, b): Ab = np.column_stack((A, b)) n, m = Ab.shape for i in range(n): # Divide the ith row by the ith pivot element pivot = Ab[i,i] Ab[i,:] /= pivot # Subtract multiples of the ith row from the other rows to eliminate their ith column entries for j in range(n): if j != i: factor = Ab[j,i] Ab[j,:] -= factor * Ab[i,:] # Extract the solution x from the transformed Ab x = Ab[:, -1] return x
Namun ketika diberi input yang banyak (Nx dan Ny yang sangat tinggi), maka kode tersebut akan sangat-sangat lama untuk menyelesaikan sistem persamaan linier. Maka digunakan fungsi bawaan dari library NumPy untuk menyelesaikan hal tersebut
solx = np.linalg.solve(A, B)
Hal ini dapat terjadi karena pada dasarnya NumPy adalah kode C yang bisa berjalan dengan sangat cepat dan sangat dioptimasi untuk perhitungan matematis. Sedangkan fungsi Gauss-Jordan yang dibuat adalah native python, yang mana secara performa sangat jauh selisihnya dengan fungsi bawaan NumPy.
Namun kedua kode tersebut akan memberikan hasil yang sama, tapi dengan waktu eksekusi fungsi NumPy yang jauh lebih pendek.