2

我想知道如何在 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;
}
};
4

1 回答 1

2

你必须计算你的中间体和观察者的记录。为了避免冗余,最好在类方法的单独函数中进行计算,并从系统函数(因此在您的示例中为 operator() )和观察者调用此方法。您还可以在其中记录值并使用这些值进行一些后续分析。

于 2013-09-13T08:02:42.927 回答