Func void main()
{
Matrix A, B, C, G; // 変数の宣言
Matrix Faddeev();
05:
read A, B, C; // 行列の読み込み
G = Faddeev(A, B, C); // Faddeev()を呼ぶ
print G; // G を表示
}
10:
Func Matrix Faddeev(A, B, C)
Matrix A, B, C;
{
Matrix Gamma, N;
15: Polynomial s, ch;
Integer i, n;
s = $; // 多項式の変数
n = Rows(A); // システムの次数
20:
Gamma = Z(n,A);
ch = Polynomial(Z(1,n+1));
// 特性多項式
ch(n) = 1.0; // 最高次の係数は 1
25:
Gamma(n-1,A) = I(n);
ch(n-1) = - trace(A);
for (i = n-2; i >= 0; i--) {
30: Gamma(i,A) = A*Gamma(i+1,A) + ch(i+1)*I(n);
ch(i) = - trace(A*Gamma(i,A))/(n - i);
}
N = Z(Rows(C), Cols(B));
35: for (i = 0; i < n; i++) {
N = N + C*Gamma(i,A)*B * s^i;
}
return N/ch; // 伝達関数を返す
40:}