システムの状態が過去の入力および状態に依存して決定するとき、システムは動的システムであると定義されます。動的とは状態が時間発展を持つことを示し、微分方程式で表現されるシステムは動的システムとなります。また、状態の時間発展が過去の状態に依存することから、記憶システムとも呼ばれます。
動的システムをプログラムで扱う場合には、動的システムごとに過去の状態を記憶する必要があるため、動的システムを表現するモジュールが過去の状態量を記憶するメモリを有することが必要となります。また、システムに対する外因性入力および時間経過の発生に際して過去の状態を考慮して状態遷移を計算するために、動的システムに対して固有の演算関数を割り当てることが望ましいです。これを実現する方法として、システムの現在および過去の状態量、外因性入力および時間発展に関する演算関数をメンバにもつクラスを作成する手法があります。
以下の微分方程式で表現される動的システムを考えます。
x˙(t)x(0)=−Ax(t),=x0
ただし、
A∈R>0とする。この動的システムの状態遷移は、次の式に従います。
x(t)=x0e−At
計算機のサンプル時間を
Tsとした場合、現在のサンプル値と次時刻のサンプル値には以下の関係が成立します。
x(t+Ts)⇔ x[k+1]=x0e−A(t+Ts)=(x0e−At)e−ATs=e−ATsx[k]
ここで、
k∈N≥0はサンプル番号を表します。これは、現在の状態サンプル値が前時刻の状態サンプル値のみから計算できることを示しています。
x[k]=e−ATsx[k−1]
以上を考慮し、次のようなクラスを設計します。クラスのメンバ変数は、外部から作用されないようにプライベート変数とします。
class dynamicalSystem {
private:
double Ts; // Sampling time
double A; // Exponent
double x; // Current state
double xZ1; // Previous state at 1 step before
public:
dynamicalSystem(double SmplTime, double An);
~dynamicalSystem();
void InitializeState(double InitValue);
void UpdateState(void);
void ClearState(void);
double GetState(void);
};
#include <math.h>
#include "dynamicalSystem.h"
dynamicalSystem::dynamicalSystem(double SmplTime, double An) : A(An), Ts(SmplTime) {
x = 0.0;
xZ1 = 0.0;
}
dynamicalSystem::~dynamicalSystem() {};
void dynamicalSystem::InitializeState(double InitValue) {
x = InitValue;
xZ1 = InitValue;
};
void dynamicalSystem::UpdateState() {
x = exp(-A * Ts) * xZ1;
xZ1 = x;
};
void dynamicalSystem::ClearState() {
x = 0.0;
xZ1 = 0.0;
};
double dynamicalSystem::GetState() {
return x;
};
設計したクラスを使用して、インスタンスを生成します。生成されたインスタンスは固有のメンバ関数によって自身の内部変数を変化させます。時間経過に伴って更新関数を呼び出すことで、動的システムの時間発展を表現することができます。