Я хотел бы использовать интегратор повышения odeint для просмотра геодезических кривых в пространстве-времени Керра. Это требует запуска интегратора для различных значений параметров (у меня есть начальные условия и векторы начального импульса, поэтому угловой момент системы будет меняться в зависимости от того, как я хотел бы его запустить)
Я следовал за прекрасными примерами, изложенными здесь
http://headmyshoulder.github.io/odeint-v2/examples.html
в частности, пример аттрактора Лоренца.
Первое, что я отмечаю (в моей системе Керра, а не в Лоренце), что для некоторых начальных условий я получаю NaN после момента времени t = 0 (хотя, без сомнения, это предполагает более глубокую ошибку где-то). Чтобы изучить это подробнее, я хотел бы иметь возможность изменять параметры системы без необходимости каждый раз перекомпилировать. Это эквивалентно желанию изменить, скажем, R или сигма без перекомпиляции. Насколько я могу судить, прямого способа передать дополнительные аргументы в функцию интегрирования нет, за исключением, возможно, второго блока кода здесь.
http://headmyshoulder.github.io/odeint-v2/doc/boost_numeric_odeint/tutorial/harmonic_oscillator.html
что я признаюсь, из-за моего отсутствия знаний C ++, я не совсем понимаю.
Я был бы признателен за знание того, как принимать во время выполнения аргументы и передавать их этому решателю, чтобы я мог просто запускать несколько пакетов без компиляции каждый раз.
Вы можете передать параметры времени выполнения системной функции, определяющей ваш ODE:
struct ode
{
double param;
ode( double param ) : m_param( param ) {}
void operator()( state_type const& x , state_type& dxdt , time_type t ) const
{
// your ode
}
};
integrate_const( stepper {} , ode { 0.1 } , x , t_start , t_end , dt , observer );
Я столкнулся с подобной проблемой. То, что я сделал, определило глобальные переменные, чтобы моя функция могла получить доступ к переменной, которую я передал через argvs. Дайте мне знать, если вам нужен пример.