Func void main()
{
Matrix A, B, C, Q, R, P, PP;
Matrix DRiccati();
05:
A = [[0 1][-3, 4]]; // システム行列
B = [0 1]';
C = [-2, 1];
Q = C'*C;
10: R = I(1);
P = DRiccati(A, B, Q, R); // DRiccati()を呼ぶ
print P; // Pを表示
}
15:
Func Matrix DRiccati(A, B, Q, R)
Matrix A, B, Q, R;
{
Matrix P, PP;
20: Real eps;
P = PP = I(A); // 解 P の初期値
eps = 1.0E-7;
25: // 解が収束するまで繰り返す
while (frobnorm(P - PP) > eps) {
PP = P;
P = Q + A'*P*A - A'*P*B*(R + B'*P*B)‾ * B'*P*A;
P = (P' + P)/2.0; // P の対称性を回復
30: }
return P; // 解 P を返す
}