Dgramian.java

/*
 * $Id: Dgramian.java,v 1.12 2008/02/28 00:42:50 koga Exp $
 *
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.control;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.scalar.DoubleNumber;
import org.mklab.nfc.svd.SingularValueDecomposition;


/**
 * 離散時間系の可制御性グラミアンと可観測グラミアンを求めるクラスです。
 * 
 * <p>Discrete-time controllability and observability
 * 
 * @author koga
 * @version $Revision: 1.12 $
 * @see org.mklab.tool.control.Gramian
 */
public class Dgramian {

  /**
   * <code>dgramian(A,B)</code>は、可制御性グラミアンを返します。
   * 
   * <p><code>dgramian(A#,C#)</code>は、可観測性グラミアンを返します。
   * 
   * @param A 離散時間系のシステム行列
   * @param B 離散時間系の入力行列
   * @return グラミアン (gramian)
   */
  public static DoubleMatrix dgramian(DoubleMatrix A, DoubleMatrix B) {
    String message;
    if ((message = Abcdchk.abcdchk(A, B)).length() > 0) {
      throw new IllegalArgumentException(message);
    }

    SingularValueDecomposition<DoubleNumber,DoubleMatrix> tmp = B.singularValueDecompose();
    DoubleMatrix U = tmp.getU();
    DoubleMatrix D = tmp.getD();
    // DoubleMatrix V = tmp[2];
    DoubleMatrix P = Dlyap.dlyap(U.conjugateTranspose().multiply(A).multiply(U), D.multiply(D.conjugateTranspose()));
    DoubleMatrix G = U.multiply(P).multiply(U.conjugateTranspose());
    G = G.add(G.conjugateTranspose()).divide(2);
    return G;
  }

}