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;
}
}