状態空間 可制御性シミュレーター 戻る
制御工学

状態空間 可制御性シミュレーター

2次の線形時不変システム ẋ=Ax+Bu について、入力 u だけで状態空間のすべての方向を動かせるか(可制御性)を判定するツールです。システム行列 A と入力ベクトル B を変えると、可制御行列 𝒞=[B AB]・その行列式・ランク・可制御判定がリアルタイムで分かります。

パラメータ設定
システム行列 A の各成分。A=[[a11,a12],[a21,a22]] が状態 x の自由運動(固有運動)を決めます。
a11(A の 1行1列)
a12(A の 1行2列)
a21(A の 2行1列)
a22(A の 2行2列)
入力ベクトル B=[b1,b2]。入力 u がどの方向に状態を押すかを決めます。
b1(B の 1行目)
b2(B の 2行目)
計算結果
可制御行列の行列式 det(𝒞)
ランク rank(𝒞)
AB 成分1
AB 成分2
可制御性
|det(𝒞)|(可制御性の強さ)
可制御行列の列ベクトル — 状態平面

原点から伸びる 2 本の矢印が可制御行列の列ベクトル B と AB です。独立なら緑の平行四辺形で平面全体を張り、平行(線形従属)なら赤い直線上に重なって不可制御になります。

det(𝒞) の感度 — b2 を掃引
可制御行列の列ベクトル成分
理論・主要公式

$$\dot{x}=Ax+Bu,\qquad \mathcal{C}=\begin{bmatrix}B & AB\end{bmatrix}$$

状態方程式と可制御行列 𝒞。2 次系では 𝒞 は B と AB を列に並べた 2×2 行列。AB は A とベクトル B の積。

$$\text{可制御}\iff \operatorname{rank}\mathcal{C}=n$$

カルマンの可制御性判定。n は状態の次数(本ツールは n=2)。rank が n に満たないと不可制御。2×2 では det(𝒞)≠0 と rank(𝒞)=2 は同値。

$$\det\mathcal{C}=b_1(AB)_2-b_2(AB)_1$$

2×2 可制御行列の行列式。n 次系では一般に 𝒞=[B, AB, A²B, …, Aⁿ⁻¹B] の n×n 行列を作り、その rank を調べる。

可制御性とは

🙋
「可制御性」って、制御工学の授業で出てきたんですけど…ざっくり言うとどういう性質なんですか?
🎓
ひとことで言うと「入力 u だけを使って、システムの状態 x を行きたい場所へ自由に動かせるか」という性質だよ。たとえば台車の上に倒立振り子が立っている系を考えると、状態は「台車の位置」「速度」「振り子の角度」「角速度」の4つ。可制御なら、台車を押す力だけでこの4つを全部、好きな値に持っていける。逆に不可制御だと、どんなに頑張っても触れない状態が残るんだ。
🙋
触れない状態が残るって、どうやって見分けるんですか?このツールだと A と B のスライダーがありますけど。
🎓
そこで出てくるのが「可制御行列」𝒞 だ。2次系なら 𝒞=[B AB]、つまり入力ベクトル B と、それに A を1回かけた AB を横に並べた2×2行列。B は入力が直接押す方向、AB は1ステップ後にその影響が伝わる方向を表している。この2本のベクトルが平面全体を張れれば可制御。張れなければ不可制御だ。右上のキャンバスで、まさにこの2本の矢印を見せているよ。
🙋
なるほど、矢印が2本!じゃあ「平面を張れる」って具体的には行列式で見るんですか?
🎓
そう、2×2なら det(𝒞) を計算するのが一番速い。B と AB が独立なら行列式は 0 でない値になり、ランクは2、つまり可制御。B と AB が平行(線形従属)だと行列式はちょうど 0、ランクは1に落ちて不可制御だ。左で b1 を 0、b2 を 1 のデフォルトにしておくと、AB=[1,-2] になって det=-1。0 じゃないからこの系は可制御、というのが結果カードに出るはずだよ。
🙋
行列式が 0 じゃなければいい、というのは分かりました。でも |det| の値そのものにも意味があるんですか?「可制御性の強さ」ってカードがありますけど。
🎓
いい質問だね。可制御か不可制御かは「0かどうか」のYes/No判定だけど、実務では「0にどれだけ近いか」も大事なんだ。|det| が小さい系は、紙の上では可制御でも、数値的にはほぼ不可制御。フィードバックゲインがとんでもなく大きくなって、ノイズに弱くなったりアクチュエータが飽和したりする。だから |det| を「可制御性の強さ」の目安として見ておくと、設計が現実的かどうかの当たりがつくんだ。厳密にはグラミアンの特異値を使うけど、感覚を掴むには |det| で十分だよ。
🙋
最後にひとつ。可制御だと、何がうれしいんですか?
🎓
可制御だと「極配置」が自由にできる、これが一番大きい。状態フィードバック u=-Kx のゲイン K をうまく選べば、閉ループ系の極(固有値)を好きな場所に置ける。つまり不安定な系でも、応答の速さや減衰を狙いどおりに設計できるんだ。逆に不可制御なモードがあると、その極は K で動かせない。そのモードがたまたま不安定だったら、状態フィードバックではどうやっても安定化できない。だから制御系設計の出発点として、まず可制御性をチェックするんだよ。

