01 /*
02 * $Id: MotorStateFeedbackRK4Simulation.java,v 1.3 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.DifferentialEquationSolver;
14 import org.mklab.nfc.ode.RungeKutta4;
15 import org.mklab.nfc.ode.SolverStopException;
16 import org.mklab.nfc.util.Pause;
17 import org.mklab.tool.control.system.SystemSolver;
18 import org.mklab.tool.graph.gnuplot.Canvas;
19 import org.mklab.tool.graph.gnuplot.Gnuplot;
20
21
22 /**
23 * モータの状態フィードバック制御のシミュレーションを4次のルンゲ・クッタ法(ソルバー)で実行するクラスです。
24 *
25 * @author koga
26 * @version $Revision: 1.3 $, 2004/04/23
27 */
28 public class MotorStateFeedbackRK4Simulation {
29
30 /**
31 * メインメソッド
32 *
33 * @param args コマンドライン引数
34 * @throws InterruptedException 強制終了された場合
35 * @throws IOException キーボードから入力できない場合
36 * @throws SolverStopException ソルバーが停止された場合
37 */
38 @SuppressWarnings("nls")
39 public static void main(String[] args) throws InterruptedException, IOException, SolverStopException {
40 MotorStateFeedback system = new MotorStateFeedback();
41 Matrix x0 = new DoubleMatrix(new double[] {1, 0}).transpose();
42 system.setInitialState(x0);
43
44 DifferentialEquationSolver solver = new RungeKutta4();
45 solver.setTimeStep(0.1);
46 new SystemSolver(solver).solve(system, 0, 10);
47 DoubleMatrix tt = solver.getTimeSeries();
48 DoubleMatrix xx = solver.getContinuousStateSeries();
49 DoubleMatrix io = solver.getInputOutputSeries();
50
51 Gnuplot gnuplot = new Gnuplot();
52 Canvas canvas = gnuplot.createCanvas();
53 canvas.setHolding(true);
54 canvas.plot(tt, xx, new String[] {"x1", "x2"});
55 canvas.plot(tt, (DoubleMatrix)io.getRowVector(1), new String[] {"u"});
56 canvas.setHolding(false);
57 Pause.pause();
58 gnuplot.close();
59 }
60 }
|