Tfn2ss.java

/*
 * $Id: Tfn2ss.java,v 1.17 2008/03/24 23:45:43 koga Exp $
 *
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.control;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.AnyRealRationalPolynomial;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.DoubleRationalPolynomial;
import org.mklab.nfc.scalar.RealNumericalScalar;


/**
 * 伝達関数(有理多項式)から状態空間表現に変換するクラスです。
 * 
 * <p> Transfer function to state-space conversion
 * 
 * @author koga
 * @version $Revision: 1.17 $
 * @see org.mklab.tool.control.Tfn2tf
 * @see org.mklab.tool.control.Tfn2tfm
 * @see org.mklab.tool.control.Tfn2zp
 * @see org.mklab.tool.control.Ss2tfn
 */
public class Tfn2ss {

  /**
   * 伝達関数が<code>g</code>であるシステムの状態空間表現
   * 
   * <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
   * 
   * を求めます。 係数行列<code>A,B,C,D</code>は、可制御正準形で返されます。
   * 
   * @param g 伝達関数
   * @return {A,B,C,D} (状態空間表現) state space representation
   */
  public static List<DoubleMatrix> tfn2ss(DoubleRationalPolynomial g) {
    DoubleMatrix numerator = g.getNumerator().getCoefficients().flipLeftRight();
    DoubleMatrix denominator = g.getDenominator().getCoefficients().flipLeftRight();
    List<DoubleMatrix> tmp = Tf2ss.tf2ss(numerator, denominator);
    DoubleMatrix A = tmp.get(0);
    DoubleMatrix B = tmp.get(1);
    DoubleMatrix C = tmp.get(2);
    DoubleMatrix D = tmp.get(3);

    return new ArrayList<>(Arrays.asList(new DoubleMatrix[] {A, B, C, D}));
  }

  /**
   * 伝達関数が<code>g</code>であるシステムの状態空間表現
   * 
   * <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
   * 
   * を求めます。 係数行列<code>A,B,C,D</code>は、可制御正準形で返されます。
   * 
   * @param g 伝達関数
   * @return {A,B,C,D} (状態空間表現) state space representation
   * @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>> List<RM> tfn2ss(
      AnyRealRationalPolynomial<RS, RM, CS, CM> g) {
    RM numerator = g.getNumerator().getCoefficients().flipLeftRight();
    RM denominator = g.getDenominator().getCoefficients().flipLeftRight();
    List<RM> tmp = Tf2ss.tf2ss(numerator, denominator);
    RM A = tmp.get(0);
    RM B = tmp.get(1);
    RM C = tmp.get(2);
    RM D = tmp.get(3);

    List<RM> abcd = new ArrayList<>();
    abcd.add(A);
    abcd.add(B);
    abcd.add(C);
    abcd.add(D);
    return abcd;
  }

  // /**
  // * 伝達関数が<code>g</code>であるシステムの状態空間表現
  // *
  // * <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
  // *
  // * を求めます。 係数行列<code>A,B,C,D</code>は、可制御正準形で返されます。
  // *
  // * @param <RPS> 実多項式の型
  // * @param <RPM> 実多項式行列の型
  // * @param <CPS> 複素多項式の型
  // * @param <CPM> 複素多項式行列の型
  // * @param <RRS> 実有理多項式の型
  // * @param <RRM> 実有理多項式行列の型
  // * @param <CRS> 複素有理多項式の型
  // * @param <CRM> 複素有理多項式行列の型
  // * @param <RES> 実係数スカラーの型
  // * @param <REM> 実係数行列の型
  // * @param <CES> 複素係数スカラーの型
  // * @param <CEM> 複素係数行列の型
  // * @param g 伝達関数
  // * @return {A,B,C,D} (状態空間表現) state space representation
  // */
  // public static <RPS extends
  // RealPolynomial<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES,REM,CES,CEM>, RPM extends
  // RealPolynomialMatrix<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES, REM,CES,CEM>, CPS
  // extends ComplexPolynomial<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES, REM, CES,
  // CEM>, CPM extends
  // ComplexPolynomialMatrix<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES,REM,CES,CEM>, RRS
  // extends
  // RealRationalPolynomial<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES,REM,CES,CEM>, RRM
  // extends
  // RealRationalPolynomialMatrix<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES,REM,CES,CEM>,
  // CRS extends
  // ComplexRationalPolynomial<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES,REM,CES,CEM>,
  // CRM extends
  // ComplexRationalPolynomialMatrix<RPS,RPM,CPS,CPM,RRS,RRM,CRS,CRM,RES,REM,CES,CEM>,
  // RES extends RealNumericalScalar<RES,REM,CES,CEM>, REM extends
  // RealNumericalMatrix<RES,REM,CES,CEM>, CES extends
  // ComplexNumericalScalar<RES,REM,CES,CEM>, CEM extends
  // ComplexNumericalMatrix<RES,REM,CES,CEM>> List<REM> tfn2ss(
  // RRS g) {
  // REM numerator = g.getNumerator().getCoefficients().flipLeftRight();
  // REM denominator = g.getDenominator().getCoefficients().flipLeftRight();
  // List<REM> tmp = Tf2ss.tf2ss(numerator, denominator);
  // REM A = tmp.get(0);
  // REM B = tmp.get(1);
  // REM C = tmp.get(2);
  // REM D = tmp.get(3);

  // List<REM> ans = new ArrayList<>();
  // ans.add(A);
  // ans.add(B);
  // ans.add(C);
  // ans.add(D);

  // return ans;
  // }

}