{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "132fb79e",
   "metadata": {},
   "source": [
    "# ⚡ Simulasi Transien Rangkaian RLC Seri (Interaktif)\n",
    "Selamat datang di modul simulasi komputasi untuk **Persamaan Diferensial Orde 2** pada aplikasi rangkaian RLC seri.\n",
    "\n",
    "## 📌 Persamaan Diferensial\n",
    "Berdasarkan Hukum Tegangan Kirchhoff (KVL) pada rangkaian RLC seri tanpa sumber tegangan luar (respons alami):\n",
    "$$ L \\frac{d^2i}{dt^2} + R \\frac{di}{dt} + \\frac{1}{C} i = 0 $$\n",
    "\n",
    "Tingkat peredaman (*damping*) rangkaian ditentukan oleh parameter $R$, $L$, dan $C$:\n",
    "- **Underdamped (Kurang Redam):** Berosilasi sebelum stabil menuju nol.\n",
    "- **Critically Damped (Redam Kritis):** Menurun menuju nol paling cepat tanpa berosilasi.\n",
    "- **Overdamped (Lebih Redam):** Menurun menuju nol secara perlahan tanpa berosilasi.\n",
    "\n",
    "### 🚀 Instruksi:\n",
    "Jalankan *cell* kode di bawah ini dengan menekan tombol **Play** (atau `Shift + Enter`). Setelah itu, Anda bisa **menggeser slider** nilai $R, L,$ dan $C$ secara interaktif untuk melihat bagaimana kurva peredaman berubah secara *real-time*!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "46354f0c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.integrate import odeint\n",
    "import ipywidgets as widgets\n",
    "from IPython.display import display\n",
    "\n",
    "# Fungsi PDB Orde 2 (dipecah menjadi sistem orde 1)\n",
    "def rlc_circuit(y, t, R, L, C):\n",
    "    i, didt = y\n",
    "    d2idt2 = -(R/L)*didt - (1/(L*C))*i\n",
    "    return [didt, d2idt2]\n",
    "\n",
    "# Fungsi visualisasi dan analisis damping\n",
    "def plot_rlc(R=20, L=1.0, C=0.01):\n",
    "    t = np.linspace(0, 1.5, 500)\n",
    "    # Kondisi awal: Arus awal = 0, Laju perubahan arus = 10 A/s\n",
    "    y0 = [0.0, 10.0]\n",
    "    \n",
    "    # Selesaikan PDB\n",
    "    sol = odeint(rlc_circuit, y0, t, args=(R, L, C))\n",
    "    i = sol[:, 0]\n",
    "    \n",
    "    # Hitung koefisien redaman dan frekuensi natural\n",
    "    alpha = R / (2 * L)\n",
    "    omega_0 = 1 / np.sqrt(L * C)\n",
    "    \n",
    "    if alpha < omega_0:\n",
    "        status = \"Underdamped (Kurang Redam)\"\n",
    "        color = 'royalblue'\n",
    "    elif np.isclose(alpha, omega_0, rtol=1e-2):\n",
    "        status = \"Critically Damped (Redam Kritis)\"\n",
    "        color = 'forestgreen'\n",
    "    else:\n",
    "        status = \"Overdamped (Lebih Redam)\"\n",
    "        color = 'crimson'\n",
    "        \n",
    "    plt.figure(figsize=(10, 5))\n",
    "    plt.plot(t, i, label=f'Arus $i(t)$ - {status}', color=color, linewidth=2.5)\n",
    "    plt.axhline(0, color='black', linewidth=1, linestyle='--')\n",
    "    \n",
    "    # PERBAIKAN: Menggunakan raw f-string (rf\"\") agar LaTeX \\alpha dan \\omega dibaca dengan benar\n",
    "    plt.title(rf'Respons Transien RLC Seri ($\\alpha={alpha:.2f}$, $\\omega_0={omega_0:.2f}$)', fontsize=14, fontweight='bold')\n",
    "    \n",
    "    plt.xlabel('Waktu $t$ (detik)', fontsize=12)\n",
    "    plt.ylabel('Arus $i(t)$ (Ampere)', fontsize=12)\n",
    "    plt.grid(True, linestyle=':', alpha=0.7)\n",
    "    plt.legend(fontsize=12, loc='upper right')\n",
    "    plt.xlim(0, 1.5)\n",
    "    plt.ylim(-0.5, max(i)+0.5)\n",
    "    plt.show()\n",
    "\n",
    "# Membuat antarmuka UI Slider\n",
    "widgets.interact(plot_rlc, \n",
    "                 R=widgets.FloatSlider(value=10, min=0, max=50, step=1, description='R (Ohm):'),\n",
    "                 L=widgets.FloatSlider(value=1.0, min=0.1, max=5.0, step=0.1, description='L (Henry):'),\n",
    "                 C=widgets.FloatSlider(value=0.01, min=0.001, max=0.1, step=0.001, description='C (Farad):', readout_format='.3f'))\n"
   ]
  }
 ],
 "metadata": {},
 "nbformat": 4,
 "nbformat_minor": 5
}
