行列方程式 - シルベスター方程式とリャプノフ方程式
行列を未知数とする方程式を行列方程式と呼びます。 のような単純な形であれば で解けますが、未知行列が複数の行列に挟まれた形になると話が複雑になります。ここではシルベスター方程式とリャプノフ方程式という代表的な 2 つの行列方程式を扱います。
シルベスター方程式
シルベスター方程式は
の形をした行列方程式です。 は 、 は 、 は の既知の行列であり、 は の未知行列です。未知行列 が と の両方に挟まれている点が特徴的で、 について単純に因数分解できません。
この方程式は 1884 年にジェームズ・ジョゼフ・シルベスターによって研究されました。制御理論や安定性解析など、工学的な応用が広いことで知られています。
解の存在条件
シルベスター方程式が任意の に対して一意な解を持つための必要十分条件は、 と が共通の固有値を持たないことです。すなわち
が成り立つことです。ここで は固有値の集合(スペクトル)を表します。同じことですが、 の固有値 と の固有値 に対して
が成り立てば一意な解が存在します。
この条件はクロネッカー積を用いて理解できます。
と書き、行列 の各成分にブロックとして を掛けたものを並べて得られる大きな行列。
なぜこの条件になるのかを理解するために、シルベスター方程式をベクトル化して考えます。 を行列 の列を縦に積んだベクトルとすると、クロネッカー積の性質
を使って は
と書き直せます。これは の通常の連立一次方程式です。この係数行列 が正則であるための条件が、 と の固有値が重ならないことに対応しています。 の固有値は の固有値を 回繰り返したもの、 の固有値は の固有値を 回繰り返したものであり、和の固有値は の形になるためです。
小さな例
の具体例で計算してみます。
の固有値は 、 の固有値は であり、共通部分はないため一意な解が存在します。
とおいて を成分ごとに書き下すと
各成分を比較すると
となり
が得られます。 と が対角行列の場合は各成分が独立に解けるため、 という形になります。 であれば各成分を割り算で求められるわけです。
リャプノフ方程式
リャプノフ方程式はシルベスター方程式の特殊な場合であり、次の形をしています。
シルベスター方程式で としたものです。 が対称行列であれば解 も対称行列になります。
。 と は一般には異なる行列。
。 という特殊な場合。制御理論での安定性解析に現れる。
リャプノフ方程式の解の存在条件はシルベスター方程式の条件から導かれます。 なので であり、 の固有値は の固有値と同じです。したがって条件は
です(実行列の場合は )。特に、 のすべての固有値の実部が負(安定行列)であれば、この条件は自動的に満たされます。
連続リャプノフ方程式と安定性
制御理論では、線形システム の安定性を判定するためにリャプノフ方程式が使われます。具体的には次の定理が成り立ちます。
のすべての固有値が負の実部を持つことと、任意の正定値対称行列 に対して
を満たす正定値対称行列 が存在することは同値です。
のすべての固有値の実部が負。
が正定値解 を持つかどうかで安定性を判定できる。固有値を直接計算しなくてもよい。
この定理が有用な理由は、大きな行列の固有値を計算するのは数値的に不安定になりうるのに対して、リャプノフ方程式を解くことは数値的に安定なアルゴリズムが存在するからです。
数値解法
シルベスター方程式を数値的に解く標準的な方法はバートレス・スチュアート(Bartels–Stewart)アルゴリズムです。手順は次のとおりです。
と をシュール分解する
変換されたシルベスター方程式を後退代入で解く
得られた解を逆変換する
, (, は上三角行列、, は直交行列)とシュール分解すると、元の方程式は
の形に帰着されます(, )。 と が上三角行列であるため、この方程式は後退代入で列ごとに解けます。計算量は です。
Python では SciPy の scipy.linalg.solve_sylvester で直接解くことができます。
import numpy as np
from scipy.linalg import solve_sylvester
A = np.array([[1, 0], [0, 2]])
B = np.array([[3, 0], [0, 4]])
C = np.array([[4, 5], [6, 12]])
X = solve_sylvester(A, B, C)
print(X)
リャプノフ方程式には scipy.linalg.solve_continuous_lyapunov が用意されています。
from scipy.linalg import solve_continuous_lyapunov
A = np.array([[-1, 0], [0, -2]])
Q = np.eye(2)
P = solve_continuous_lyapunov(A, -Q)
print(P)
離散リャプノフ方程式
連続時間のリャプノフ方程式とは別に、離散時間システム に対応する離散リャプノフ方程式
も存在します。この方程式の解が正定値になるための条件は、 のすべての固有値の絶対値が 1 未満()であることです。連続時間では「実部が負」、離散時間では「絶対値が 1 未満」という安定性条件の違いに対応しています。
シルベスター方程式 が任意の に対して一意な解を持つ条件はどれですか?
- と がともに正則
- と が可換()
- と が共通の固有値を持たない
線形システム が安定であるとき、リャプノフ方程式 ( は正定値)の解 はどのような行列ですか?
- 直交行列
- べき等行列
- 正定値対称行列
安定な に対して正定値な を与えると、リャプノフ方程式の解 は正定値対称行列になります。
ベクトル化すると係数行列の固有値が λi+μj の形になり、これがすべて 0 でないことが正則性の条件です。