PolePlaceDesigner.java

/*
 * $Id: PolePlaceDesigner.java,v 1.4 2008/06/11 05:40:39 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.Pplace;
import org.mklab.tool.control.system.LinearSystemOperator;
import org.mklab.tool.control.system.SystemOperator;


/**
 * 極配置のための状態フィードバックを設計するクラスです。
 * 
 * @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 PolePlaceDesigner<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>> {

  /** 制御対象(線形システム) */
  private LinearSystemOperator<RS,RM,CS,CM> plant;
  /** 閉ループ系の指定極 */
  private CM closedLoopPoles;
  /** 極配置のための状態フィードバック行列 */
  private RM F;

  /**
   * コンストラクター
   * 
   * @param plant 制御対象(線形システム)
   */
  public PolePlaceDesigner(SystemOperator<RS,RM,CS,CM> plant) {
    this.plant = (LinearSystemOperator<RS,RM,CS,CM>)plant;
  }

  /**
   * 極配置のための状態フィードバック行列を返します。
   * 
   * @return 状態フィードバック行列
   */
  public RM getStateFeedback() {
    design();
    return this.F;
  }

  /**
   * 極配置のための状態フィードバック行列を設計します。
   */
  private void design() {
    this.F = Pplace.pplace(this.plant.getA(), this.plant.getB(), this.closedLoopPoles);
  }

  /**
   * 閉ループ系の指定極を設定します。
   * 
   * @param closedLoopPoles 閉ループ系の指定極
   */
  public void setClosedLoopPoles(CM closedLoopPoles) {
    this.closedLoopPoles = closedLoopPoles;
  }

  //  /**
  //   * メインメソッド
  //   * 
  //   * @param args
  //   *        コマンドライン引数
  //   */
  //  public static void main(String[] args) {
  //    PolePlaceDesigner designer = new PolePlaceDesigner(new LinearSinglePendulum());
  //    RM closedLoopPoles = new DoubleComplexMatrix(new double[] {-20, -20, -2, -2}, new double[] {0, 0, 0, 0}).transpose();
  //    designer.setClosedLoopPoles(closedLoopPoles);
  //    designer.getStateFeedback().print("F: 極配置のための状態フィードバック行列");
  //  }
}