BlockPiecewiseSampledDataStaticSystem.java
/*
* Created on 2007/04/11
* Copyright (C) 2007 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.tool.control.system.sampled;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.ode.PiecewiseContinuousAlgebraicSystem;
import org.mklab.nfc.ode.PiecewiseContinuousDiscreteAlgebraicSystem;
import org.mklab.nfc.ode.SolverStopException;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
import org.mklab.tool.control.system.SystemOperator;
/**
* ブロック区分的連続サンプル値静的システムを表わすクラスです。
*
* @author koga
* @version $Revision: 1.9 $, 2007/04/11
* @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 class BlockPiecewiseSampledDataStaticSystem<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>> extends BlockSampledDataStaticSystem<RS,RM,CS,CM> implements PiecewiseContinuousDiscreteAlgebraicSystem<RS,RM,CS,CM> {
/** 区分的連続離散代数システムのリスト */
private List<PiecewiseContinuousDiscreteAlgebraicSystem<RS,RM,CS,CM>> piecewiseContinuousDiscreteAlgebraicSystems = new ArrayList<>();
/** 区分的連続代数システムのリスト */
private List<PiecewiseContinuousAlgebraicSystem<RS,RM,CS,CM>> piecewiseContinuousAlgebraicSystems = new ArrayList<>();
/**
* 新しく生成された<code>BlockPiecewiseSampledDataStaticSystem</code>オブジェクトを初期化します。
*
* @param elements 隣接行列
* @param inputNodes 入力ノード番号のリスト(番号は1から始まる)
* @param outputNodes 出力ノード番号のリスト(番号は1から始まる)
* @param sunit unit of scalar
*/
public BlockPiecewiseSampledDataStaticSystem(SystemOperator<RS,RM,CS,CM>[][] elements, List<Integer> inputNodes, List<Integer> outputNodes, RS sunit) {
super(elements, inputNodes, outputNodes, sunit);
setupPiecewiseContinuousDiscreteSystems();
setupPiecewiseContinuousSystems();
}
/**
* {@inheritDoc}
*/
public RS getDiscontinuousPoint(final RS t1, final RM input1, final RS t2, final RM input2) throws SolverStopException {
outputEquation(t1);
final List<RM> inputsDiscrete1 = getInputsToPiecewiseContinuousDiscreteAlgebraicSystems();
final List<RM> inputsContinuous1 = getInputsToPiecewiseContinuousAlgebraicSystems();
outputEquation(t2);
final List<RM> inputsDiscrete2 = getInputsToPiecewiseContinuousDiscreteAlgebraicSystems();
final List<RM> inputsContinuous2 = getInputsToPiecewiseContinuousAlgebraicSystems();
final List<RS> continuousDiscreteDiscontinuousPoints = getContinuousDiscreteDiscontinuousPoints(t1, inputsDiscrete1, t2, inputsDiscrete2);
final List<RS> continuousDiscontinuousPoints = getContinuousDiscontinuousPoints(t1, inputsContinuous1, t2, inputsContinuous2);
outputEquation(t1);
final List<RS> discontinuousPoints = continuousDiscreteDiscontinuousPoints;
discontinuousPoints.addAll(continuousDiscontinuousPoints);
final RS[] sortedPoints = discontinuousPoints.toArray(this.sunit.createArray(discontinuousPoints.size()));
Arrays.sort(sortedPoints);
return sortedPoints[0];
}
/**
* {@inheritDoc}
*/
public List<Integer> getPiece(final RS t, final RM u) throws SolverStopException {
calcNodeValue(t);
final List<Integer> continuousDiscretePieces = getContinuousDiscretePieces(t);
final List<Integer> continuousPieces = getContinuousPieces(t);
final List<Integer> pieces = continuousDiscretePieces;
pieces.addAll(continuousPieces);
return pieces;
}
/**
* 連続離散システムの区分の番号のリストを返します。
*
* @param t 時刻
*
* @return 連続離散システムの区分の番号のリスト
* @exception SolverStopException ソルバーが停止された場合
*/
private List<Integer> getContinuousDiscretePieces(final RS t) throws SolverStopException {
final List<Integer> pieces = new ArrayList<>();
for (PiecewiseContinuousDiscreteAlgebraicSystem<RS,RM,CS,CM> system : this.piecewiseContinuousDiscreteAlgebraicSystems) {
pieces.addAll(system.getPiece(t, getInputNodeValueOf((SystemOperator<RS,RM,CS,CM>)system)));
}
return pieces;
}
/**
* 連続システムの区分の番号のリストを返します。
*
* @param t 時刻
*
* @return 連続離散システムの区分の番号のリスト
* @exception SolverStopException ソルバーが停止された場合
*/
private List<Integer> getContinuousPieces(final RS t) throws SolverStopException {
final List<Integer> pieces = new ArrayList<>();
for (PiecewiseContinuousAlgebraicSystem<RS,RM,CS,CM> system : this.piecewiseContinuousAlgebraicSystems) {
pieces.addAll(system.getPiece(t, getInputNodeValueOf((SystemOperator<RS,RM,CS,CM>)system)));
}
return pieces;
}
/**
* 区分的連続離散システムのリストを設定します。
*/
private void setupPiecewiseContinuousDiscreteSystems() {
this.piecewiseContinuousDiscreteAlgebraicSystems.clear();
final int size = getNodeSize();
for (int row = 0; row < size; row++) {
for (int column = 0; column < size; column++) {
final SystemOperator<RS,RM,CS,CM> system = getSystemOperator(row, column);
if (system instanceof PiecewiseContinuousDiscreteAlgebraicSystem) {
this.piecewiseContinuousDiscreteAlgebraicSystems.add((PiecewiseContinuousDiscreteAlgebraicSystem<RS,RM,CS,CM>)system);
}
}
}
}
/**
* 区分的連続システムのリストを設定します。
*/
private void setupPiecewiseContinuousSystems() {
this.piecewiseContinuousAlgebraicSystems.clear();
final int size = getNodeSize();
for (int row = 0; row < size; row++) {
for (int column = 0; column < size; column++) {
final SystemOperator<RS,RM,CS,CM> system = getSystemOperator(row, column);
if (system instanceof PiecewiseContinuousAlgebraicSystem) {
this.piecewiseContinuousAlgebraicSystems.add((PiecewiseContinuousAlgebraicSystem<RS,RM,CS,CM>)system);
}
}
}
}
/**
* 区分的連続離散代数システムへの入力を返します。
*
* @return 区分的連続離散代数システムへの入力
*/
private List<RM> getInputsToPiecewiseContinuousDiscreteAlgebraicSystems() {
final List<RM> inputs = new ArrayList<>();
for (PiecewiseContinuousDiscreteAlgebraicSystem<RS,RM,CS,CM> system : this.piecewiseContinuousDiscreteAlgebraicSystems) {
inputs.add(getInputNodeValueOf((SystemOperator<RS,RM,CS,CM>)system).createClone());
}
return inputs;
}
/**
* 区分的連続代数システムへの入力を返します。
*
* @return 区分的連続代数システムへの入力
*/
private List<RM> getInputsToPiecewiseContinuousAlgebraicSystems() {
final List<RM> inputs = new ArrayList<>();
for (PiecewiseContinuousAlgebraicSystem<RS,RM,CS,CM> system : this.piecewiseContinuousAlgebraicSystems) {
inputs.add(getInputNodeValueOf((SystemOperator<RS,RM,CS,CM>)system).createClone());
}
return inputs;
}
/**
* 指定された区間内([(t1,inputs1),(t2,inputs2)]の連続離散システムの不連続点の時刻を返します。
*
* @param t1 不連続点の前の時刻
* @param inputs1 不連続点の前の入力
* @param t2 不連続点の後の時刻
* @param inputs2 不連続点の後の入力
* @return 指定された区間内([(t1,inputs1),(t2,inputs2)]の不連続点の時刻
* @exception SolverStopException ソルバー停止された場合
*/
private List<RS> getContinuousDiscreteDiscontinuousPoints(final RS t1, final List<RM> inputs1, final RS t2, final List<RM> inputs2) throws SolverStopException {
final List<RS> points = new ArrayList<>();
for (int i = 0; i < this.piecewiseContinuousDiscreteAlgebraicSystems.size(); i++) {
final PiecewiseContinuousDiscreteAlgebraicSystem<RS,RM,CS,CM> system = this.piecewiseContinuousDiscreteAlgebraicSystems.get(i);
final RM u1 = inputs1.get(i);
final RM u2 = inputs2.get(i);
points.add(system.getDiscontinuousPoint(t1, u1, t2, u2));
}
return points;
}
/**
* 指定された区間内([(t1,inputs1),(t2,inputs2)]の連続システムの不連続点の時刻を返します。
*
* @param t1 不連続点の前の時刻
* @param inputs1 不連続点の前の入力
* @param t2 不連続点の後の時刻
* @param inputs2 不連続点の後の入力
* @return 指定された区間内([(t1,inputs1),(t2,inputs2)]の不連続点の時刻
* @exception SolverStopException ソルバーが停止された場合
*/
private List<RS> getContinuousDiscontinuousPoints(final RS t1, final List<RM> inputs1, final RS t2, final List<RM> inputs2) throws SolverStopException {
final List<RS> points = new ArrayList<>();
for (int i = 0; i < this.piecewiseContinuousAlgebraicSystems.size(); i++) {
final PiecewiseContinuousAlgebraicSystem<RS,RM,CS,CM> system = this.piecewiseContinuousAlgebraicSystems.get(i);
final RM u1 = inputs1.get(i);
final RM u2 = inputs2.get(i);
points.add(system.getDiscontinuousPoint(t1, u1, t2, u2));
}
return points;
}
}