JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

穩定性與穩態誤差:會穩定嗎?落在哪?

你日後設計的每一個控制器,在其他一切都還沒談之前,都得先跨過兩道門檻。第一:它會**穩定下來**,還是會把自己抖到散架?第二:穩定之後,它會**落在目標上**,還是頑固地差那麼一截?這一級把這兩個問題講到精確。你會學到左半平面極點法則、一個叫 Routh–Hurwitz 的巧妙技巧——**不必算出任何一個根**就能判斷系統是否穩定,以及在動工之前就預測殘留誤差的終值定理。把這兩件事做對,剩下的控制設計,不過是把它們做得更好而已。

每個控制器都得回答的兩個問題

想像你把方向盤輕推幾度然後放手。一輛好車會平順地回正、貼著路面行駛。一輛調得糟的車可能左右搖擺、擺幅越來越大直到失控甩尾——或者它會穩下來,但總是偏在你瞄準位置的左邊一點。這正是任何受控系統的兩種失效模式:它可能不穩定(擺動越來越大),也可能有誤差(停在錯的地方)。在你日後調整任何一個增益之前,你得有辦法對這兩者做檢驗。

這兩者彼此獨立。一個系統可以穩如磐石,卻仍然永遠停在離目標一公尺的地方。另一個可以精準命中,卻劇烈失穩。所以工程師把驗收測試一分為二:穩定性問的是*暫態會不會消退?*,穩態準確度問的是*存活下來的訊號落在哪?*整個這一級,就是回答這兩者的工具箱——便宜、而且在你開機前就能用。

BIBO 穩定與左半平面法則

穩定性那個乾淨、工程級的定義叫 BIBO:*有界輸入、有界輸出*(Bounded Input, Bounded Output)。如果每一個維持在有限範圍內的輸入,都產生同樣維持在有限範圍內的輸出,這個系統就是 BIBO 穩定。給穩定的放大器餵 1 伏特訊號,你得到有限的輸出;給不穩定的餵同樣訊號,無論你多溫柔,輸出都會一路衝到電源軌。這就是「輕推產生擺動、而非爆炸」的正式版本。

從第 3 級你已經有了幾何判據。寫出閉迴路轉移函數,找出它的極點——也就是分母的根。每個位於 s = σ + jω 的極點,都對響應貢獻一個形如 e^(σt) 的項。若 σ 為負,該項衰減;若 σ 為正,它無界增長。所以法則簡單得驚人:一個系統穩定,當且僅當每一個極點都嚴格落在 s 平面的左半邊(σ < 0)。只要有一個極點溜進右半邊——哪怕只差一根頭髮——整個系統就不穩定。

             jω
              ^
     UNSTABLE  |  STABLE
   (poles run  |  (poles decay)
    off to ∞)  |
        x      |     x      <- left-half pole: e^(σt), σ<0, dies out
               |    /
   ────────────+──────────────> σ
         x     |
         |     |   poles ON the jω axis (σ=0):
   right-half  |   marginally stable -> sustained oscillation,
   pole grows  |   neither grows nor decays
穩定性的極點地圖。左半 = 衰減暫態 = 穩定。右半 = 增長暫態 = 不穩定。落在 jω 軸上 = 永不止息的振鈴(臨界)。

Routh–Hurwitz:不求根也能判穩定

左半平面法則完美無瑕——只有一個麻煩。找極點意味著要把分母多項式因式分解,而對三階以上的系統,這是一場硬仗(一旦係數裡還藏著一個可調增益 K,更是手算辦不到)。1876 年 Edward Routh 找到一條繞過去的路,後由 Adolf Hurwitz 精煉:你只看係數,就能判定是否*所有*根都有負實部——一個根都不用解。

做法分兩部分。先做必要檢查:任何穩定多項式,每個係數都得存在、而且同號——少一個或變號的係數,立刻判「不穩定」。完整測試:建出 Routh 陣列,一張從係數交叉相乘往下推的小表。系統穩定,當且僅當第一欄的每個元素都同號。第一欄每變號一次,恰好數出一個落在右半平面的極點。

我們來跑一個真實的三階例子。假設某個迴授迴路給出特徵多項式 s³ + 6s² + 11s + 6。每個係數都存在且為正,所以它通過了必要檢查——但對三階以上,光憑這點不能證明穩定。建出陣列:

Characteristic polynomial:  s^3 + 6 s^2 + 11 s + 6

   Routh array            first column
   ─────────────────────  ───────────
   s^3 |   1      11          1
   s^2 |   6       6          6
   s^1 |   b1      0          b1
   s^0 |   c1                 c1

   b1 = (6*11 - 1*6) / 6  = (66 - 6)/6  = 60/6 = 10
   c1 = (b1*6 - 6*0) / b1 = (10*6)/10   = 6

   First column:  1, 6, 10, 6   -> all POSITIVE, no sign changes
   => 0 right-half-plane poles  => STABLE

   (Sanity check: s^3+6s^2+11s+6 = (s+1)(s+2)(s+3),
    roots at -1, -2, -3 -- all in the left half-plane. ✓)
一個完整的 Routh–Hurwitz 演算。第一欄自始至終同號,所以三個極點都在左半平面——並由因式分解的根 −1、−2、−3 證實。

當增益是符號時,真正的威力才顯現。如果控制器增益 K 出現在係數裡,第一欄的元素就成了關於 K 的表達式。要求它們全部維持為正,就化成一組不等式——而那些不等式正好交給你讓迴路維持穩定的 K 精確範圍。這一招——找出讓某個極點跨上 jω 軸的臨界增益——是整個控制設計中最常用的計算之一。

