DoubleLinearSystemFactory.java
/*
* Created on 2009/07/01
* Copyright (C) 2009 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.tool.control;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.DoubleRationalPolynomialMatrix;
import org.mklab.nfc.matrix.IntMatrix;
import org.mklab.nfc.scalar.DoubleRationalPolynomial;
/**
* 線形システムのインスタンスを生成するFactoryクラスです.
*
* @author Anan
* @version $Revision$, 2009/08/30
*/
public class DoubleLinearSystemFactory {
/**
* 状態空間表現の係数行列から線形システムを生成します。
*
* @param a システム行列
* @param b 入力行列
* @param c 出力行列
* @param d ゲイン行列
* @return DoubleProperLinearSystemのインスタンス
*/
public static DoubleProperLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d) {
return new DoubleProperLinearSystem(a, b, c, d);
}
/**
* 1入力1出力システムの伝達関数から線形システムを生成します。
*
* @param transferFunction 1入力1出力システムの伝達関数(有理多項式)
* @return DoubleProperLinearSystemのインスタンス
*/
public static DoubleLinearSystem createLinearSystem(final DoubleRationalPolynomial transferFunction) {
final boolean proper = transferFunction.getNumeratorDegree() <= transferFunction.getDenominatorDegree();
if (proper) {
return new DoubleProperLinearSystem(transferFunction);
}
return new DoubleImproperLinearSystem(transferFunction);
}
/**
* 伝達関数行列から線形システムを生成します。
*
* @param transferFunctionMatrix 伝達関数行列(有理多項式行列)
* @return DoubleProperLinearSystemのインスタンス
*/
public static DoubleLinearSystem createLinearSystem(final DoubleRationalPolynomialMatrix transferFunctionMatrix) {
boolean proper = true;
for (int row = 1; row <= transferFunctionMatrix.getRowSize(); row++) {
for (int column = 1; column <= transferFunctionMatrix.getColumnSize(); column++) {
final DoubleRationalPolynomial function = transferFunctionMatrix.getElement(row, column);
if (function.getNumeratorDegree() > function.getDenominatorDegree()) {
proper = false;
break;
}
}
}
if (proper) {
return new DoubleProperLinearSystem(transferFunctionMatrix);
}
return new DoubleImproperLinearSystem(transferFunctionMatrix);
}
/**
* 係数行列から線形システムを生成します。
*
* @param a 状態行列
* @param b ゲイン行列
* @param c 出力行列
* @param d ゲイン行列
* @param e ディスクリプター行列
* @return LinearSystemのインスタンス
*/
public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e) {
if (e.isUnit() || e.isEmpty() || e.isFullRank()) {
return new DoubleProperLinearSystem(a, b, c, d, e);
}
return new DoubleImproperLinearSystem(a, b, c, d, e);
}
/**
* 係数行列から線形システムを生成します。
*
* @param a 状態行列
* @param b ゲイン行列
* @param c 出力行列
* @param d ゲイン行列
* @param e ディスクリプター行列
* @param index 指数
* @return LinearSystemのインスタンス
*/
public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e, final IntMatrix index) {
return new DoubleImproperLinearSystem(a, b, c, d, e, index);
}
/**
* 係数行列からisDescriptorFormに応じて,ディスクリプタ形式、または、状態空間表現で線形システムを生成します.
*
* @param a 状態行列
* @param b ゲイン行列
* @param c 出力行列
* @param d ゲイン行列
* @param e ディスクリプタ行列
* @param isDescriptorForm ディスクリプタ形式で求めるならばtrue
* @return isDescriptrFormがtrueならばDescriptorFormのImproperSystemのインスタンス,falseならばLinearSystemのインスタンス
*/
public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e, final boolean isDescriptorForm) {
if (isDescriptorForm) {
return new DoubleImproperLinearSystem(a, b, c, d, e);
}
return createLinearSystem(a, b, c, d, e);
}
/**
* 係数行列からisDescriptorFormに応じて,ディスクリプタ形式、または、状態空間表現で線形システムを生成します.
*
* @param a 状態行列
* @param b ゲイン行列
* @param c 出力行列
* @param d ゲイン行列
* @param e ディスクリプタ行列
* @param index 指数
* @param isDescriptorForm ディスクリプタ形式で求めるならばtrue
* @return isDescriptrFormがtrueならばDescriptorFormのImproperSystemのインスタンス,falseならばLinearSystemのインスタンス
*/
public static DoubleLinearSystem createLinearSystem(final DoubleMatrix a, final DoubleMatrix b, final DoubleMatrix c, final DoubleMatrix d, final DoubleMatrix e, final IntMatrix index, final boolean isDescriptorForm) {
if (isDescriptorForm) {
return new DoubleImproperLinearSystem(a, b, c, d, e, index);
}
return createLinearSystem(a, b, c, d, e, index);
}
/**
* 定数行列から線形システム(定数システム)を生成します。
*
* @param gain 定数行列
* @return 定数システム
*/
public static DoubleProperLinearSystem createConstant(final DoubleMatrix gain) {
final DoubleMatrix a = gain.createZero(0, 0);
final DoubleMatrix b = gain.createZero(0, gain.getColumnSize());
final DoubleMatrix c = gain.createZero(gain.getRowSize(), 0);
final DoubleMatrix e = gain.createUnit();
return (DoubleProperLinearSystem)createLinearSystem(a, b, c, gain, e);
}
}