Ss2tfn.java
/*
* $Id: Ss2tfn.java,v 1.11 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.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>State-space to transfer function conversion
*
* @author koga
* @version $Revision: 1.11 $
* @see org.mklab.tool.control.Ss2tf
* @see org.mklab.tool.control.Ss2tfm
* @see org.mklab.tool.control.Ss2zp
* @see org.mklab.tool.control.Tfn2ss
*/
public class Ss2tfn {
/**
* 状態空間表現が
*
* <pre><code>
*
* . x = Ax + Bu y = Cx + Du
*
* </code></pre>
*
* である1入力1出力のシステムの伝達関数
*
* <pre><code>
*
* -1 g(s) = C(sI-A) B + D
*
* </code></pre>
*
* を返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @return 伝達関数 (transfer function)
*/
public static DoubleRationalPolynomial ss2tfn(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D) {
int inputNumber = 1;
int outputNumber = 1;
return ss2tfn(A, B, C, D, inputNumber, outputNumber);
}
/**
* 多入力1出力システムの <code>inputNumber</code> 番目の入力から出力までの伝達関数を返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param inputNumber 入力番号
* @return 伝達関数 (transfer function)
*/
public static DoubleRationalPolynomial ss2tfn(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D, int inputNumber) {
int outputNumber = 1;
return ss2tfn(A, B, C, D, inputNumber, outputNumber);
}
/**
* 多入力多出力システムの <code>inputNumber</code> 番目の入力から <code>outputNumber</code> 番目の出力 までの伝達関数を返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param inputNumber 入力番号
* @param outputNumber 出力番号
* @return 伝達関数 (transfer function)
*/
public static DoubleRationalPolynomial ss2tfn(DoubleMatrix A, DoubleMatrix B, DoubleMatrix C, DoubleMatrix D, int inputNumber, int outputNumber) {
String message;
if ((message = Abcdchk.abcdchk(A, B, C, D)).length() > 0) {
throw new RuntimeException(message);
}
List<DoubleMatrix> numeratorDenominator = Ss2tf.ss2tf(A, B.getColumnVector(inputNumber), C.getRowVector(outputNumber), D.getSubMatrix(outputNumber, outputNumber, inputNumber, inputNumber));
DoubleMatrix numerator = numeratorDenominator.get(0);
DoubleMatrix denominator = numeratorDenominator.get(1);
return Tf2tfn.tf2tfn(numerator, denominator);
}
/**
* 状態空間表現が
*
* <pre><code>
*
* . x = Ax + Bu y = Cx + Du
*
* </code></pre>
*
* である1入力1出力のシステムの伝達関数
*
* <pre><code>
*
* -1 g(s) = C(sI-A) B + D
*
* </code></pre>
*
* を返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @return 伝達関数 (transfer function)
* @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>> AnyRealRationalPolynomial<RS, RM, CS, CM> ss2tfn(
RM A, RM B, RM C, RM D) {
int inputNumber = 1;
int outputNumber = 1;
return ss2tfn(A, B, C, D, inputNumber, outputNumber);
}
/**
* 多入力多出力システムの <code>inputNumber</code> 番目の入力から <code>outputNumber</code> 番目の出力 までの伝達関数を返します。
*
* @param A システム行列
* @param B 入力行列
* @param C 出力行列
* @param D ゲイン行列
* @param inputNumber 入力番号
* @param outputNumber 出力番号
* @return 伝達関数 (transfer function)
* @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>> AnyRealRationalPolynomial<RS, RM, CS, CM> ss2tfn(
RM A, RM B, RM C, RM D, int inputNumber, int outputNumber) {
String message;
if ((message = Abcdchk.abcdchk(A, B, C, D)).length() > 0) {
throw new RuntimeException(message);
}
List<RM> numeratorDenominator = Ss2tf.ss2tf(A, B.getColumnVector(inputNumber), C.getRowVector(outputNumber), D.getSubMatrix(outputNumber, outputNumber, inputNumber, inputNumber));
RM numerator = numeratorDenominator.get(0);
RM denominator = numeratorDenominator.get(1);
return Tf2tfn.tf2tfn(numerator, denominator);
}
}