DoubleDiscreteObserver.java
/*
* $Id: DiscreteObserver.java,v 1.6 2008/07/16 04:58:04 koga Exp $
*
* Copyright (C) 2004 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.tool.control.system.controller;
import org.mklab.nfc.matrix.DoubleComplexMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.control.DoubleLinearSystem;
import org.mklab.tool.control.system.DoubleSystemOperator;
import org.mklab.tool.control.system.discrete.DoubleDiscreteLinearDynamicSystem;
import org.mklab.tool.control.system.parameter.Parameter;
import org.mklab.tool.control.system.parameter.ParameterUpdator;
/**
* 離散時間オブザーバを表すクラスです。
*
* @author koga
* @version $Revision: 1.6 $, 2004/06/04
*/
public class DoubleDiscreteObserver extends DoubleDiscreteLinearDynamicSystem implements ParameterUpdator {
/** 連続時間オブザーバーの極 */
@Parameter(name = "continuousObserverPoles", description = "連続時間オブザーバーの極", update = true)
private DoubleComplexMatrix continuousObserverPoles = new DoubleComplexMatrix(new double[] {-1, -1}, new double[] {0, 0}).transpose();
/** 離散時間オブザーバーの設計器 */
private DoubleDiscreteObserverDesigner designer;
/**
* コンストラクター
*
* @param plant 状態推定の対象(連続時間線形システム)
*/
public DoubleDiscreteObserver(final DoubleSystemOperator plant) {
super();
this.designer = new DoubleDiscreteObserverDesigner(plant);
}
/**
* {@inheritDoc}
*/
@Override
public void setSamplingInterval(final double samplingInterval) {
super.setSamplingInterval(samplingInterval);
this.designer.setSamplingInterval(samplingInterval);
setObserverLinearSystem();
}
/**
* 連続時間オブザーバーの極を設定します。
*
* @param continuousObserverPoles 連続時間オブザーバーの極
*/
public void setContinuousObserverPoles(final DoubleComplexMatrix continuousObserverPoles) {
this.continuousObserverPoles = continuousObserverPoles.createClone();
this.designer.setContinuousObserverPoles(continuousObserverPoles);
setObserverLinearSystem();
}
/**
* オブザーバーの線形システムとしての値を設定します。
*/
private void setObserverLinearSystem() {
if (this.designer.isAvailable()) {
final DoubleLinearSystem linearSystem = this.designer.getObserver().getLinearSystem();
setLinearSystem(linearSystem);
setInputSize(linearSystem.getInputSize());
setOutputSize(linearSystem.getOutputSize());
setStateSize(linearSystem.getStateSize());
setInitialState(new DoubleMatrix(linearSystem.getStateSize(), 1));
setState(new DoubleMatrix(linearSystem.getStateSize(), 1));
}
}
/**
* @see org.mklab.tool.control.system.parameter.ParameterUpdator#updateWith(java.lang.String)
*/
public boolean updateWith(final String parameter) {
if (parameter.equals("continuousObserverPoles")) { //$NON-NLS-1$
setContinuousObserverPoles(this.continuousObserverPoles);
return true;
}
return false;
}
}