我想知道如何在 odeint 集成期间记录状态以外的值。我有一个卫星动力学的模拟,它被描述为总角动量 L 和内轮动量 h 的微分方程。我的模拟运行正常。但我不仅需要记录状态变量,还需要记录其他一些值,例如外部扭矩 N 和角速度 omega,即 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;
}
};