Func void main()
{
Matrix A, B, Q, R, P; // 局所変数の宣言
Matrix CRiccati(); // 関数の宣言
05:
read A, B, Q, R; // 行列エディタを起動
P = CRiccati(A, B, Q, R); // CRiccati()を呼ぶ
print P; // Pを表示
}
10:
Func Matrix CRiccati(A, B, Q, R)
Matrix A, B, Q, R;
{
Integer n;
15: Matrix H, U, V, vec, P;
n = Rows(A);
H = [[ A , -B*R‾*B#] // ハミルトン行列
[-Q , -A# ]];
20:
vec = eigvec(H); // H の固有ベクトル
U = vec( 1:n, n+1:2*n); // 安定な固有値に対応
V = vec(n+1:2*n, n+1:2*n); // する固有ベクトルを
// 取り出す
25: if (isreal(A) && isreal(B) &&
isreal(Q) && isreal(R)) {
P = Re(V*U‾);
} else {
P = V*U‾;
30: }
return P;
}