よくある質問

可制御性とは「適切な入力 u(t) を与えれば、有限時間で状態 x を任意の点に移せるか」という性質です。n 次の線形時不変システム ẋ=Ax+Bu では、可制御行列 𝒞=[B, AB, A²B, …, Aⁿ⁻¹B] を作り、その rank が n に等しければ可制御と判定します(カルマンの可制御性判定)。本ツールは 2 次系を扱うので 𝒞=[B AB] となり、その行列式が 0 でない(rank=2)なら可制御です。
det(𝒞)=0 のとき、列ベクトル B と AB が同一直線上(線形従属)になり、可制御行列のランクが 2 から 1 以下に落ちます。これは入力 u が状態空間の一部の方向しか動かせない=不可制御を意味します。物理的には、入力で励起できないモードが存在し、その方向の状態は初期値のまま、あるいは系の固有運動に任せるしかなくなります。本ツールでは B と AB が赤い直線上に重なって表示されます。
直接の関係はありません。可制御性は「入力で動かせるか」、安定性は「放っておいて発散しないか」という別々の性質です。不可制御でも安定なシステムはあり、可制御でも不安定なシステムもあります。ただし重要なのは、不可制御なモードが不安定だと状態フィードバックでは安定化できないという点です。可制御なら任意の極配置が可能なので、不安定極も自由に左半平面へ移せます。
|det(𝒞)| が 0 から大きく離れているほど、列ベクトル B と AB が直交に近く独立しており、おおまかな「可制御性の強さ」の目安になります。|det| が小さい(0 に近い)系は数値的に不可制御に近く、フィードバックゲインが極端に大きくなったり、わずかなモデル誤差で実質不可制御になったりします。厳密な指標としては可制御性グラミアンの最小特異値が使われますが、本ツールの |det| は直感的な近似指標です。

実世界での応用

倒立振り子・台車系の安定化:制御工学の定番である倒立振り子は、状態を「位置・速度・角度・角速度」の4次でモデル化します。設計の第一歩はこの系が可制御かを確かめること。可制御であれば状態フィードバックで極配置でき、不安定な「倒れる」モードを左半平面に移して直立させられます。本ツールの2次系は、その判定ロジックを最小構成で体験するものです。

多入力システムのアクチュエータ配置:航空機の姿勢制御や四輪独立操舵の車両では、どこにアクチュエータ(入力 B の方向)を置くかが可制御性を左右します。設計段階で複数の B 候補について可制御行列のランクと |det| を比較し、すべてのモードを十分な「強さ」で動かせる配置を選びます。センサーやアクチュエータが1個故障したときに不可制御に陥らないか、というフォールトトレラント設計でも同じ判定が使われます。

現代制御(LQR・極配置)の前提チェック:LQR や極配置による状態フィードバック設計は、対象が可制御(少なくとも可安定)であることを前提にしています。MATLAB の ctrb / rank、Python python-control の ctrb など、現場のツールチェーンは必ず可制御性判定から始めます。不可制御なモードが含まれていれば、そのモードは設計者が手を出せないため、入力の取り方やモデル化を見直す必要があります。

