2016-01-17 2 views
0

Использование наддува C++ odeint библиотеки, как решить следующие обыкновенные дифференциальные уравнения движения,Как решить это обыкновенное дифференциальное уравнение с помощью C++ увеличить odeint библиотеки

г «» = -n² · г.

Аналитическое решение вышеупомянутой ODE является

г (т) = (г0'/п) · Sin (п · т) + z0 · сов (п · т).


попытка решения согласно комментарий (Jan 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).

+0

Этот вопрос является слишком абстрактным и концептуальным для переполнения стека. SO больше подходит для получения ответа на конкретную проблему программирования, чем для общего алгоритма (и это, конечно, не для того, чтобы заставить людей писать код для вас). Если у вас есть алгоритм и ваша первая попытка написать код для решения проблемы, этот сайт может помочь вам в деталях. –

+0

z (0) и z '(0) являются исходными значениями и должны быть предоставлены вами. – CroCo

+0

Почему вопрос закрыт? Вопрос не очень хорошо сформулирован, но я не думаю, что этот вопрос нужно закрыть. Здесь есть несколько вопросов, похожих на этот вопрос, и все же они не закрыты. Пожалуйста, пересмотреть его открытие. – CroCo

ответ

2

Вы можете использовать стандартный способ преобразования в N-го порядка дифференциального уравнения первого порядка ОДЫ размерности N. В вашем случае это:

x = z 
y = dz/dt 

dx/dt = y 
dy/dt = n^2 x 

Вы можете легко поместить это в любой решатель odeint. Но ваш ODE кажется гамильтонианным - вы также можете подумать о симплектическом решателе. Они сохраняют объем фазового пространства, а энергия «только» колеблется вокруг начальной энергии. Odeint реализовал два симплектических решателя.

+0

Большое спасибо. Я сделал это, но функция интегрирования возвращает только значения z0 и z0 '. Мне нужно найти значения z (t). Моя программа: 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); }. У вас есть представление о том, как я это делаю? –

+0

Хмм, ваш код выглядит в основном прекрасным. Вы не получаете временную эволюцию z, напечатанную на консоли? Конечно, после вызова интеграла z будет содержать текущее значение z. Если вам нужна полная эволюция в массиве (или векторе), вам нужно изменить своего наблюдателя: vector z_eval; (ode, z, t, 1000, 0.1, [& z_eval] (const state_type & x, double t) {z_eval.push_back (x);}); – headmyshoulder

+0

Пожалуйста, добавьте код и другую соответствующую информацию на вопрос. Это действительно так, и форматирование лучше. При этом вы даже можете получить достаточно голосов, чтобы «повторно открыть» вопрос. – LutzL