首页 文章

odeint:如何在集成时记录中间结果?

提问于
浏览
2

我想知道如何在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 回答

  • 2

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

相关问题