2016-06-09 1 views
0

Я пытаюсь изучить решение проблемы ODE с помощью библиотеки ODEINT в следующем примере. Однако, когда я выводя результат, шаг времени просто прыгает через 0; 1; 5,5; 25 ... Есть ли способ контролировать этот временной шаг, чтобы увеличить его на «1». Благодаря!Временной шаг управления с использованием odeint (Boost)

#include <iostream> 
#include <boost/array.hpp> 

#include <boost/numeric/odeint.hpp> 

using namespace std; 
using namespace boost::numeric::odeint; 

const double sigma = 0.0018; 


typedef std::vector<double> state_type; 

void my_ode(const state_type &x , state_type &dxdt , int t) 
{ 
    dxdt[0] = sigma * x[0]*(1 - x[0]); 

} 

void write_ode(const state_type &x , const double t) 
{ 
    cout << t << '\t' << x[0] << endl; 
} 

int main(int argc, char **argv) 
{ 
    state_type x(1); // Initial condition, vector of 1 element (scalar problem) 
    x[0] = 0.001; 
    integrate(my_ode , x , 0.0 , 6000.0 , 1.0 , write_ode); 
} 

ответ

0

Да, есть простой способ сделать это. В учебнике полно примеров.

Вам необходимо определить конкретный решатель. Хорошим выбором может быть плотный выходной решатель, который имеет контроль размера шага и позволяет вычислить решение на произвольных временных шагах. Он может использоваться как

// not tested 
state_type x(1); 
x[0] = 0.001; 
auto rkd = runge_kutta_dopri5<state_type>{}; 
auto stepper = make_dense_output(1.0e-6, 1.0e-6, rkd); 
integrate_const(stepper, x, 0.0, 6000.0, 1.0, write_ode); 
+0

Я проверил ваши коды, но не работал. Однако это сработало: state_type x = {0.001}; // начальные условия typedef dense_output_runge_kutta >> stepper_type; integrate_const (stepper_type(), ode_system, x, 0.0, 500.0, 1.0); Еще один вопрос: как получить время «t» как глобальную переменную? Я хочу использовать это как условие для других функций (например, под my_ode())? Спасибо – hieu

+0

Я не понимаю ваш вопрос о том, что t является глобальной переменной. Он локальный, и он будет передан в оде по значению, что означает, что он может быть не глобальным. Что вы хотите с этим делать? – headmyshoulder

+0

Я хочу использовать «t» для установки условия под my_ode(): like: if (t <450), тогда dxdt [0] = 0, а dxdt [0] = sigma * x [0] * (1 - x [0]); Это то же самое относится к этому вопросу ODEINT, но на python: http://stackoverflow.com/questions/16520101/update-initial-condition-in-ode-solver-each-time-step/39029114#39029114 – hieu