Как решить это обыкновенное дифференциальное уравнение с помощью библиотеки C++ Boost odeint
Используя библиотеку Odeint Boost C++, как решить следующие обыкновенные дифференциальные уравнения движения,
z '' = -n² · z.
Аналитическое решение вышеупомянутого ОДУ
z(t) = (z0'/n)·sin(n·t) + z0·cos(n·t).
Попытка решения согласно комментарию (17 января в 23:01) ОП в ответ
Моя программа:
void ode( const state_type &z , state_type &dzdt , double t ) {
dzdt[0] = z[1];
dzdt[1] = -1 * z[0] * w * w;
}
void write_ode( const state_type &z , const double t ) {
cout << t << '\t' << z[0] << '\t' << z[1] << endl;
}
int main { ...
integrate( ode , z , t , 1000 , 0.1 , write_ode );
}
Но функция интегрирования возвращает только значения z0 и z0'. Мне нужно найти значения z(t).
1 ответ
Вы можете использовать стандартный способ преобразования дифференциального уравнения N-го порядка для ODE первого порядка размерности N. В вашем случае это:
x = z
y = dz/dt
dx/dt = y
dy/dt = n^2 x
Вы можете легко поместить это в любой решатель odeint. Но ваш ODE кажется гамильтоновым - вы также можете подумать о симплектическом решателе. Они сохраняют объем фазового пространства, и энергия "только" колеблется относительно начальной энергии. Odeint реализовал два решателя симплектов.