ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
StateSpaceSystem.hh
[詳解]
1
9//
10// Copyright (C) 2011-2023 Yokokura, Yuki
11// MIT License. For details, see the LICENSE file.
12
13#ifndef STATESPACESYSTEM
14#define STATESPACESYSTEM
15
16#include <cassert>
17#include "Matrix.hh"
18#include "Discret.hh"
19#include "ArcsControl.hh"
20
21// ARCS組込み用マクロ
22#ifdef ARCS_IN
23 // ARCSに組み込まれる場合
24 #include "ARCSassert.hh"
25 #include "ARCSeventlog.hh"
26#else
27 // ARCSに組み込まれない場合
28 #define arcs_assert(a) (assert(a))
29 #define PassedLog()
30 #define EventLog(a)
31 #define EventLogVar(a)
32#endif
33
34namespace ARCS { // ARCS名前空間
39template <size_t N, size_t I = 1, size_t O = 1>
41 public:
44 : Ad(), Bd(), Cd(), Dd(), u(), x(), x_next(), y(), y_next(), DirectTerm(true)
45 {
46 PassedLog();
47 }
48
54 StateSpaceSystem(const Matrix<N,N>& A, const Matrix<I,N>& B, const Matrix<N,O>& C, const double Ts)
55 : Ad(), Bd(), Cd(), Dd(), u(), x(), x_next(), y(), y_next(), DirectTerm(true)
56 {
57 SetContinuous(A, B, C, Ts); // 連続系のA行列,B行列,C行列を設定して離散化
58 PassedLog();
59 }
60
67 StateSpaceSystem(const Matrix<N,N>& A, const Matrix<I,N>& B, const Matrix<N,O>& C, const Matrix<I,O>& D, const double Ts)
68 : Ad(), Bd(), Cd(), Dd(), u(), x(), x_next(), y(), y_next(), DirectTerm(true)
69 {
70 SetContinuous(A, B, C, D, Ts); // 連続系のA行列,B行列,C行列,D行列を設定して離散化
71 PassedLog();
72 }
73
77 : Ad(r.Ad), Bd(r.Bd), Cd(r.Cd), Dd(r.Dd), u(r.u), x(r.x), x_next(r.x_next), y(r.y), y_next(r.y_next), DirectTerm(r.DirectTerm)
78 {
79
80 }
81
86
92 void SetContinuous(const Matrix<N,N>& A, const Matrix<I,N>& B, const Matrix<N,O>& C, const double Ts){
93 if constexpr(N == 1){
94 // 次数が1次のときは平衡化せずに離散化
95 auto Ah = A;
96 auto Bh = B;
97 auto Ch = C;
98 std::tie(Ad, Bd) = ArcsControl::Discretize(Ah, Bh, Ts); // 離散化
99 Cd = Ch; // C行列はそのまま
100 }else{
101 // 次数が1次より高いときは平衡化してから離散化
102 auto [Ah, Bh, Ch] = ArcsControl::BalanceReal(A, B, C); // 平衡化
103 std::tie(Ad, Bd) = ArcsControl::Discretize(Ah, Bh, Ts); // 離散化
104 Cd = Ch; // C行列は平衡化後そのまま
105 }
106 DirectTerm = false; // 直達項は無し
107 }
108
115 void SetContinuous(const Matrix<N,N>& A, const Matrix<I,N>& B, const Matrix<N,O>& C, const Matrix<I,O>& D, const double Ts){
116 SetContinuous(A, B, C, Ts);
117 Dd = D; // D行列は何もせずそのまま
118 DirectTerm = true; // 直達項は有り
119 }
120
125 void SetDiscrete(const Matrix<N,N>& A, const Matrix<I,N>& B, const Matrix<N,O>& C){
126 Ad = A;
127 Bd = B;
128 Cd = C;
129 DirectTerm = false; // 直達項は無し
130 }
131
137 void SetDiscrete(const Matrix<N,N>& A, const Matrix<I,N>& B, const Matrix<N,O>& C, const Matrix<I,O>& D){
138 Ad = A;
139 Bd = B;
140 Cd = C;
141 Dd = D;
142 DirectTerm = true; // 直達項は有り
143 }
144
147 void SetInput(const Matrix<1,I>& uin){
148 u = uin;
149 }
150
153 void SetInput(const double uin){
154 static_assert(I == 1); // 1入力系かチェック
155 u[1] = uin;
156 }
157
161 void SetInput(const double u1, const double u2){
162 static_assert(I == 2); // 2入力系かチェック
163 u[1] = u1;
164 u[2] = u2;
165 }
166
168 void Update(void){
169 x_next = Ad*x + Bd*u; // 状態方程式
170 if(DirectTerm == false){
171 y = Cd*x; // 直達項なし版の出力方程式
172 y_next = Cd*x_next; // 直達項なし版の出力方程式(次の時刻の出力ベクトルを即時に返す場合用)
173 }else{
174 y = Cd*x + Dd*u; // 直達項あり版の出力方程式
175 y_next = Cd*x_next + Dd*u; // 直達項あり版の出力方程式(次の時刻の出力ベクトルを即時に返す場合用)
176 }
177 x = x_next; // 状態ベクトルを更新
178 }
179
183 yout = y;
184 }
185
189 return y;
190 }
191
195 double GetOutput(size_t i){
196 return y[i];
197 }
198
202 yout = y_next;
203 }
204
208 return y_next;
209 }
210
214 double GetNextOutput(size_t i){
215 return y_next[i];
216 }
217
221 void GetResponses(const Matrix<1,I>& uin, Matrix<1,O>& yout){
222 u = uin; // 入力ベクトルを設定
223 Update(); // 状態空間モデルの応答を計算して状態ベクトルを更新
224 yout = y; // 出力ベクトルを返す
225 }
226
231 Matrix<1,O> yout; // 出力ベクトル
232 GetResponses(uin, yout); // 応答計算
233 return yout; // 出力ベクトルを返す
234 }
235
239 double GetResponse(const double uin){
240 static_assert(I == 1 && O == 1);// SISOかチェック
241 Matrix<1,I> u_vec; // 入力ベクトル
242 Matrix<1,O> y_vec; // 出力ベクトル
243 u_vec[1] = uin;
244 GetResponses(u_vec, y_vec); // 応答計算
245 return y_vec[1]; // 出力を返す
246 }
247
252 double GetResponse(const double u1, const double u2){
253 static_assert(I == 2 && O == 1);// 2入力1出力かチェック
254 Matrix<1,I> u_vec; // 入力ベクトル
255 Matrix<1,O> y_vec; // 出力ベクトル
256 u_vec[1] = u1;
257 u_vec[2] = u2;
258 GetResponses(u_vec, y_vec); // 応答計算
259 return y_vec[1]; // 出力を返す
260 }
261
265 void GetNextResponses(const Matrix<1,I>& uin, Matrix<1,O>& yout){
266 u = uin; // 入力ベクトルを設定
267 Update(); // 状態空間モデルの応答を計算して状態ベクトルを更新
268 yout = y_next; // 次の時刻の出力ベクトルを返す
269 }
270
275 Matrix<1,O> yout; // 出力ベクトル
276 GetNextResponses(uin, yout); // 応答計算
277 return yout; // 出力ベクトルを返す
278 }
279
283 double GetNextResponse(const double uin){
284 static_assert(I == 1 && O == 1);// SISOかチェック
285 Matrix<1,I> u_vec; // 入力ベクトル
286 Matrix<1,O> y_vec; // 出力ベクトル
287 u_vec[1] = uin;
288 GetNextResponses(u_vec, y_vec); // 応答計算
289 return y_vec[1]; // 出力を返す
290 }
291
295 double GetNextResponse(const double u1, const double u2){
296 static_assert(I == 2 && O == 1);// 2入力1出力かチェック
297 Matrix<1,I> u_vec; // 入力ベクトル
298 Matrix<1,O> y_vec; // 出力ベクトル
299 u_vec[1] = u1;
300 u_vec[2] = u2;
301 GetNextResponses(u_vec, y_vec); // 応答計算
302 return y_vec[1]; // 出力を返す
303 }
304
307 x = Matrix<1,N>::zeros();
308 }
309
310 private:
311 StateSpaceSystem(const StateSpaceSystem&) = delete;
312 const StateSpaceSystem& operator=(const StateSpaceSystem&) = delete;
313 Matrix<N,N> Ad;
314 Matrix<I,N> Bd;
315 Matrix<N,O> Cd;
316 Matrix<I,O> Dd;
317 Matrix<1,I> u;
318 Matrix<1,N> x;
319 Matrix<1,N> x_next;
320 Matrix<1,O> y;
321 Matrix<1,O> y_next;
322 bool DirectTerm;
323};
324}
325
326#endif
327
ARCS イベントログクラス
#define PassedLog()
イベントログ用マクロ(ファイルと行番号のみ記録版)
Definition ARCSeventlog.hh:26
ARCS用ASSERTクラス
ARCS-Control 制御理論クラス
行列/ベクトル計算クラス(テンプレート版)
離散化クラス(テンプレート版) !!!注意喚起:このクラスは将来的に廃止予定です。代わりに、ArcsControlDiscretizeを使用して下さい。
static constexpr void BalanceReal(const Matrix< NA, MA > &A, const Matrix< NB, MA > &b, const Matrix< NA, MC > &c, Matrix< NA, MA > &Ah, Matrix< NB, MA > &bh, Matrix< NA, MC > &ch)
状態空間モデルを平衡化する関数(引数で返す版)
Definition ArcsControl.hh:128
static constexpr void Discretize(const Matrix< N, N > &Ac, const Matrix< M, N > &Bc, Matrix< N, N > &Ad, Matrix< M, N > &Bd, const double Ts, const size_t Npade=13, const size_t Nint=10000)
連続系状態空間モデルを離散化する関数(引数で返す版)
Definition ArcsControl.hh:186
行列/ベクトル計算クラス(テンプレート版)
Definition Matrix.hh:44
static constexpr Matrix zeros(void)
m行n列の零行列を返す関数
Definition Matrix.hh:648
状態空間表現によるシステムクラス
Definition StateSpaceSystem.hh:40
~StateSpaceSystem()
デストラクタ
Definition StateSpaceSystem.hh:83
Matrix< 1, O > GetOutput(void)
状態空間モデルからの出力ベクトルを取得する関数(ベクトルで返す版)
Definition StateSpaceSystem.hh:188
void SetInput(const double u1, const double u2)
状態空間モデルへの入力ベクトルを予め設定する関数(2入力版)
Definition StateSpaceSystem.hh:161
void SetInput(const Matrix< 1, I > &uin)
状態空間モデルへの入力ベクトルを予め設定する関数
Definition StateSpaceSystem.hh:147
double GetNextOutput(size_t i)
状態空間モデルからの、次の時刻の出力ベクトルの内の、1つの成分のみを選択して取得する関数
Definition StateSpaceSystem.hh:214
void SetContinuous(const Matrix< N, N > &A, const Matrix< I, N > &B, const Matrix< N, O > &C, const double Ts)
連続系のA行列,B行列,C行列を設定して離散化する関数
Definition StateSpaceSystem.hh:92
void SetDiscrete(const Matrix< N, N > &A, const Matrix< I, N > &B, const Matrix< N, O > &C)
離散系のA行列,B行列,C行列を設定する関数
Definition StateSpaceSystem.hh:125
Matrix< 1, O > GetResponses(const Matrix< 1, I > &uin)
状態空間モデルの応答を計算して取得する関数(ベクトルで返す版)
Definition StateSpaceSystem.hh:230
void GetResponses(const Matrix< 1, I > &uin, Matrix< 1, O > &yout)
状態空間モデルの応答を計算して取得する関数(引数で返す版)
Definition StateSpaceSystem.hh:221
void SetInput(const double uin)
状態空間モデルへの入力ベクトルを予め設定する関数(1入力版)
Definition StateSpaceSystem.hh:153
void SetContinuous(const Matrix< N, N > &A, const Matrix< I, N > &B, const Matrix< N, O > &C, const Matrix< I, O > &D, const double Ts)
連続系のA行列,B行列,C行列,D行列を設定して離散化する関数
Definition StateSpaceSystem.hh:115
void SetDiscrete(const Matrix< N, N > &A, const Matrix< I, N > &B, const Matrix< N, O > &C, const Matrix< I, O > &D)
離散系のA行列,B行列,C行列,D行列を設定する関数
Definition StateSpaceSystem.hh:137
StateSpaceSystem(const Matrix< N, N > &A, const Matrix< I, N > &B, const Matrix< N, O > &C, const double Ts)
コンストラクタ(連続系A,B,C行列設定版)
Definition StateSpaceSystem.hh:54
StateSpaceSystem(const Matrix< N, N > &A, const Matrix< I, N > &B, const Matrix< N, O > &C, const Matrix< I, O > &D, const double Ts)
コンストラクタ(連続系A,B,C,D行列設定版)
Definition StateSpaceSystem.hh:67
void GetNextResponses(const Matrix< 1, I > &uin, Matrix< 1, O > &yout)
状態空間モデルの応答を計算して取得する関数(次の時刻の出力ベクトルを即時に返す版)
Definition StateSpaceSystem.hh:265
void Update(void)
状態空間モデルの応答を計算して状態ベクトルを更新する関数
Definition StateSpaceSystem.hh:168
double GetNextResponse(const double uin)
状態空間モデルの応答を計算して取得する関数(次の時刻の出力ベクトルを即時に返す版)(SISOでスカラーで返す版)
Definition StateSpaceSystem.hh:283
double GetOutput(size_t i)
状態空間モデルからの出力ベクトルの内の、1つの成分のみを選択して取得する関数
Definition StateSpaceSystem.hh:195
void GetOutput(Matrix< 1, O > &yout)
状態空間モデルからの出力ベクトルを取得する関数(引数で返す版)
Definition StateSpaceSystem.hh:182
StateSpaceSystem(void)
コンストラクタ(空コンストラクタ版)
Definition StateSpaceSystem.hh:43
void ClearStateVector(void)
状態ベクトルをクリアする関数
Definition StateSpaceSystem.hh:306
Matrix< 1, O > GetNextResponses(const Matrix< 1, I > &uin)
状態空間モデルの応答を計算して取得する関数(次の時刻の出力ベクトルを即時に返す版)(ベクトルで返す版)
Definition StateSpaceSystem.hh:274
double GetResponse(const double u1, const double u2)
状態空間モデルの応答を計算して取得する関数(2入力1出力でスカラーで返す版)
Definition StateSpaceSystem.hh:252
Matrix< 1, O > GetNextOutput(void)
状態空間モデルからの、次の時刻の出力ベクトルを取得する関数(ベクトルで返す版)
Definition StateSpaceSystem.hh:207
void GetNextOutput(Matrix< 1, O > &yout)
状態空間モデルからの、次の時刻の出力ベクトルを取得する関数(引数で返す版)
Definition StateSpaceSystem.hh:201
double GetResponse(const double uin)
状態空間モデルの応答を計算して取得する関数(SISOでスカラーで返す版)
Definition StateSpaceSystem.hh:239
double GetNextResponse(const double u1, const double u2)
状態空間モデルの応答を計算して取得する関数(次の時刻の出力ベクトルを即時に返す版)(2入力1出力でスカラーで返す版)
Definition StateSpaceSystem.hh:295
StateSpaceSystem(StateSpaceSystem &&r)
ムーブコンストラクタ
Definition StateSpaceSystem.hh:76