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;
  }
}