01 /*
02 * $Id: Motor2ObserverRKFSimulationAuto.java,v 1.4 2008/02/02 03:06:25 koga Exp $
03 *
04 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
05 *
06 */
07 package matxbook.chap21;
08
09 import java.io.IOException;
10
11 import org.mklab.nfc.matrix.DoubleMatrix;
12 import org.mklab.nfc.matrix.Matrix;
13 import org.mklab.nfc.ode.DifferentialEquationAutoSolver;
14 import org.mklab.nfc.ode.RungeKuttaFehlberg;
15 import org.mklab.nfc.util.Pause;
16 import org.mklab.tool.control.system.SystemSolver;
17 import org.mklab.tool.graph.gnuplot.Canvas;
18 import org.mklab.tool.graph.gnuplot.Gnuplot;
19
20
21 /**
22 * モータと連続時間オブザーバの結合システムのシミュレーション計算をRKF法(誤差指定)で行うサンプルです。
23 * @author koga
24 * @version $Revision: 1.4 $, 2004/04/23
25 */
26 public class Motor2ObserverRKFSimulationAuto {
27
28 /**
29 * メインメソッド
30 *
31 * @param args コマンドライン引数
32 * @throws InterruptedException 強制終了された場合
33 * @throws IOException キーボードから入力できない場合
34 */
35 @SuppressWarnings("nls")
36 public static void main(String[] args) throws InterruptedException, IOException {
37 Motor2ContinuousObserver2 system = new Motor2ContinuousObserver2();
38 Matrix x0 = new DoubleMatrix(new double[] {0, 0}).transpose();
39 Matrix z0 = new DoubleMatrix(new double[] {1});
40 Matrix initialState = x0.appendDown(z0);
41 system.setInitialState(initialState);
42
43 DifferentialEquationAutoSolver solver = new RungeKuttaFehlberg();
44 solver.setTolerance(1.0E-5);
45 new SystemSolver(solver).solveAuto(system, 0, 10);
46 DoubleMatrix tt = solver.getTimeSeries();
47 DoubleMatrix xx = solver.getContinuousStateSeries();
48 DoubleMatrix io = solver.getInputOutputSeries();
49
50 Gnuplot gnuplot = new Gnuplot();
51 Canvas canvas = gnuplot.createCanvas();
52 canvas.setHolding(true);
53 canvas.plot(tt, xx.getRowVectors(1, 2), new String[] {"x1", "x2"});
54 canvas.plot(tt, io.getRowVectors(3, 4), new String[] {"xh1", "xh2"});
55 canvas.setHolding(false);
56 Pause.pause();
57 gnuplot.close();
58 }
59 }
|