具有boost :: odeint的非线性时变系统输入

时间:2014-04-09 21:02:30

标签: boost odeint

我正在使用最优控制方法(轨迹生成和优化)研究无限维优化算法。我想要对此进行轨迹优化的系统是$ \ dot {x}(t)= f(x(t),u(t),t)$形式的非线性系统。换句话说,我有时变非线性输入。

是否可以使用boost :: odeint解决这样的ODE?我没有在文档中找到任何提示,但我可能还没有看到它。

1 个答案:

答案 0 :(得分:2)

是的,你可以使用odeint来解决这类问题。显式步进器期望传递给odeint的系统函数(ODE)具有签名

ode( x , dxdt , t );

其中x是当前状态的输入参数,dxdt是r.h.s.的输出参数。在ODE中,t是时间。例如,可以像

那样实现驱动振荡器
typedef std::array< double , 2 > state_type;

struct oscillator
{
    double driving_strength;
    double dribving_frequency;

    void operator()( state_type const &x , state_type &dxdt , double t ) const
    {
        dxdt[0] = x[1];
        dxdt[1] = -x[0] + driving_strength * sin( driving_frequency * t );
    }
};

state_type x;
oscillator osc;
// initialize x and osc 
runge_kutta4< state_type > stepper;
integrate_const( stepper , osc , x , t_start , t_end , dt );