Как решить это обыкновенное дифференциальное уравнение с помощью библиотеки 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 реализовал два решателя симплектов.

Другие вопросы по тегам