Ss2tfm.java
/*
* $Id: Ss2tfm.java,v 1.17 2008/03/24 14:57:16 koga Exp $
*
* Copyright (C) 2004 Koga Laboratory. All rights reserved.
*/
package org.mklab.tool.control;
import java.util.List;
import org.mklab.nfc.matrix.AnyRealRationalPolynomialMatrix;
import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.DoubleRationalPolynomialMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.AnyRealPolynomial;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
/**
* 状態空間表現から伝達関数行列(有理多項式行列)に変換するクラスです。
*
* <p>State-space to transfer function matrix conversion
*
* @author koga
* @version $Revision: 1.17 $
* @see org.mklab.tool.control.Ss2tf
* @see org.mklab.tool.control.Ss2tfn
* @see org.mklab.tool.control.Ss2zp
* @see org.mklab.tool.control.Tfm2ss
*/
public class Ss2tfm {
/**
* 状態空間表現されたシステム
*
* <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
*
* の<code>i</code>番目の入力から出力までの伝達関数行列
*
* <pre><code> -1 G(s) = C(sI-A) B(:,i) + D(:,i) </code></pre>
*
* を求めます。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param inputNumber 入力番号
* @return 伝達関数行列 (transfer function matrix)
*/
public static DoubleRationalPolynomialMatrix ss2tfm(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D, int inputNumber) {
boolean simplify = true;
return ss2tfm(A, B, C, D, inputNumber, simplify);
}
/**
* 状態空間表現されたシステム
*
* <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
*
* の<code>i</code>番目の入力から出力までの伝達関数行列
*
* <pre><code> -1 G(s) = C(sI-A) B(:,i) + D(:,i) </code></pre>
*
* を求めます。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param inputNumber 入力番号
* @param simplify 生成されるシステムを簡単化するならばtrue、そうでなければfalse
* @return 伝達関数行列 (transfer function matrix)
*/
private static DoubleRationalPolynomialMatrix ss2tfm(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D, int inputNumber, boolean simplify) {
String message;
if ((message = Abcdchk.abcdchk(A, B, C, D)).length() > 0) {
throw new RuntimeException(message);
}
List<DoubleMatrix> numeratorDenominator = Ss2tf.ss2tf(A, B, C, D, inputNumber);
DoubleMatrix numerator = numeratorDenominator.get(0);
DoubleMatrix denominator = numeratorDenominator.get(1);
return Tf2tfm.tf2tfm(numerator, denominator, simplify);
}
/**
* 状態空間表現が
*
* <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
*
* であるシステムの伝達関数行列
*
* <pre><code> -1 G(s) = C(sI-A) B + D </code></pre>
*
* を有理多項式行列をして返します。生成されるシステムを簡単化します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @return 伝達関数行列 (transfer function matrix)
*/
public static DoubleRationalPolynomialMatrix ss2tfm(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D) {
return ss2tfm(A, B, C, D, true);
}
/**
* 状態空間表現が
*
* <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
*
* であるシステムの伝達関数行列
*
* <pre><code> -1 G(s) = C(sI-A) B + D </code></pre>
*
* を有理多項式行列として返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param simplify 生成されるシステムを簡単化するならばtrue、そうでなければfalse
* @return 伝達関数行列 (transfer function matrix)
*/
public static DoubleRationalPolynomialMatrix ss2tfm(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D, boolean simplify) {
String message;
if ((message = Abcdchk.abcdchk(A, B, C, D)).length() > 0) {
throw new RuntimeException(message);
}
int outputSize = D.getRowSize();
int inputSize = D.getColumnSize();
DoubleRationalPolynomialMatrix G = new DoubleRationalPolynomialMatrix(outputSize, inputSize);
for (int j = 1; j <= inputSize; j++) {
List<DoubleMatrix> tmp = Ss2tf.ss2tf(A, B, C, D, j);
DoubleMatrix numerators = tmp.get(0);
DoubleMatrix denominator = tmp.get(1);
G.setSubMatrix(1, G.getRowSize(), j, j, Tf2tfm.tf2tfm(numerators, denominator, simplify));
}
return G;
}
/**
* 状態空間表現が
*
* <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
*
* であるシステムの伝達関数行列
*
* <pre><code> -1 G(s) = C(sI-A) B + D </code></pre>
*
* を有理多項式行列として返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param simplify 生成されるシステムを簡単化するならばtrue、そうでなければfalse
* @param tolerance 許容誤差
* @return 伝達関数行列 (transfer function matrix)
*/
public static DoubleRationalPolynomialMatrix ss2tfm(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D, boolean simplify, double tolerance) {
String message;
if ((message = Abcdchk.abcdchk(A, B, C, D)).length() > 0) {
throw new RuntimeException(message);
}
int outputSize = D.getRowSize();
int inputSize = D.getColumnSize();
DoubleRationalPolynomialMatrix G = new DoubleRationalPolynomialMatrix(outputSize, inputSize);
for (int j = 1; j <= inputSize; j++) {
List<DoubleMatrix> tmp = Ss2tf.ss2tf(A, B, C, D, j);
DoubleMatrix numerators = tmp.get(0);
DoubleMatrix denominator = tmp.get(1);
G.setSubMatrix(1, G.getRowSize(), j, j, Tf2tfm.tf2tfm(numerators, denominator, simplify, tolerance));
}
return G;
}
/**
* 状態空間表現が
*
* <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
*
* であるシステムの伝達関数行列
*
* <pre><code> -1 G(s) = C(sI-A) B + D </code></pre>
*
* を有理多項式行列をして返します。生成されるシステムを簡単化します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @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> ss2tfm(
RM A, RM B, RM C, RM D) {
return ss2tfm(A, B, C, D, true);
}
/**
* 状態空間表現が
*
* <pre><code> . x = Ax + Bu y = Cx + Du </code></pre>
*
* であるシステムの伝達関数行列
*
* <pre><code> -1 G(s) = C(sI-A) B + D </code></pre>
*
* を有理多項式行列として返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param simplify 生成されるシステムを簡単化するならばtrue、そうでなければfalse
* @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> ss2tfm(
RM A, RM B, RM C, RM D, boolean simplify) {
String message;
if ((message = Abcdchk.abcdchk(A, B, C, D)).length() > 0) {
throw new RuntimeException(message);
}
int outputSize = D.getRowSize();
int inputSize = D.getColumnSize();
AnyRealPolynomial<RS, RM, CS, CM> unit = new AnyRealPolynomial<>(A);
AnyRealRationalPolynomialMatrix<RS, RM, CS, CM> G = new AnyRealRationalPolynomialMatrix<>(unit.toRational().createArray(outputSize, inputSize));
for (int j = 1; j <= inputSize; j++) {
List<RM> tmp = Ss2tf.ss2tf(A, B, C, D, j);
RM numerators = tmp.get(0);
RM denominator = tmp.get(1);
G.setSubMatrix(1, G.getRowSize(), j, j, Tf2tfm.tf2tfm(numerators, denominator, simplify));
}
return G;
}
}