DoublePolePlaceDesigner.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.DoubleComplexMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.control.Pplace;
import org.mklab.tool.control.system.DoubleLinearSystemOperator;
import org.mklab.tool.control.system.DoubleSystemOperator;


/**
 * 極配置のための状態フィードバックを設計するクラスです。
 * 
 * @author koga
 * @version $Revision: 1.4 $, 2004/05/31
 */
public class DoublePolePlaceDesigner {

  /** 制御対象(線形システム) */
  private DoubleLinearSystemOperator plant;
  /** 閉ループ系の指定極 */
  private DoubleComplexMatrix closedLoopPoles;
  /** 極配置のための状態フィードバック行列 */
  private DoubleMatrix F;

  /**
   * コンストラクター
   * 
   * @param plant 制御対象(線形システム)
   */
  public DoublePolePlaceDesigner(DoubleSystemOperator plant) {
    this.plant = (DoubleLinearSystemOperator)plant;
  }

  /**
   * 極配置のための状態フィードバック行列を返します。
   * 
   * @return 状態フィードバック行列
   */
  public DoubleMatrix 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(DoubleComplexMatrix closedLoopPoles) {
    this.closedLoopPoles = closedLoopPoles;
  }

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