Letakkan bola di tepi mangkuk. Tanpa bantuan dari luar, bola akan menggelinding ke bawah dan berhenti di titik terdalam. Mengapa? Karena energi potensialnya selalu berkurang. Lyapunov menggunakan logika yang sama: jika kita bisa menemukan fungsi V(x) yang analogis dengan "energi", dan terbukti bahwa V selalu menurun seiring waktu (V̇ ≤ 0), maka sistem pasti akan menuju ke keadaan stabil — tidak peduli berapa kali parameternya berubah!
Definisi Stabilitas Lyapunov
| Tipe Stabilitas | Syarat | Artinya |
|---|---|---|
| Stable (Lyapunov) | V̇ ≤ 0 | Sistem tidak "kabur" jauh dari titik asal — terbatas |
| Asymptotically Stable | V̇ < 0 | Sistem perlahan menuju nol (konvergen) |
| Exponentially Stable | V̇ ≤ −αV, α>0 | Konvergen dengan kecepatan eksponensial — paling kuat |
| Unstable | V̇ > 0 | Sistem "meledak" — energi terus naik |
Langkah 2: Pilih Lyapunov function:
V(e, θ̃) = e²/2 + θ̃ᵀΓ⁻¹θ̃/2 (Γ = matriks adaptation gain)
Langkah 3: Hitung turunan: V̇ = e·ė + θ̃ᵀΓ⁻¹θ̃̇
Langkah 4: Substitusi dinamika sistem, pilih θ̇ agar V̇ ≤ 0
Hasil: V̇ = e·A_m·e ≤ 0 (karena A_m stabil) ✅
✅ Apa yang Dijamin Lyapunov?
- Semua sinyal dalam loop (e, θ, u, y) tetap terbatas (bounded)
- Error output e(t) → 0 saat t → ∞ (asymptotically stable)
- Parameter θ tidak menyimpang ke tak terhingga
- Sistem aman meski ada gangguan kecil (dalam kondisi PE)
Bayangkan dokter ingin mendiagnosa reflek pasien. Jika dokter hanya mengetuk satu titik yang sama berulang kali, dia hanya akan tahu respons di titik itu. Untuk diagnosa lengkap, dia perlu mengetuk berbagai titik yang berbeda. Persistent Excitation sama: sinyal input harus cukup bervariasi (kaya frekuensi) agar semua parameter sistem bisa diidentifikasi dengan benar.
∃ α₁, α₂ > 0, T₀ > 0 sedemikian sehingga:
α₁·I ≤ (1/T₀) ∫[t, t+T₀] φ(τ)·φᵀ(τ) dτ ≤ α₂·I
untuk semua t ≥ 0.
Artinya: matriks korelasi sinyal selalu positif definit (bounded dari bawah)
Implikasi PE
| Kondisi | Jaminan Stabilitas | Jaminan Konvergensi θ |
|---|---|---|
| Lyapunov (tanpa PE) | ✅ e(t) terbatas dan → 0 | ❌ θ mungkin tidak konvergen ke θ* |
| Lyapunov + PE | ✅ e(t) → 0 | ✅ θ̂ → θ* (konvergen ke nilai sebenarnya) |
| Tanpa PE, ada noise | ⚠️ Bisa terjadi drift | ❌ θ bisa menyimpang |
⚠️ Kapan PE Terpenuhi?
- Sinyal referensi r(t) harus mengandung minimal n frekuensi berbeda (n = orde sistem)
- Sinyal DC saja (konstan): TIDAK PE
- Sinyal sinusoidal tunggal: PE hanya untuk sistem orde-1
- PRBS (Pseudo-Random Binary Sequence): PE untuk sistem orde berapa pun — sering digunakan di identifikasi sistem
Teori Lyapunov berasumsi model sempurna dan tidak ada noise. Di dunia nyata infrastruktur kritis, ada banyak "kotoran" yang bisa merusak stabilitas:
Dinamika frekuensi tinggi yang diabaikan saat linearisasi. Contoh: getaran mekanik, resonansi pipa, delay komunikasi kecil. Bisa menyebabkan sistem menjadi tidak stabil jika gain adaptasi terlalu besar.
Noise sensor (ADC noise, electromagnetic interference). Adaptation law yang terlalu agresif akan "belajar dari noise" dan membuat parameter berfluktuasi tidak karuan.
Gangguan eksternal yang persisten (beban berubah terus, angin, getaran). Bisa menyebabkan parameter terus berubah tanpa konvergen.
Email kita banjir spam. Tanpa filter, kotak masuk penuh email tidak berguna. σ-modification seperti filter spam: menambahkan "berat" kecil yang mendorong parameter kembali ke nilai nominal jika terlalu jauh menyimpang — menjaga kotak masuk (parameter) tetap bersih dan relevan.
σ-Modification
Tambahkan term damping pada adaptation law untuk mencegah drift.
θ̇ = −γ·e·φ − σ·γ·θ
σ kecil (0.001–0.01). Trade-off: tracking parameter lebih lambat tapi tidak drift.
Dead-Zone Modification
Hentikan adaptasi jika error sangat kecil (di bawah threshold noise).
θ̇ = −γ·e·φ jika |e| > δ, else 0
δ = ukuran dead zone. Mencegah parameter "belajar dari noise".
e-Modification
Variasi σ-modification yang lebih halus — besar damping proporsional dengan norma parameter.
θ̇ = −γ·e·φ − σ·γ·‖e‖·θ
Lebih konservatif dari σ-mod.
Projection Algorithm
Paksa parameter θ selalu berada di set terbatas yang diketahui (convex set Ω).
θ̇ = Proj(θ, −γ·e·φ)
Paling aman: parameter tidak pernah keluar batas fisik yang diketahui.
| Metode | Mengatasi | Trade-off | Cocok untuk |
|---|---|---|---|
| σ-modification | Parameter drift, unmodeled dynamics | Residual error kecil (tidak konvergen ke nol) | Sistem dengan noise sedang |
| Dead-zone | Noise sensor | Tidak adaptif saat error kecil | Sensor dengan noise tinggi |
| e-modification | Drift saat gangguan besar | Adaptasi lebih lambat | Sistem dengan gangguan variabel |
| Projection | Semua masalah di atas | Perlu batas parameter diketahui | Safety-critical systems |
Parameter Drift
Bayangkan perahu yang diikat tali tipis. Arus sungai terus mendorong perlahan. Tali terasa kuat di awal, tapi lama-lama perahu semakin jauh dari dermaga sampai tali putus. Parameter drift persis begini: dalam kondisi gangguan persisten atau tanpa PE, parameter θ perlahan bergerak menjauh dari nilai optimal — sampai akhirnya sistem menjadi tidak stabil.
θ̇ = −γ · e(t) · φ(t)
e(t) = e_true(t) + e_disturbance(t)
⟹ θ terus berubah karena e_disturbance ≠ 0
⟹ θ bisa → ∞ meski output tampak normal!
Bursting Phenomenon
Balon ditiup perlahan-lahan. Tampaknya baik-baik saja. Lalu meledak tiba-tiba tanpa peringatan. Bursting dalam kontrol adaptif sangat mirip: sistem tampak stabil dalam waktu lama, parameter drift perlahan tidak terdeteksi, lalu tiba-tiba output meloncat besar (burst) kemudian kembali normal. Sangat berbahaya untuk reaktor atau pembangkit listrik!
🚨 Tanda-Tanda Bursting yang Perlu Diwaspadai
- Output sistem tiba-tiba melonjak besar lalu kembali normal
- Parameter θ tampak stabil lama, lalu berubah drastis sebentar
- Fenomena ini terjadi lebih sering saat sinyal referensi konstan (tidak PE)
- Solusi: gunakan σ-modification atau projection algorithm
Sebuah reaktor kimia memiliki sensor suhu yang memiliki noise cukup besar (±2°C). Kita bandingkan MRAC biasa vs MRAC dengan σ-modification. Tanpa modifikasi, parameter drift membuat sistem tidak stabil setelah beberapa waktu.
import numpy as np import matplotlib.pyplot as plt # ========================================== # DEMO: MRAC STANDAR vs MRAC + σ-MODIFICATION # Sistem: ẏ = −a·y + b·u + d (disturbance) # ========================================== np.random.seed(42) dt = 0.05; T = 100; t = np.arange(0, T, dt); N = len(t) # Parameter sistem nyata a_true = 1.0; b_true = 2.0 # Reference model: ẏ_m = -2*y_m + 2*r a_m = 2.0; b_m = 2.0; r = 5.0 gamma = 0.5 # learning rate sigma = 0.02 # σ-modification strength noise_amp = 0.5 # amplitudo noise sensor def run_mrac(use_sigma, use_deadzone, dz_thresh=0.3): y_m = np.zeros(N); y_m[0] = 1.0 y_p = np.zeros(N); y_p[0] = 1.0 th1 = np.zeros(N); th1[0] = 0.5 th2 = np.zeros(N); th2[0] = 0.0 for k in range(1, N): # Reference model update dy_m = -a_m*y_m[k-1] + b_m*r y_m[k] = y_m[k-1] + dy_m*dt # Sinyal kontrol u = th1[k-1]*r + th2[k-1]*y_p[k-1] # Gangguan persisten + noise sensor disturbance = 0.3*np.sin(0.5*t[k]) # gangguan sinusoidal noise = noise_amp * np.random.randn() # noise sensor # Update plant dy_p = -a_true*y_p[k-1] + b_true*u + disturbance y_p[k] = np.clip(y_p[k-1] + dy_p*dt, -20, 20) y_measured = y_p[k] + noise # Error e = y_m[k] - y_measured # Update parameter if use_deadzone and abs(e) < dz_thresh: dth1 = 0; dth2 = 0 # dead zone: diam jika error kecil else: dth1 = gamma * e * r dth2 = gamma * e * y_p[k-1] if use_sigma: dth1 -= sigma * gamma * th1[k-1] # σ-modification dth2 -= sigma * gamma * th2[k-1] th1[k] = th1[k-1] + dth1*dt th2[k] = th2[k-1] + dth2*dt return y_m, y_p, th1, th2 # Jalankan tiga variasi y_m, y_std, th1_std, th2_std = run_mrac(use_sigma=False, use_deadzone=False) _, y_sig, th1_sig, th2_sig = run_mrac(use_sigma=True, use_deadzone=False) _, y_dz, th1_dz, th2_dz = run_mrac(use_sigma=False, use_deadzone=True) # === PLOT === fig, axes = plt.subplots(3, 1, figsize=(12, 9)) axes[0].plot(t, y_m, 'b--', lw=1.5, label='Reference Model') axes[0].plot(t, y_std, 'tomato', lw=1.2, alpha=0.9, label='MRAC Standard (drift!)') axes[0].plot(t, y_sig, 'lime', lw=1.5, label='MRAC + σ-modification') axes[0].plot(t, y_dz, 'cyan', lw=1.5, ls='--', label='MRAC + Dead-zone') axes[0].set_ylim(-15, 12) axes[0].set_ylabel('Output y(t)') axes[0].set_title('Perbandingan Stabilitas: Standard vs Robust Modifications') axes[0].legend(fontsize=9); axes[0].grid(alpha=0.3) axes[1].plot(t, th1_std, 'tomato', lw=1.2, label='θ₁ Standard (DRIFT!)') axes[1].plot(t, th1_sig, 'lime', lw=1.5, label='θ₁ σ-modification (stabil)') axes[1].plot(t, th1_dz, 'cyan', lw=1.5, ls='--', label='θ₁ Dead-zone (stabil)') axes[1].set_ylabel('Nilai θ₁') axes[1].set_title('Evolusi Parameter θ₁ — Parameter Drift vs Stabil') axes[1].legend(fontsize=9); axes[1].grid(alpha=0.3) axes[2].plot(t, th2_std, 'tomato', lw=1.2, label='θ₂ Standard') axes[2].plot(t, th2_sig, 'lime', lw=1.5, label='θ₂ σ-modification') axes[2].plot(t, th2_dz, 'cyan', lw=1.5, ls='--', label='θ₂ Dead-zone') axes[2].set_xlabel('Waktu (detik)'); axes[2].set_ylabel('Nilai θ₂') axes[2].set_title('Evolusi Parameter θ₂') axes[2].legend(fontsize=9); axes[2].grid(alpha=0.3) plt.tight_layout(); plt.show() print(f"\n📊 Ringkasan Stabilitas:") print(f"Max |y| Standard : {np.max(np.abs(y_std)):.2f}") print(f"Max |y| σ-mod : {np.max(np.abs(y_sig)):.2f}") print(f"Max |y| Dead-zone : {np.max(np.abs(y_dz)):.2f}") print(f"\nMax |θ₁| Standard : {np.max(np.abs(th1_std)):.2f}") print(f"Max |θ₁| σ-mod : {np.max(np.abs(th1_sig)):.2f}") print(f"\nKesimpulan: Robustness modification SANGAT penting untuk aplikasi nyata!")
📊 Interpretasi Hasil
- MRAC Standard: Output dan parameter drift semakin jauh — berbahaya untuk reaktor kimia!
- σ-modification: Parameter terbatas, output tetap stabil meski ada residual error kecil
- Dead-zone: Berhenti beradaptasi saat error kecil — bagus jika noise dominan
- Untuk infrastruktur kritis: selalu gunakan minimal satu robustness modification
🧠 Kuis Pemahaman Sesi 7
1. Apa kondisi yang harus dipenuhi Lyapunov function V untuk menjamin stabilitas?
2. Apa yang terjadi jika sinyal input TIDAK memenuhi kondisi Persistent Excitation (PE)?
3. σ-modification dalam MRAC berfungsi untuk?