{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Praktikum Komputasi 1: Pengantar Simulasi Numerik (Julia)\n",
    "\n",
    "Selamat datang di modul simulasi komputasi untuk mata kuliah Persamaan Diferensial. Pada dokumen ini, kita menggunakan bahasa pemrograman **Julia**. \n",
    "\n",
    "Kita akan mensimulasikan respons transien rangkaian RL seri. Persamaan Diferensial Biasa (PDB) untuk arus $i(t)$ pada rangkaian ini adalah:\n",
    "$$ L \\frac{di}{dt} + R i = V_0 $$\n",
    "$$ \\frac{di}{dt} = \\frac{V_0 - R i}{L} $$\n",
    "\n",
    "Alih-alih langsung menggunakan persamaan analitik (eksponensial), kita akan melatih insting teknik (engineering) kita dengan **Metode Numerik Euler**. Komputer akan menyelesaikan persamaan diferensial tersebut secara \"kasar\" namun efektif."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Jalankan sel ini terlebih dahulu untuk memuat pustaka visualisasi\n",
    "using Plots"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Persiapan Parameter Sistem\n",
    "Tentukan parameter fisik dari induktor, resistor, dan sumber tegangan."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "R = 100.0   # Resistansi dalam Ohm\n",
    "L = 0.1     # Induktansi dalam Henry\n",
    "V₀ = 5.0    # Sumber tegangan DC 5 Volt\n",
    "\n",
    "# Durasi simulasi\n",
    "t_akhir = 0.005 # 5 milidetik\n",
    "Δt = 0.0001    # Ukuran langkah waktu (step size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Metode Numerik Euler\n",
    "Metode Euler memperkirakan nilai masa depan berdasarkan nilai masa kini ditambah laju perubahan saat ini dikali rentang waktu:\n",
    "$$ i(t + \\Delta t) \\approx i(t) + \\Delta t \\cdot \\left( \\frac{di}{dt} \\right) $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "waktu = 0.0:Δt:t_akhir\n",
    "N = length(waktu)\n",
    "\n",
    "arus_numerik = zeros(N)\n",
    "arus_numerik[1] = 0.0 # Syarat awal: i(0) = 0\n",
    "\n",
    "for k in 1:(N-1)\n",
    "    # Hitung laju perubahan saat ini (di/dt)\n",
    "    di_dt = (V₀ - R * arus_numerik[k]) / L\n",
    "    \n",
    "    # Prediksi arus di masa depan (Euler)\n",
    "    arus_numerik[k+1] = arus_numerik[k] + Δt * di_dt\n",
    "end\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Validasi dengan Solusi Analitik Eksak\n",
    "Mari kita bandingkan hasil pendekatan *coding* kita dengan hasil turunan matematika (Solusi Khusus PDB) yang telah diajarkan di kelas:\n",
    "$$ i(t) = \\frac{V_0}{R} \\left( 1 - e^{-\\frac{R}{L}t} \\right) $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "arus_eksak = (V₀/R) .* (1 .- exp.(-(R/L) .* waktu))\n",
    "\n",
    "plot(waktu .* 1000, arus_eksak .* 1000, label=\"Solusi Analitik Eksak\", lw=3, color=:blue, xlabel=\"Waktu (ms)\", ylabel=\"Arus (mA)\")\n",
    "plot!(waktu .* 1000, arus_numerik .* 1000, label=\"Pendekatan Numerik Euler\", ls=:dash, lw=3, color=:orange)\n",
    "title!(\"Perbandingan Arus Induktor\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Tugas Diskusi:** \n",
    "1. Apa yang terjadi jika nilai `Δt` (di sel parameter) diperbesar menjadi `0.002`? Jelaskan mengapa kurva warna oranye tidak lagi akurat!\n",
    "2. Ubahlah nilai `R = 0`. Apa yang terjadi pada arus? Jelaskan secara fisika!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. [Opsional] Tingkat Lanjut: Pustaka Standar Industri (SciML)\n",
    "Di dunia industri, kita tidak menulis perulangan `for` secara manual. Julia memiliki pustaka ekosistem **DifferentialEquations.jl** yang sangat cepat untuk ini."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "using DifferentialEquations\n",
    "\n",
    "f(u, p, t) = (V₀ - R*u) / L\n",
    "u0 = 0.0\n",
    "tspan = (0.0, 0.005)\n",
    "\n",
    "prob = ODEProblem(f, u0, tspan)\n",
    "sol = solve(prob, Tsit5())\n",
    "\n",
    "plot(sol, label=\"SciML Tsit5()\", lw=2, color=:green, xlabel=\"Waktu (s)\", ylabel=\"Arus (A)\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Julia 1.10.4",
   "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
}
