{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Praktikum Komputasi 5: Simulasi Persamaan Laplace 2D (Julia)\n",
    "\n",
    "Persamaan Laplace 2D memodelkan distribusi potensial elektrostatik $V(x,y)$ di dalam ruang bebas muatan antar-konduktor (misalnya di antara dua pelat kapasitor atau penampang kabel koaksial):\n",
    "$$ \\nabla^2 V = \\frac{\\partial^2 V}{\\partial x^2} + \\frac{\\partial^2 V}{\\partial y^2} = 0 $$\n",
    "\n",
    "## Metode Relaksasi Beda Hingga (Metode Gauss-Seidel / Jacobi)\n",
    "Dengan diskritisasi beda pusat spasial $\\Delta x = \\Delta y = h$:\n",
    "$$ \\frac{V_{i+1,j} - 2V_{i,j} + V_{i-1,j}}{h^2} + \\frac{V_{i,j+1} - 2V_{i,j} + V_{i,j-1}}{h^2} = 0 $$\n",
    "\n",
    "Menghasilkan formula rata-rata 4 titik tetangga (*Mean-Value Property*):\n",
    "$$ V_{i,j}^{(k+1)} = \\frac{1}{4} \\left( V_{i+1,j}^{(k)} + V_{i-1,j}^{(k)} + V_{i,j+1}^{(k)} + V_{i,j-1}^{(k)} \\right) $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "using Plots"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Implementasi Algoritma Relaksasi Gauss-Seidel 2D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Ukuran grid penampang 2D\n",
    "Nx, Ny = 60, 60\n",
    "V = zeros(Nx, Ny)\n",
    "\n",
    "# Syarat Batas Dirichlet:\n",
    "# Batas Atas (y = max): Pelat konduktor bertegangan 100 Volt\n",
    "# Batas Kiri, Kanan, Bawah: Ground (0 Volt)\n",
    "V[:, Ny] .= 100.0   # Batas atas\n",
    "V[:, 1]  .= 0.0     # Batas bawah\n",
    "V[1, :]  .= 0.0     # Batas kiri\n",
    "V[Nx, :] .= 0.0     # Batas kanan\n",
    "\n",
    "# Parameter Iterasi Relaksasi\n",
    "max_iter = 2000\n",
    "toleransi = 1e-4\n",
    "iter_selesai = 0\n",
    "\n",
    "for iter in 1:max_iter\n",
    "    max_selisih = 0.0\n",
    "    for i in 2:(Nx-1)\n",
    "        for j in 2:(Ny-1)\n",
    "            V_baru = 0.25 * (V[i+1, j] + V[i-1, j] + V[i, j+1] + V[i, j-1])\n",
    "            selisih = abs(V_baru - V[i, j])\n",
    "            if selisih > max_selisih\n",
    "                max_selisih = selisih\n",
    "            end\n",
    "            V[i, j] = V_baru\n",
    "        end\n",
    "    end\n",
    "    \n",
    "    if max_selisih < toleransi\n",
    "        iter_selesai = iter\n",
    "        break\n",
    "    end\n",
    "    iter_selesai = iter\n",
    "end\n",
    "\n",
    "println(\"Konvergensi tercapai pada iterasi ke-$iter_selesai dengan toleransi $toleransi V\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Visualisasi Kontur Potensial Elektrostatik & Garis Ekipotensial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_range = range(0, 1, length=Nx)\n",
    "y_range = range(0, 1, length=Ny)\n",
    "\n",
    "# Heatmap Kontur 2D\n",
    "p1 = contourf(collect(x_range), collect(y_range), V', color=:turbo, levels=20, \n",
    "              xlabel=\"Posisi X (m)\", ylabel=\"Posisi Y (m)\",\n",
    "              title=\"Distribusi Potensial Elektrostatik V(x,y)\")\n",
    "display(p1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Visualisasi Permukaan 3D (Potential Well)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "surface(collect(x_range), collect(y_range), V', xlabel=\"X\", ylabel=\"Y\", zlabel=\"Volt (V)\",\n",
    "        title=\"Permukaan Potensial Elektrostatik 3D\", color=:viridis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Analisis & Evaluasi Mahasiswa\n",
    "1. **Medan Listrik $\\mathbf{E}$:** Ingat bahwa medan listrik adalah gradien negatif dari potensial: $\\mathbf{E} = -\\nabla V$. Di area manakah kerapatan garis kontur paling rapat (artinya medan listrik $\\mathbf{E}$ paling kuat)?\n",
    "2. **Solusi Analitik Deret Fourier:** Solusi analitik untuk kasus ini adalah deret Fourier sinus tak hingga:\n",
    "   $$ V(x,y) = \\frac{4V_0}{\\pi} \\sum_{n=1,3,5,...}^{\\infty} \\frac{1}{n} \\frac{\\sinh(n\\pi y / L)}{\\sinh(n\\pi)} \\sin\\left(\\frac{n\\pi x}{L}\\right) $$\n",
    "   Bandingkan nilai titik tengah $V(0.5, 0.5)$ numerik dengan solusi deret 5 suku pertama!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Julia 1.10",
   "language": "julia",
   "name": "julia-1.10"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
