0% menganggap dokumen ini bermanfaat (0 suara)
98 tayangan7 halaman

05-Poisson 2D Metode Langsung

Dokumen ini membahas tentang penyelesaian persamaan Poisson 2D menggunakan metode langsung. Persamaan Poisson akan diterapkan pada domain bujur sangkar dengan suku sumber yang diberikan. Solusi diperoleh dengan mendiskretisasi persamaan menggunakan beda hingga dan menyelesaikan sistem persamaan linier yang dihasilkan secara langsung. Hasil komputasi dibandingkan dengan solusi analitik untuk melihat galatnya.

Diunggah oleh

David Damanik
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
98 tayangan7 halaman

05-Poisson 2D Metode Langsung

Dokumen ini membahas tentang penyelesaian persamaan Poisson 2D menggunakan metode langsung. Persamaan Poisson akan diterapkan pada domain bujur sangkar dengan suku sumber yang diberikan. Solusi diperoleh dengan mendiskretisasi persamaan menggunakan beda hingga dan menyelesaikan sistem persamaan linier yang dihasilkan secara langsung. Hasil komputasi dibandingkan dengan solusi analitik untuk melihat galatnya.

Diunggah oleh

David Damanik
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 7

05-Poisson 2D metode langsung

October 16, 2022

1 Latihan: Persamaan Poisson 2D menggunakan Metode Lang-


sung
Diketahui persamaan Poisson berikut ini

∂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

Syarat batas ditetapkan sebagai berikut:

"      #
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

Dengan mensubstitusi persamaan diferensi di atas ke persamaan Poisson, akan didapatkan


   
ui+1,j − 2ui,j + ui−1,j ui,j+1 − 2ui,j + ui,j−1
+ = fi,j
∆x2 ∆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]: N = 10 # banyaknya interval arah x


M = 10 # banyaknya interval arah y

xmin = 0 # batas bawah domain arah x


xmax = 1 # batas atas domain arah x

ymin = 0 # batas bawah domain arah y


ymax = 1 # batas atas domain arah y

2
# tentukan lebar interval
dx = (xmax - xmin)/N
dy = (ymax - ymin)/M

# nilai kuadrat dari interval


dx2 = dx**2
dy2 = dy**2

# nilai diskret dari x dan y


x = np.linspace(xmin, xmax, N+1)
y = np.linspace(ymin, ymax, M+1)

# 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

Berikutnya kita susun matriks [A] dan vektor [f]

[3]: # create matrix A and vector f

# Untuk mapping dari (i,j) ke k, lihat slide kuliah.

# 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

A[k,k] = -(2/dx2 + 2/dy2) # titik o


A[k,k-1] = A[k,k+1] = 1/dx2 # titik west dan east
A[k,k-N-1] = A[k,k+N+1] = 1/dy2 # titik south dan north

f[k] = (1000*(2*np.sinh(x[i]-0.5) + 4*(x[i]-0.5)*np.cosh(x[i]-0.5) +␣


,→(x[i]-0.5)**2*np.sinh(x[i]-0.5))
+ 1000*(2*np.sinh(y[j]-0.5) + 4*(y[j]-0.5)*np.cosh(y[j]-0.5) +␣
,→(y[j]-0.5)**2*np.sinh(y[j]-0.5)))

# Grids batas kiri dan kanan domain


for i in [0, N]:
for j in range(M+1):
k = j*(N+1)+i
A[k,k] = 1
if i == 0:

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]

# Grids batas bawah dan atas


for j in [0, M]:
for i in range(N+1):
k = j*(N+1) + i
A[k,k] = 1
if j == 0:
u[k] = 1000*((x[i] - 0.5)**2 * np.sinh(x[i]-0.5) + 0.25*np.sinh(-0.
,→5)) # BC u(x,0) / bawah domain
else:
u[k] = 1000*((x[i] - 0.5)**2 * np.sinh(x[i]-0.5) + 0.25*np.sinh(0.
,→5)) # BC u(x,1) / atas domain
f[k] = u[k]

Mari kita cek bagaimana bentuk matriks [A].

[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]: # Selesaikan menggunakan numpy


u = np.linalg.solve(A,f)

# Perlu dilakukan remapping untuk membentuk matriks 2D dari vektor


u2d = np.reshape(u,(N+1,M+1))

# Transpose untuk menyesuaikan plot


u2d = u2d.T

Kita akan bandingkan hasil komputasi kita dengan solusi analitik

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))

# Transpose untuk menyesuaikan plot


uanal = uanal.T

# Nilai galat
galat = u2d - uanal

Selanjutnya kita akan membuat plot hasil serta galatnya.


[7]: # plot

X, Y = np.meshgrid(x,y) # susun meshgrid untuk plot 3D


fig = plt.figure(figsize=(15,15))
cmap = mpl.cm.get_cmap('seismic') # tentukan colormap sesuai keinginan

# subplot pertama menampilkan hasil dalam bentuk plot 2D


ax = fig.add_subplot(2,2,1)
c = ax.pcolor(X,Y,u2d, vmin=-300, vmax=300, cmap=cmap,shading='auto')
ax.set_xlabel(r"x", fontsize=12)
ax.set_ylabel(r"y", fontsize=12)
ax.set_title("Hasil Komputasi")

# subplot kedua menampilkan hasil dalam bentuk plot 3D


ax = fig.add_subplot(2,2,2, projection='3d')
p = ax.plot_surface(X,Y, u2d, vmin=-300, vmax=300, linewidth=0, cmap=cmap)
ax.set_xlabel(r"x", fontsize=12)
ax.set_ylabel(r"y", fontsize=12)
ax.set_title("Hasil Komputasi")
cb = plt.colorbar(p, ax=ax, shrink=0.75)
cb.set_label(r"u(x,y)", fontsize=12)

# subplot ketiga menampilkan hasil dalam bentuk kontur


ax = fig.add_subplot(2,2,3)
contours = plt.contour(X,Y,u2d, 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 Hasil Komputasi")

# subplot keempat menampilkan kontur dari galat


ax = fig.add_subplot(2,2,4)

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.
[ ]:

Anda mungkin juga menyukai