Tf2tfm.java

/*
 * $Id: Tf2tfm.java,v 1.19 2008/02/03 06:10:59 koga Exp $
 *
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.control;

import org.mklab.nfc.matrix.AnyRealPolynomialMatrix;
import org.mklab.nfc.matrix.AnyRealRationalPolynomialMatrix;
import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.DoublePolynomialMatrix;
import org.mklab.nfc.matrix.DoubleRationalPolynomialMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.AnyRealPolynomial;
import org.mklab.nfc.scalar.AnyRealRationalPolynomial;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.DoublePolynomial;
import org.mklab.nfc.scalar.DoubleRationalPolynomial;
import org.mklab.nfc.scalar.RealNumericalScalar;
import org.mklab.tool.matrix.Simplify;


/**
 * 伝達関数(係数からなる行列)から伝達関数行列(有理多項式行列)に変換するクラスです。
 * 
 * <p>Transfer function to transfer function matrix conversion
 * 
 * @author koga
 * @version $Revision: 1.19 $
 * @see org.mklab.tool.control.Tf2tfn
 * @see org.mklab.tool.control.Tf2ss
 * @see org.mklab.tool.control.Tf2zp
 * @see org.mklab.tool.control.Tfm2tf
 */
public class Tf2tfm {

  /**
   * 1入力多出力システム
   * 
   * <pre><code> NUM(s) G(s) = -------- den(s) </code></pre>
   * 
   * の伝達関数行列を求めます。生成されるシステムを簡単化します。 伝達関数行列<code>G(s)</code>の全ての有理多項式成分は共通の分母をもつ。
   * 
   * @param numerator 伝達関数の分子多項式の係数
   * @param denominator 伝達関数の分母多項式の係数
   * @return 伝達関数行列 (transfer function matrix)
   */
  public static DoubleRationalPolynomialMatrix tf2tfm(DoubleMatrix numerator, DoubleMatrix denominator) {
    return tf2tfm(numerator, denominator, true);
  }

  /**
   * 1入力多出力システム
   * 
   * <pre><code> NUM(s) G(s) = -------- den(s) </code></pre>
   * 
   * の伝達関数行列を求めます。 伝達関数行列<code>G(s)</code>の全ての有理多項式成分は共通の分母をもつ。
   * 
   * @param numerator 伝達関数の分子多項式の係数
   * @param denominator 伝達関数の分母多項式の係数
   * @param simplify 生成されるシステムを簡単化するかの真偽
   * @return 伝達関数行列 (transfer function matrix)
   */
  public static DoubleRationalPolynomialMatrix tf2tfm(DoubleMatrix numerator, DoubleMatrix denominator, boolean simplify) {
    int outputSize = numerator.getRowSize();
    DoublePolynomial dd = new DoublePolynomial(denominator);
    dd.simplify();

    DoublePolynomialMatrix N = new DoublePolynomialMatrix(outputSize, 1);
    for (int i = 1; i <= outputSize; i++) {
      DoublePolynomial nn = new DoublePolynomial(numerator.getRowVector(i));
      nn.simplify();
      N.setElement(i, 1, nn);
    }
    DoubleRationalPolynomialMatrix G = new DoubleRationalPolynomialMatrix(N).divide(new DoubleRationalPolynomial(dd));
    if (simplify) {
      G = Simplify.simplify(G);
    }
    return G;
  }
  
  /**
   * 1入力多出力システム
   * 
   * <pre><code> NUM(s) G(s) = -------- den(s) </code></pre>
   * 
   * の伝達関数行列を求めます。 伝達関数行列<code>G(s)</code>の全ての有理多項式成分は共通の分母をもつ。
   * 
   * @param numerator 伝達関数の分子多項式の係数
   * @param denominator 伝達関数の分母多項式の係数
   * @param simplify 生成されるシステムを簡単化するかの真偽
   * @param tolerance 許容誤差
   * @return 伝達関数行列 (transfer function matrix)
   */
  public static DoubleRationalPolynomialMatrix tf2tfm(DoubleMatrix numerator, DoubleMatrix denominator, boolean simplify, double tolerance) {
    int outputSize = numerator.getRowSize();
    DoublePolynomial dd = new DoublePolynomial(denominator);
    dd.simplify(tolerance);

    DoublePolynomialMatrix N = new DoublePolynomialMatrix(outputSize, 1);
    for (int i = 1; i <= outputSize; i++) {
      DoublePolynomial nn = new DoublePolynomial(numerator.getRowVector(i));
      nn.simplify(tolerance);
      N.setElement(i, 1, nn);
    }
    DoubleRationalPolynomialMatrix G = new DoubleRationalPolynomialMatrix(N).divide(new DoubleRationalPolynomial(dd));
    if (simplify) {
      G = Simplify.simplify(G, tolerance);
    }
    return G;
  }

  /**
   * 1入力多出力システム
   * 
   * <pre><code> NUM(s) G(s) = -------- den(s) </code></pre>
   * 
   * の伝達関数行列を求めます。 伝達関数行列<code>G(s)</code>の全ての有理多項式成分は共通の分母をもつ。
   * 
   * @param numerator 伝達関数の分子多項式の係数
   * @param denominator 伝達関数の分母多項式の係数
   * @param simplify 生成されるシステムを簡単化するかの真偽
   * @return 伝達関数行列 (transfer function matrix)
   * @param <RS> type of real scalar
   * @param <RM> type of real matrix
   * @param <CS> type of complex scalar
   * @param <CM> type of complex matrix
   */
  public static <RS extends RealNumericalScalar<RS, RM, CS, CM>, RM extends RealNumericalMatrix<RS, RM, CS, CM>, CS extends ComplexNumericalScalar<RS, RM, CS, CM>, CM extends ComplexNumericalMatrix<RS, RM, CS, CM>> AnyRealRationalPolynomialMatrix<RS, RM, CS, CM> tf2tfm(
      RM numerator, RM denominator, boolean simplify) {
    int outputSize = numerator.getRowSize();
    AnyRealPolynomial<RS, RM, CS, CM> dd = new AnyRealPolynomial<>(denominator);
    dd.simplify();

    AnyRealPolynomialMatrix<RS, RM, CS, CM> N = new AnyRealPolynomialMatrix<>(outputSize, 1, dd.createArray(outputSize, 1));
    for (int i = 1; i <= outputSize; i++) {
      AnyRealPolynomial<RS, RM, CS, CM> nn = new AnyRealPolynomial<>(numerator.getRowVector(i));
      nn.simplify();
      N.setElement(i, 1, nn);
    }
    AnyRealRationalPolynomialMatrix<RS, RM, CS, CM> G = N.toRational().divide(new AnyRealRationalPolynomial<>(dd));
    if (simplify) {
      G = Simplify.simplify(G);
    }
    return G;
  }

}