PIDやLQRは、一度パラメータを決めると、その設定で動き続けるのが基本。しかし実際の竿燈は、継竹、風、支え位置、竹の硬さなどによって動き方が変わる。Adaptive(適応)制御は、その変化を観測し、モデルや制御パラメータを運転中に調整する手法だ。
α = a θ + b u
ここで a は「傾きがどれだけ倒れる方向へ効くか」、b は「操作がどれだけ効くか」を表す係数とする。しかし実機では a, b が正確には分からない、または途中で変わることもある。つまり「本当の係数がわからない」と考える。
推定モデルは、
![]()
キャレットのついた â, b̂ は、コンピュータが現在推定している値。
そこで、予測と実測の差から係数を修正する。

予測誤差 ε が大きければ、「モデルの係数が現実と合っていない」と判断する。そこで少しずつ係数を更新していく。

η(イータ)は学習の速さ。大きすぎると推定値が暴れやすく、小さすぎると変化についていけない。機械学習の learning rate に似た役割なのだが説明は割愛。
ここで、Pythonで「適応」の考え方をどう書いているか。
| # 説明用の簡略例。実用のAdaptive制御そのものではない。 a_hat = 8.0 # a の推定値 b_hat = 1.0 # b の推定値 eta_a = 0.02 eta_b = 0.002def update_model(theta, omega, u, omega_next, dt): global a_hat, b_hat# 現在のモデルから次の角速度を予測 omega_pred = omega + dt * (a_hat * theta + b_hat * u)# 実測との差 eps = omega_next – omega_pred # 誤差が減る方向へモデル係数を少し更新 return eps, a_hat, b_hat |
実際のAdaptive制御にはMRAC(モデル規範型適応制御)、Self-Tuning Regulator、ゲインスケジューリングなど複数の考え方があるが、上のコードは「観測結果からモデルを変える」という考え方を見せる簡略例だ。
PID、LQR、Adaptive制御を比較すると、
|
観点 |
PID | LQR |
Adaptive |
| 何を見るか | 主に誤差 | 状態ベクトル全体 | 状態+対象の変化 |
| モデル | なくても使いやすい | 必要 | 不確かでも推定・調整する |
| 調整するもの | Kp, Ki, Kd | Q, R → K | モデル係数や制御ゲイン |
| 得意 | 単純・実用的・調整しやすい | 多変数をまとめて最適化 | 特性変化への追従 |
| 注意すべき点 | ゲイン調整、積分飽和、ノイズ | モデル誤差、状態観測 | 安定性、推定暴走、調整速度 |
| 竿燈で言うと | 傾いたら戻す | 傾き+速度+振動を見て最適化 | 竿の長さや風の変化に合わせて自分を調整 |
同じ「戻す」(制御)でも考え方が違うのだ。
PID:誤差 e を使って、u = Kp e + Ki ∫e dt + Kd de/dt
LQR:状態 x を使って、dx/dt = Ax + Bu。評価関数 J を最小にし、u = −Kx
Adaptive:観測結果からモデルやゲインを更新しながら、u を計算
PIDは誤差中心、LQRは状態モデル中心、Adaptiveは「対象が変わる」ことまで制御問題に含めると整理すると分かりやすいかも。