2014-02-03 2 views
4

Используя библиотеку odeint boost C++, можно ли решить дифференциальное уравнение второго порядка, определенное следующим образом?Дифференциальное уравнение второго порядка с использованием библиотеки C++ Boost odeint

m*x''[i] + x'[i] = K*\sum{j=1,N} sin(x[j] - x[i]), where i = 1,2,3..N. 
m = 1, K = 1 

где начальное значение x представляет собой вектор или массив из N равномерно сгенерированных случайных чисел от 0 до 2 * pi. Я хочу интегрировать выше уравнение с помощью runge_kutta stepper odeint?

Я могу решить это, написав выше. в двух дифференциальных уравнениях первого порядка, но , тогда в этом случае, как будут записываться или модифицироваться шаги odeint?

ответ

4

Просто преобразуйте ваши уравнения в ODE первого порядка и используйте тип типа состояния 2 N. Первые N записей в настоящее время обрабатывать только x[i] а вторые N записей относятся к скоростям x'[i]

void ode(state_type const& x , state_type &dxdt , double t) 
{ 
    for(size_t i=0 ; i<N ; ++i) 
    { 
     double sum = 0.0; 
     // calculate sum 
     dxdt[i] = x[i+N]; 
     dxdt[i+N] = K * sum; 
    } 
} 

Полный пример может выглядеть

size_t N = 512; 
typedef std::vector<double> state_type; 
state_type x(2 * N); 
// initialize x 
double t_start = 0.0 , t_end = 10.0 , dt = 0.01; 
odeint::integrate(ode , x , t_start , t_end , dt); 
+0

Спасибо много. Ваши предложения действительно полезны. Оно работает. Я застрял с начальными значениями скорости. – ADK

Смежные вопросы