DoubleLqServoStateFeedback.java

/*
 * $Id: LqServoStateFeedback.java,v 1.3 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.DoubleMatrix;
import org.mklab.tool.control.system.DoubleSystemOperator;
import org.mklab.tool.control.system.math.DoubleConstantSystem;
import org.mklab.tool.control.system.parameter.Parameter;
import org.mklab.tool.control.system.parameter.ParameterUpdator;


/**
 * 入力外乱に対するLQ最適サーボのための状態フィードバックコントローラ(定数行列)を表すクラスです。
 * 
 * @author koga
 * @version $Revision: 1.3 $, 2004/05/31
 */
public class DoubleLqServoStateFeedback extends DoubleConstantSystem implements ParameterUpdator {

  /** 出力に関する重み行列 */
  @Parameter(name = "Qe", description = "出力に関する重み行列", update = true)
  private DoubleMatrix Qe = new DoubleMatrix(new double[] {1}).vectorToDiagonal();

  /** 入力に関する重み行列 */
  @Parameter(name = "Re", description = "入力に関する重み行列", update = true)
  private DoubleMatrix Re = new DoubleMatrix(new double[] {1});

  /** 入力外乱に対するLQ最適サーボのための状態フィードバックの設計器 */
  private DoubleLqServoDesigner designer;

  /**
   * コンストラクター
   * 
   * @param plant 制御対象(線形システム)
   */
  public DoubleLqServoStateFeedback(final DoubleSystemOperator plant) {
    super(plant.getStateSize(), plant.getInputSize());
    this.designer = new DoubleLqServoDesigner(plant);
  }

  /**
   * 重み行列を設定します。
   * 
   * @param Qe 出力に関する重み行列
   * @param Re 入力に関する重み行列
   */
  public void setWeightingMatrix(final DoubleMatrix Qe, final DoubleMatrix Re) {
    this.Qe = Qe.createClone();
    this.Re = Re.createClone();
    this.designer.setWeightingMatrices(Qe, Re);
    //this.designer.showClosedLoopPoles();
    setGain(this.designer.getStateFeedback());
  }

  /**
   * @see org.mklab.tool.control.system.parameter.ParameterUpdator#updateWith(java.lang.String)
   */
  public boolean updateWith(final String parameter) {
    if (parameter.equals("Qe") || parameter.equals("Re")) { //$NON-NLS-1$ //$NON-NLS-2$
      setWeightingMatrix(this.Qe, this.Re);
      return true;
    }
    return false;
  }
}