Motor2ContinuousObserver.java
001 /*
002  * $Id: Motor2ContinuousObserver.java,v 1.4 2008/06/08 04:28:13 koga Exp $
003  *
004  * Copyright (C) 2004 Koga Laboratory. All rights reserved.
005  *
006  */
007 package matxbook.chap21;
008 
009 import org.mklab.nfc.matrix.Matrix;
010 import org.mklab.tool.control.system.continuous.BaseContinuousDynamicSystem;
011 
012 
013 /**
014  * モータと連続時間オブザーバの結合システムを表すクラスです。
015  
016  @author koga
017  @version $Revision: 1.4 $, 2004/04/23
018  */
019 public class Motor2ContinuousObserver extends BaseContinuousDynamicSystem {
020   /** モータ */
021   Motor2 motor = new Motor2();
022   /** 状態フィードバック制御器 */
023   StateFeedback stateFeedback = new StateFeedback();
024   /** 連続時間オブザーバー */
025   ContinuousObserver observer = new ContinuousObserver();
026 
027   /**
028    * コンストラクター
029    */
030   public Motor2ContinuousObserver() {
031     super(203);
032   }
033 
034   /**
035    @see org.mklab.tool.control.system.continuous.ContinuousDynamicSystem#stateEquation(double, org.mklab.nfc.matrix.Matrix, org.mklab.nfc.matrix.Matrix)
036    */
037   public Matrix stateEquation(double t, Matrix xx, Matrix uy) {
038     Matrix x = xx.getSubVector(12);
039     Matrix z = xx.getSubVector(33);
040     Matrix u = uy.getSubVector(11);
041 
042     Matrix dx = this.motor.stateEquation(t, x, u);
043     Matrix dz = this.observer.stateEquation(t, z, uy);
044     Matrix dxx = dx.appendDown(dz);
045     return dxx;
046   }
047 
048   /**
049    @see org.mklab.nfc.ode.DifferentialSystem#inputOutputEquation(double, org.mklab.nfc.matrix.Matrix)
050    */
051   @Override
052   public Matrix inputOutputEquation(double t, Matrix xx) {
053     Matrix x = xx.getSubVector(12);
054     Matrix y = this.motor.outputEquation(t, x);
055     Matrix z = xx.getSubVector(33);
056     Matrix xh = this.observer.outputEquation(t, z, y);
057     Matrix u = this.stateFeedback.outputEquation(t, xh);
058     Matrix uy = u.appendDown(y);
059     return uy;
060   }
061 
062   /**
063    @see org.mklab.tool.control.system.DynamicSystem#setInitialState(org.mklab.nfc.matrix.Matrix)
064    */
065   @Override
066   public void setInitialState(Matrix initialState) {
067     Matrix x0 = initialState.getSubVector(12);
068     Matrix z0 = initialState.getSubVector(33);
069     this.motor.setInitialState(x0);
070     this.observer.setInitialState(z0);
071   }
072 
073   /**
074    @see org.mklab.tool.control.system.DynamicSystem#getInitialState()
075    */
076   @Override
077   public Matrix getInitialState() {
078     Matrix x0 = this.motor.getInitialState();
079     Matrix z0 = this.observer.getInitialState();
080     return x0.appendDown(z0);
081   }
082 
083   /**
084    @see org.mklab.tool.control.system.DynamicSystem#setState(org.mklab.nfc.matrix.Matrix)
085    */
086   @Override
087   public void setState(Matrix state) {
088     Matrix x = state.getSubVector(12);
089     Matrix z = state.getSubVector(33);
090     this.motor.setState(x);
091     this.observer.setState(z);
092   }
093 
094   /**
095    @see org.mklab.tool.control.system.DynamicSystem#getState()
096    */
097   @Override
098   public Matrix getState() {
099     Matrix x = this.motor.getState();
100     Matrix z = this.observer.getState();
101     return x.appendDown(z);
102   }
103 
104 }