odeint による積分中に状態以外の値をログに記録する方法を知りたいです。全角運動量 L と内部車輪の運動量 h の微分方程式として記述される衛星ダイナミクスのシミュレーションがあります。シミュレーションは正しく実行されています。しかし、状態変数だけでなく、外部トルク (N) や角速度 (オメガ) などの他の値も記録する必要があります。これは、Jinv*L です。ここで、Jinv は 3x3 定数の衛星慣性行列です。ある意味で、私のシミュレーターの目的は L と h を計算することではなく、「他の」変数の時間履歴を生成することです。
私が何をしているのかを示すために、以下は現在のコードを少し簡略化したものです。
class satellite
{
public:
Eigen::Matrix3d Jinv;
void operator()( state_type &x , state_type &dxdt , double t )
{
L << x[0], x[1], x[2];
h << x[3], x[4], x[5], x[6];
N = external_torque(t);
omega = Jinv * (L-h);
dLdt = N - omega.cross(L);
OMEGA = func1(omega(0), omega(1), omega(2));
dqdt = OMEGA * q * 0.5;
dxdt[0] = dLdt(0); dxdt[1] = dLdt(1); dxdt[2] = dLdt(2);
dxdt[3] = dqdt(0); dxdt[4] = dqdt(1); dxdt[5] = dqdt(2); dxdt[6] = dqdt(3);
}
};
class streaming_observer
{
public:
std::ostream& os;
satellite& sat;
streaming_observer( std::ostream& _os, satellite& _sat ) : os(_os), sat(_sat) { }
template<class State>
void operator() (const State& x, double t) const
{
L << x[0], x[1], x[2];
os << t << ' ' << (sat.Jinv*(L)).transpose() << std::endl;
}
};