穩態誤差與終值定理

現在假設系統通過了穩定性測試——暫態消亡,剩下了某個東西。這個存活者是落*在*目標上,還是差一截?你命令輸出去的位置,和它實際停下的位置之間的差距,就是[[ee-steady-state-error|穩態誤差]],通常寫作 e_ss。一個設定 21 °C 卻維持在 20.4 °C 的恆溫器,穩態誤差就是 0.6 °C——惱人、頑固,而且完全能事先預測。

不必模擬哪怕一秒就能預測它的工具,是終值定理:一個訊號的長期值等於 lim (s→0) 的 s·E(s),其中 E(s) 是誤差的拉普拉斯轉換。把誤差轉換乘上 s,讓 s 滑到零,靜止誤差就跳出來了。使用它有一條鐵律:系統必須已經穩定。對不穩定的系統套用這個定理,它會樂呵呵地回你一個有限、卻完全虛構的數字。

Unity-feedback loop, open-loop transfer function G(s):

        R(s) --->(+)---->[ G(s) ]----+----> C(s)
                  ^-                 |
                  |__________________|

   Error:   E(s) = R(s) / (1 + G(s))
   Final-value theorem:  e_ss = lim (s->0) s * R(s) / (1 + G(s))

   The three classic test inputs (R(s)) :
     step      r(t)=1        R(s) = 1/s      "can it reach a level?"
     ramp      r(t)=t        R(s) = 1/s^2    "can it track a slope?"
     parabola  r(t)=t^2/2    R(s) = 1/s^3    "can it track acceleration?"
單位迴授迴路的誤差,以及用來探測它的三種標準參考輸入——階躍、斜坡與拋物線。

為什麼是這三種輸入?因為它們構成一道難度階梯。[[ee-step-response|階躍]]要求系統到達並維持一個固定位準。斜坡要求它跟上以等速移動的目標——像雷達天線追蹤一架掠過天空的飛機。拋物線要求它跟上一個持續加速的目標。一個比一個難,而一個把階躍考滿分的系統,面對斜坡可能無望地落後。

系統型別:數一數積分器

精妙的部分來了。一個迴路能否以零誤差追蹤階躍、斜坡或拋物線,歸結為一個整數:系統型別,定義為開迴路轉移函數 G(s) 中純積分器(1/s 因子,即位於原點的極點)的個數。積分器是一個不斷累積誤差的記憶體——而正是這份累積把誤差抹平。數一數 1/s 因子,你就能從一張小表上讀出穩態誤差,完全不用微積分。

  System type = number of 1/s factors (origin poles) in open-loop G(s)

  Error constants:  Kp = lim G(s)   Kv = lim s G(s)   Ka = lim s^2 G(s)
                       s->0            s->0              s->0

  ┌────────┬──────────────┬──────────────┬──────────────┐
  │  Type  │  STEP error  │  RAMP error  │ PARABOLA err │
  ├────────┼──────────────┼──────────────┼──────────────┤
  │   0    │  1/(1+Kp)    │      ∞        │      ∞        │  finite step err
  │   1    │     0        │    1/Kv      │      ∞        │  tracks step!
  │   2    │     0        │      0        │    1/Ka      │  tracks ramp too
  └────────┴──────────────┴──────────────┴──────────────┘

  Pattern: each added integrator kills the error to one harder input,
  and leaves a finite error on the NEXT one up the ladder.
系統型別表。你每加一個積分器,就把某一輸入的誤差歸零,並把下一個更難的輸入從無限大降為有限、可算的誤差。

把這張表當故事讀。一個 Type 0 系統(沒有積分器)有有限但非零的階躍誤差——就像一個樸素的比例式恆溫器,總是停得差一點點。一個 Type 1 系統有一個積分器,所以它的階躍誤差*恰好為零*,但對移動(斜坡)目標仍會落後一個有限量。一個 Type 2 系統能完美追蹤斜坡,只在加速目標上留下有限誤差。注意這個規律:每個積分器替你買到對某一輸入的完美,以及對下一個更難輸入的有限誤差。

綜合起來:驗收測試

從現在起,你在日後每一級設計的每個控制器,都會用同一份兩部分的考卷打分,而你已經握有評分標準了。先穩定、後準確——順序就是這樣,因為對一個不會穩下來的東西談準確,毫無意義。

  1. 寫出閉迴路特徵多項式(閉迴路轉移函數的分母,即令 1 + G(s)H(s) = 0)。
  2. 必要檢查:所有係數都在、且全部同號。在這裡失敗就結束了——它不穩定。
  3. 建出 Routh 陣列,確認第一欄從不變號。若增益 K 是符號,解不等式求出 K 的穩定範圍。
  4. 現在、且唯有確認穩定後,數一數開迴路 G(s) 中的積分器以得到系統型別。
  5. 型別表(或套用終值定理)以預測階躍/斜坡/拋物線誤差。判斷它是否達標。
  6. 若誤差太大,加入積分作用以提升型別——然後跳回步驟 1,因為你剛剛動了極點,必須重新檢查穩定性。

那最後一步的回圈,就是整門手藝的縮影。你提升型別來消滅誤差,這把極點往右推、威脅穩定,於是又把你送回 Routh–Hurwitz。穩定與準確不是兩件分開的雜活——它們是同一根槓桿的兩端,而迴授設計者的工作,就是找到讓兩者都待在界內的那個點。日後的各級——根軌跡、波德圖與奈奎斯特法——全都不過是更豐富地看見並調整這同一個平衡的方法。