プロセス制御・電力系統:化学プラントの温度・濃度制御や、電力系統の周波数・電圧制御のような大規模システムでも、可制御性は「ある制御入力で系全体を望む状態へ導けるか」を判断する基礎になります。可制御部分空間と不可制御部分空間を分離(カルマン分解)し、制御できる部分にだけ設計リソースを集中する、といった戦略にも直結します。

よくある誤解と注意点

まず多いのが、「可制御性と安定性を混同する」ことです。可制御性は「入力で状態を動かせるか」、安定性は「入力を切っても状態が発散しないか」という、まったく別の性質です。可制御だが不安定なシステム(倒立振り子など)はごく普通に存在し、むしろ制御の出番はそこにあります。逆に不可制御でも安定なシステムもあります。本ツールの det(𝒞) は可制御性の指標であって、A の固有値(安定性)とは別物だと理解してください。det(𝒞)≠0 でも、それだけでは系が安定であることを意味しません。

次に、「数値的に可制御であれば実用上も問題ない、と思い込む」こと。det(𝒞) がゼロでなくても、ゼロに非常に近い系は「ほぼ不可制御」です。この状態で無理に極配置すると、フィードバックゲイン K が極端に大きくなり、測定ノイズを増幅し、アクチュエータをすぐ飽和させ、モデル誤差にも極端に敏感になります。紙の上で rank=2 でも、|det| が小さければ「設計はできるが現実には使い物にならない」ことがあります。可制御性は Yes/No だけでなく「強さ」まで見るのが実務の鉄則です。

最後に、「可制御行列のランク計算を数値的に過信する」点。可制御行列 𝒞=[B, AB, …, Aⁿ⁻¹B] は、次数 n が大きくなると Aⁿ⁻¹B の項が桁違いに大きく(または小さく)なり、行列が極端に悪条件になります。そのため高次系では、行列式やナイーブなランク計算ではなく、特異値分解(SVD)で有効ランクを評価したり、数値的に安定な可制御性グラミアンや段階形(staircase form)への変換を用います。本ツールは概念理解のための2次系なのでこの問題は表面化しませんが、実システムでは「ランク=n と出たから可制御」と単純に信じず、条件数まで確認することが重要です。

使い方ガイド

  1. システム行列 A の4つの要素(a11, a12, a21, a22)をスライダーまたは数値入力で設定します。例:a11=0, a12=1, a21=-2, a22=-3
  2. 入力ベクトル B の2つの要素(b1, b2)を設定します。例:b1=0, b2=1
  3. シミュレーターが可制御行列 𝒞=[B AB] を自動計算し、行列式・ランク・可制御判定をリアルタイムで表示します。|det(𝒞)|≠0 なら可制御、=0 なら不可制御です

具体的な計算例

DCモーター制御系(a11=0, a12=1, a21=-10, a22=-5, b1=0, b2=1)の場合:可制御行列は [0 1; 1 -5]、det(𝒞)=-1、rank(𝒞)=2 となり完全可制御です。一方、a21=0, a22=-5 に変更すると [0 1; 1 0]、det(𝒞)=-1 で可制御ですが、b1=1, b2=0 に変えると [1 0; 0 -5]、det(𝒞)=-5 となります。直列RLCフィルタ(a11=0, a12=1, a21=-1, a22=-2, b1=0, b2=1)では det(𝒞)=-1(可制御)ですが、両入力が同じ向きなら det(𝒞)=0(不可制御)となります

実務での注意点

  1. 可制御性は状態フィードバック設計の前提条件です。det(𝒞) が数値計算で10^-10 以下なら、浮動小数点誤差を考慮し行列ランクで判定してください
  2. 航空機姿勢制御など多変数システムでは、単一入力では不可制御になる場合があります。入力ベクトル B の方向を変えて試しましょう
  3. |det(𝒞)| の値が小さいと可制御性は存在しますが、制御ゲインが非常に大きくなり実装困難です。制御工学的には |det(𝒞)|>0.5 が目安です