Sesi 07 dari 16

Analisis Stabilitas &
Robustness Sistem Adaptif

Membuktikan bahwa sistem yang "terus berubah" tetap aman dan tidak meledak — fondasi matematis yang membedakan kontrol adaptif ilmiah dari sekedar trial-and-error.

Teori Lyapunov Persistent Excitation Robustness Issues Teknik Perbaikan Parameter Drift Python Demo
🛡️
Topik 7.1
Teori Stabilitas Lyapunov untuk Sistem Adaptif
⚡ Analogi — Bola dalam Mangkuk: Energi Selalu Turun

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 StabilitasSyaratArtinya
Stable (Lyapunov)V̇ ≤ 0Sistem tidak "kabur" jauh dari titik asal — terbatas
Asymptotically StableV̇ < 0Sistem perlahan menuju nol (konvergen)
Exponentially StableV̇ ≤ −αV, α>0Konvergen dengan kecepatan eksponensial — paling kuat
UnstableV̇ > 0Sistem "meledak" — energi terus naik
📐 Prosedur Analisis Lyapunov untuk MRAC
Langkah 1: Definisikan error: e = y_m − y_p, θ̃ = θ − θ*
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)
📡
Topik 7.2
Persistent Excitation (PE) & Konvergensi Parameter
🔬 Analogi — Dokter Harus Beri Stimulus yang Bervariasi

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.

📐 Kondisi Persistent Excitation
Sinyal φ(t) dikatakan Persistently Exciting (PE) jika:

∃ α₁, α₂ > 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

KondisiJaminan StabilitasJaminan 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
⚠️
Topik 7.3
Masalah Robustness dalam Praktik

Teori Lyapunov berasumsi model sempurna dan tidak ada noise. Di dunia nyata infrastruktur kritis, ada banyak "kotoran" yang bisa merusak stabilitas:

🚨 Tiga Ancaman Utama Stabilitas Adaptif
1. Unmodeled Dynamics

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.

2. Measurement Noise

Noise sensor (ADC noise, electromagnetic interference). Adaptation law yang terlalu agresif akan "belajar dari noise" dan membuat parameter berfluktuasi tidak karuan.

3. External Disturbances

Gangguan eksternal yang persisten (beban berubah terus, angin, getaran). Bisa menyebabkan parameter terus berubah tanpa konvergen.

🛠️
Topik 7.4
Teknik Peningkatan Robustness
🧹 Analogi — Filter Spam Email

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.

MetodeMengatasiTrade-offCocok untuk
σ-modificationParameter drift, unmodeled dynamicsResidual error kecil (tidak konvergen ke nol)Sistem dengan noise sedang
Dead-zoneNoise sensorTidak adaptif saat error kecilSensor dengan noise tinggi
e-modificationDrift saat gangguan besarAdaptasi lebih lambatSistem dengan gangguan variabel
ProjectionSemua masalah di atasPerlu batas parameter diketahuiSafety-critical systems
💥
Topik 7.5
Parameter Drift & Bursting Phenomenon

Parameter Drift

🌊 Analogi — Perahu yang Perlahan Hanyut

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.

📐 Kondisi Penyebab Parameter Drift
Tanpa robustness modification, jika ada gangguan d(t):

θ̇ = −γ · e(t) · φ(t)
e(t) = e_true(t) + e_disturbance(t)

⟹ θ terus berubah karena e_disturbance ≠ 0
⟹ θ bisa → ∞ meski output tampak normal!

Bursting Phenomenon

💣 Analogi — Tekanan yang Tersimpan lalu Meledak

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
🐍
Topik 7.6
Python: Demo σ-Modification vs Tanpa Modifikasi
🔬 Skenario: Kontrol Reaktor Kimia dengan Noise Sensor

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.

Python 🐍 — robustness_sigma_mod.py
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

🎯 Sesi Berikutnya: Ujian Tengah Semester!

Sesi 8 adalah UTS yang mencakup seluruh materi Sesi 1–7. Pastikan kamu memahami konsep dasar kontrol adaptif, MRAC, STR, gain scheduling, dan analisis stabilitas sebelum ujian.

Lihat Info UTS →

🧠 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?