DoubleContinuousPIDSystem.java

/*
 * Created on 2012/07/10
 * Copyright (C) 2012 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control.system.continuous;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.control.DoubleLinearSystemFactory;


/**
 * 連続時間PIDシステムを表すクラスです。
 * 
 * @author esumi
 * @version $Revision$, 2012/07/23
 */
public class DoubleContinuousPIDSystem extends DoubleContinuousLinearDynamicSystem {

  /** 連続PIDコントローラのタイプ */
  private ContinuousPIDType pidType = ContinuousPIDType.PARALELL;

  /**
   * 連続PIDコントローラのタイプを設定します。
   * 
   * @param pidType 連続PIDコントローラのタイプ
   */
  public void setPidType(ContinuousPIDType pidType) {
    this.pidType = pidType;
  }

  /**
   * PIDシステムを設定します。
   * 
   * @param p 比例項P
   * @param i 積分項I
   * @param d 微分項D
   * @param n フィルターN
   */
  public void setLinearSystem(double p, double i, double d, double n) {
    DoubleMatrix A;
    DoubleMatrix B;
    DoubleMatrix C;
    DoubleMatrix D;
    switch (this.pidType) {
      case PARALELL:
        A = new DoubleMatrix(new double[][] { {0, 0}, {0, -n}});
        B = new DoubleMatrix(new double[][] { {i}, {n * d}});
        C = new DoubleMatrix(new double[][] {{1, -n}});
        D = new DoubleMatrix(new double[][] {{p + n * d}});
        break;
      case IDEAL:
        A = new DoubleMatrix(new double[][] { {0, 0}, {0, -n}});
        B = new DoubleMatrix(new double[][] { {i}, {n * d}});
        C = new DoubleMatrix(new double[][] {{p, -p * n}});
        D = new DoubleMatrix(new double[][] {{p + p * n * d}});
        break;
      default:
        throw new IllegalArgumentException();
    }
    setLinearSystem(DoubleLinearSystemFactory.createLinearSystem(A, B, C, D));
  }

}