具有固定步长的 ode 求解器
ode solver with fixed step size
我想知道odeint
中的步长是否固定。在stepper
The basic stepper concept. A basic stepper following this Stepper
concept is able to perform a single step of the solution x(t) of an
ODE to obtain x(t+dt) using a given step size dt.
在我下面的代码中,
#include <iostream>
#include <boost/numeric/odeint.hpp>
using namespace std;
using namespace boost::numeric::odeint;
/* The type of container used to hold the state vector */
typedef std::vector< double > state_type;
const double gam = 0.15;
void sys( const state_type &x , state_type &dx , double t )
{
dx[0] = x[1];
dx[1] = -x[0] - gam*x[1];
static int count(0);
cout << "count in sys: " << count << endl;
++count;
}
int main(int argc, char **argv)
{
const double dt = 0.1;
runge_kutta_dopri5<state_type> stepper;
state_type x(2);
// initial values
x[0] = 1.0;
x[1] = 0.0;
int count(0);
double t = 0.0;
for ( size_t i(0); i < 100; ++i, t+=dt ){
stepper.do_step(sys , x , t, dt );
cout << "count in main: " << count << endl;
++count;
}
return 0;
}
在上面的代码中,我有两个计数器,一个在 sys
函数中传递给 do_step
以解决 ode
另一个计数器在 [=16= 中] 功能。输出结果如下
count in sys: 598
count in sys: 599
count in sys: 600
count in main: 99
Press any key to continue . . .
这是否意味着步长不固定,因为 sys
在 main
中被调用了不止一次?
您的步进器的步长是固定的。每一步调用系统函数6次。详细地说,它执行 6 个欧拉步长,每个步长不同,并进行某种平均以提高解决方案的准确性。
我想知道odeint
中的步长是否固定。在stepper
The basic stepper concept. A basic stepper following this Stepper concept is able to perform a single step of the solution x(t) of an ODE to obtain x(t+dt) using a given step size dt.
在我下面的代码中,
#include <iostream>
#include <boost/numeric/odeint.hpp>
using namespace std;
using namespace boost::numeric::odeint;
/* The type of container used to hold the state vector */
typedef std::vector< double > state_type;
const double gam = 0.15;
void sys( const state_type &x , state_type &dx , double t )
{
dx[0] = x[1];
dx[1] = -x[0] - gam*x[1];
static int count(0);
cout << "count in sys: " << count << endl;
++count;
}
int main(int argc, char **argv)
{
const double dt = 0.1;
runge_kutta_dopri5<state_type> stepper;
state_type x(2);
// initial values
x[0] = 1.0;
x[1] = 0.0;
int count(0);
double t = 0.0;
for ( size_t i(0); i < 100; ++i, t+=dt ){
stepper.do_step(sys , x , t, dt );
cout << "count in main: " << count << endl;
++count;
}
return 0;
}
在上面的代码中,我有两个计数器,一个在 sys
函数中传递给 do_step
以解决 ode
另一个计数器在 [=16= 中] 功能。输出结果如下
count in sys: 598
count in sys: 599
count in sys: 600
count in main: 99
Press any key to continue . . .
这是否意味着步长不固定,因为 sys
在 main
中被调用了不止一次?
您的步进器的步长是固定的。每一步调用系统函数6次。详细地说,它执行 6 个欧拉步长,每个步长不同,并进行某种平均以提高解决方案的准确性。