DoubleLinearSystemFactory.java

/*
 * Created on 2009/07/01
 * Copyright (C) 2009 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.DoubleRationalPolynomialMatrix;
import org.mklab.nfc.matrix.IntMatrix;
import org.mklab.nfc.scalar.DoubleRationalPolynomial;


/**
 * 線形システムのインスタンスを生成するFactoryクラスです.
 * 
 * @author Anan
 * @version $Revision$, 2009/08/30
 */
public class DoubleLinearSystemFactory {

  /**
   * 状態空間表現の係数行列から線形システムを生成します。
   * 
   * @param a システム行列
   * @param b 入力行列
   * @param c 出力行列
   * @param d ゲイン行列
   * @return DoubleProperLinearSystemのインスタンス
   */
  public static DoubleProperLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d) {
    return new DoubleProperLinearSystem(a, b, c, d);
  }

  /**
   * 1入力1出力システムの伝達関数から線形システムを生成します。
   * 
   * @param transferFunction 1入力1出力システムの伝達関数(有理多項式)
   * @return DoubleProperLinearSystemのインスタンス
   */
  public static DoubleLinearSystem createLinearSystem(final DoubleRationalPolynomial transferFunction) {
    final boolean proper = transferFunction.getNumeratorDegree() <= transferFunction.getDenominatorDegree();
    if (proper) {
      return new DoubleProperLinearSystem(transferFunction);
    }
    return new DoubleImproperLinearSystem(transferFunction);
  }

  /**
   * 伝達関数行列から線形システムを生成します。
   * 
   * @param transferFunctionMatrix 伝達関数行列(有理多項式行列)
   * @return DoubleProperLinearSystemのインスタンス
   */
  public static DoubleLinearSystem createLinearSystem(final DoubleRationalPolynomialMatrix transferFunctionMatrix) {
    boolean proper = true;
    for (int row = 1; row <= transferFunctionMatrix.getRowSize(); row++) {
      for (int column = 1; column <= transferFunctionMatrix.getColumnSize(); column++) {
        final DoubleRationalPolynomial function = transferFunctionMatrix.getElement(row, column);
        if (function.getNumeratorDegree() > function.getDenominatorDegree()) {
          proper = false;
          break;
        }
      }
    }

    if (proper) {
      return new DoubleProperLinearSystem(transferFunctionMatrix);
    }
    return new DoubleImproperLinearSystem(transferFunctionMatrix);
  }

  /**
   * 係数行列から線形システムを生成します。
   * 
   * @param a 状態行列
   * @param b ゲイン行列
   * @param c 出力行列
   * @param d ゲイン行列
   * @param e ディスクリプター行列
   * @return LinearSystemのインスタンス
   */
  public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e) {
    if (e.isUnit() || e.isEmpty() || e.isFullRank()) {
      return new DoubleProperLinearSystem(a, b, c, d, e);
    }
    return new DoubleImproperLinearSystem(a, b, c, d, e);
  }

  /**
   * 係数行列から線形システムを生成します。
   * 
   * @param a 状態行列
   * @param b ゲイン行列
   * @param c 出力行列
   * @param d ゲイン行列
   * @param e ディスクリプター行列
   * @param index 指数
   * @return LinearSystemのインスタンス
   */
  public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e, final IntMatrix index) {
    return new DoubleImproperLinearSystem(a, b, c, d, e, index);
  }

  /**
   * 係数行列からisDescriptorFormに応じて,ディスクリプタ形式、または、状態空間表現で線形システムを生成します.
   * 
   * @param a 状態行列
   * @param b ゲイン行列
   * @param c 出力行列
   * @param d ゲイン行列
   * @param e ディスクリプタ行列
   * @param isDescriptorForm ディスクリプタ形式で求めるならばtrue
   * @return isDescriptrFormがtrueならばDescriptorFormのImproperSystemのインスタンス,falseならばLinearSystemのインスタンス
   */
  public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e, final boolean isDescriptorForm) {
    if (isDescriptorForm) {
      return new DoubleImproperLinearSystem(a, b, c, d, e);
    }
    return createLinearSystem(a, b, c, d, e);
  }


  /**
   * 係数行列からisDescriptorFormに応じて,ディスクリプタ形式、または、状態空間表現で線形システムを生成します.
   * 
   * @param a 状態行列
   * @param b ゲイン行列
   * @param c 出力行列
   * @param d ゲイン行列
   * @param e ディスクリプタ行列
   * @param index 指数
   * @param isDescriptorForm ディスクリプタ形式で求めるならばtrue
   * @return isDescriptrFormがtrueならばDescriptorFormのImproperSystemのインスタンス,falseならばLinearSystemのインスタンス
   */
  public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e, final IntMatrix index, final boolean isDescriptorForm) {
    if (isDescriptorForm) {
      return new DoubleImproperLinearSystem(a, b, c, d, e, index);
    }
    return createLinearSystem(a, b, c, d, e, index);
  }

  /**
   * 定数行列から線形システム(定数システム)を生成します。
   * 
   * @param gain 定数行列
   * @return 定数システム
   */
  public static DoubleProperLinearSystem createConstant(final DoubleMatrix gain) {
    final DoubleMatrix a = gain.createZero(0, 0);
    final DoubleMatrix b = gain.createZero(0, gain.getColumnSize());
    final DoubleMatrix c = gain.createZero(gain.getRowSize(), 0);
    final DoubleMatrix e = gain.createUnit();
    return (DoubleProperLinearSystem)createLinearSystem(a, b, c, gain, e);
  }
}