Решение дифференциального уравнения с использованием библиотек BOOST - PullRequest
1 голос
/ 21 сентября 2019

Мне нужно найти следующее состояние моего робота, которое можно найти при решении дифференциальных уравнений.В MATLAB я использовал функцию ode45, а на c ++ я обнаружил в интернете, что мне нужно использовать какой-то метод, такой как stepper runga kutta dopri5.Я попытался понять его реализацию и как-то понял.Теперь мои состояния - X, Y и theta, и чтобы найти следующие состояния, мои дифференциальные уравнения -

Xdot=v*cos(theta)
Ydot=v*sin(theta)
thetadot=w

Теперь есть открытая функция stepper.do_step_impl (System, state, ... и т. Д.), Где я понялявляется то, что система представляет функцию, параметры которой могут быть & state, dstate и t.Теперь вот моя проблема.Мои дифференциальные уравнения имеют переменные v и w, которые мне нужны в моей Системной функции, но, согласно моему пониманию, Системная функция может иметь только фиксированные параметры, то есть State, dstate и t.Как я могу положить V и W в нем?Я надеюсь, что кто-то понимает мой вопрос.Пожалуйста, помогите.Ниже мой код

using namespace boost::numeric::odeint;
typedef std::vector< double > state_type; 

void pdot_w( const state_type &state, state_type &dstate, const double t )
{
    double p_robot_xdot = v*cos(state[2]);
    double p_robot_ydot = v*sin(state[2]);
    double thetadot = w;
    dstate[0] = p_robot_xdot;
    dstate[1] = p_robot_ydot;
    dstate[2] = thetadot;
}

runge_kutta_dopri5<state_type> stepper;
stepper.do_step(pdot_w, state , 0, 0.01 );

1 Ответ

1 голос
/ 21 сентября 2019

Ответ зависит от того, как вы хотите передать параметры v и w интегратору.

Один из подходов в C ++ 11 состоит в использовании лямбда .Ваша функция и вызов степпера будут выглядеть следующим образом (в зависимости от контекста захват [] может потребоваться более явный):

void pdot_w(const state_type &state,
            state_type & dstate,
            const double t,
            const double v,
            const double w) {
    dstate[0] = v * cos(state[2]);
    dstate[1] = v * sin(state[2]);
    dstate[2] = w;
}


runge_kutta_dopri5<state_type> stepper;
/* v = 4 and w = 5 example */
stepper.do_step([](const state_type & state, state_type & d_state, const double t) {
                    return pdot_w(state, d_state, t, 4, 5);
                }, state,
                0,  0.01);
...