LqrStateFeedback.java

/*
 * $Id: LqrStateFeedback.java,v 1.4 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.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
import org.mklab.tool.control.system.LinearSystemOperator;
import org.mklab.tool.control.system.SystemOperator;
import org.mklab.tool.control.system.math.ConstantSystem;
import org.mklab.tool.control.system.parameter.Parameter;
import org.mklab.tool.control.system.parameter.ParameterUpdator;


/**
 * LQ最適制御(安定化)のための状態フィードバックコントローラ(定数行列)を表すクラスです。
 * 
 * @author koga
 * @version $Revision: 1.4 $, 2004/05/31
  * @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 LqrStateFeedback<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 ConstantSystem<RS,RM,CS,CM> implements ParameterUpdator {
  /** 状態に関する重み行列 */
  @Parameter(name = "Q", description = "状態に関する重み行列", update = true)
  private RM Q;

  /** 入力に関する重み行列 */
  @Parameter(name = "R", description = "入力に関する重み行列", update = true)
  private RM R;

  /** LQ最適制御(安定化)のための状態フィードバックの設計器 */
  private LqrDesigner<RS,RM,CS,CM> designer;

  /**
   * コンストラクター
   * 
   * @param plant 制御対象(線形システム)
   * @param sunit unit of scalar
   */
  public LqrStateFeedback(final SystemOperator<RS,RM,CS,CM> plant, RS sunit) {
    super(plant.getStateSize(), plant.getInputSize(), sunit);
    RS[] qq = sunit.createArray(1);
    qq[0] = sunit.create(1);
    this.Q = sunit.createGrid(qq);

    RS[] rr = sunit.createArray(1);
    rr[0] = sunit.create(1);
    this.R = sunit.createGrid(rr);

    this.designer = new LqrDesigner<>((LinearSystemOperator<RS,RM,CS,CM>)plant);
  }

  /**
   * 重み行列QとRを設定します。
   * 
   * @param Q 状態に関する重み行列
   * @param R 入力に関する重み行列
   */
  public void setWeightingMatrices(final RM Q, final RM R) {
    this.Q = Q.createClone();
    this.R = R.createClone();
    this.designer.setWeightingMatrices(Q, R);
    //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("Q") || parameter.equals("R")) { //$NON-NLS-1$ //$NON-NLS-2$
      setWeightingMatrices(this.Q, this.R);
      return true;
    }
    return false;
  }
}