我想知道如何在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;
}
};
1 回答
您必须在观察者中计算中间体和日志记录 . 为了避免冗余,可能有利于在类方法的单独函数中进行计算,并从系统函数(因此示例中的operator())和观察者调用此方法 . 您还可以在其中记录值,并使用这些值进行稍后的分析 .