Использование определения функции odeint
Довольно нуб вопрос, так что, пожалуйста, потерпите меня.
Я следую приведенному здесь примеру--> http://www.codeproject.com/Articles/268589/odeint-v2-Solving-ordinary-differential-equations
В частности, я рассматриваю эту функцию:
void lorenz( state_type &x , state_type &dxdt , double t )
{
dxdt[0] = sigma * ( x[1] - x[0] );
dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
dxdt[2] = x[0]*x[1] - b * x[2];
}
В моем случае R принимает ряд значений (вектор со 100 двойниками).
Odeint называется так:
integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , dt );
Я хотел бы сделать это для каждого значения R. Как я могу это сделать? Мои познания в C++ / OOP ограничен, но я готов учиться.
Спасибо.
2 ответа:
Вы можете использовать версию "class", но изменить ее так, чтобы она была инициализирована значением
R
, представляющим для вас интерес.class lorenz_class { double R_; public: lorenz_class (double r) : R_(r) {} void operator()( state_type &x , state_type &dxdt , double t ) { dxdt[0] = sigma * ( x[1] - x[0] ); dxdt[1] = R_ * x[0] - x[1] - x[0] * x[2]; dxdt[2] = x[0]*x[1] - b * x[2]; } };
Затем повторите свой вектор
R
и передайте значение в экземплярlorenz_class
, который вы передаете в функцию шаблонаintegrate_const
.for (unsigned i = 0; i < myR.size(); ++i) { lorenz_class lorenz(myR[i]); integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , dt ); }
Просто небольшое примечание: учебник показывает очень похожий пример исследования параметров системы Лоренца: http://headmyshoulder.github.com/odeint-v2/doc/boost_numeric_odeint/tutorial.html он находится в разделе тяги и VexCL и показывает, как можно распараллелить эту проблему для работы на нескольких процессорах или GPU.