python - 在 boost::odeint 中指定插值时间

标签 python c++ boost odeint

我已经开始在我的 C++ 代码中使用 boost::odeint,我认为我缺少其他集成器中提供的一个简单功能,即 Scipy 的 odeint

scipy.odeint 允许用户指定必须将状态添加到输出状态历史记录的时间。scipy.odeint 是一个可变时间步积分器,它的一个 -线性调用看起来像这样(状态从初始条件 X0 开始积分,并在 times 中指定的时间进行插值/存储)

X = scipy.odeint(dxdt,X0,times,atol = 1e-13,rtol = 1e-13) 

其中 X 是一个矩阵,其行数与 times 中的元素数相同

基本上,我在 boost::odeint 中寻找类似的功能,以便做两件事:

  1. 将状态从 t0 传播到 tf,但只检索状态的最终值。我认为如果内部时间满足 t == tf,我可以编写一个只存储状态的观察者,但这看起来像是一个相当丑陋的 hack。如果我想让集成器选择合适的内部时间步长以满足容差值,存储中间状态是不必要的负担。
  2. 将状态从 t0 传播到 tf 但在预先指定的时间存储状态,这些时间不一定均匀分布,与调用 的方式类似code>scipy.odeint 上文,同时还让集成商选择适当的内部时间步长。

我最接近实现的是以下

size_t steps = integrate_adaptive( make_controlled< error_stepper_type >( 1.0e-10 , 1.0e-16 ) , 
    dynamics , x , 0.0 , 10.0 , 1. , push_back_state_and_time( x_vec , times ));

满足了公差,但所有状态都由观察者存储到 x_vec 中,没有让我指定存储时间应该是多少。

我应该如何进行?

最佳答案

看来您正在寻找 integrate_times功能:

它允许您指定将调用观察者的确切时间范围,如有必要,调整步长以准确达到每个时间步。

特别是对于自适应方法,这非常有用,因为它会在您指定的确切时间计算解决方案,同时仍然控制时间步长不超过误差范围。

因此您当前的电话可以修改为类似

auto stepper = make_controlled<error_stepper_type>( 1.0e-10 , 1.0e-16 );
// std::vector<time> times;
// std::vector<state> x_vec;
// time tstep;
auto tbegin = times.begin();
auto tend = times.end();
integrate_times(stepper, dynamics, x, tbegin, tend, tstep, push_back_state(x_vec));

关于python - 在 boost::odeint 中指定插值时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47806199/

相关文章:

python - 列出元素而不手动指定它们

python - 在 Gnome Shell 中显示通知

python - django-admin 自定义命令中的两个参数

c++ - 在以读/写/追加模式打开文件后,我可以检测到文件的预先存在吗?

c++ - 如何创建可以同时处理多个客户端的 Boost.Asio 服务器?

用于可视化、操作和导出数据点的 JavaScript?

c++ - STL通过 map C++反向循环

c++ - 为///在 Visual Studio 2010 C++ 中生成 XML 文档注释

c++ - 返回带有 void 的函数的设计含义

c++ - boost asio 套接字 : fastest way to read file from hard drive?