在boost::odein中指定插值时间

2024-06-03 04:08:51 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我已经开始在我的C++代码中使用^ {CD1>},我想我缺少了其他积分器中的一个简单的特性,即Scipy的^ {< CD2>}。你知道吗

scipy.odeint允许用户指定必须将状态添加到输出状态历史记录的时间。scipy.odeint是一个可变的timestep积分器,其一个线性调用如下所示(状态从初始条件X0集成,并在times中指定的时间内插/存储)

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

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

基本上,我在boost::odeint中寻找一个类似的特性,以便做两件事:

  1. 将状态从t0传播到tf,但只检索状态的最终值。我想如果内部时间满足t == tf,我可以编写一个只存储状态的观察器,但这看起来是一个相当丑陋的黑客。如果我想让积分器选择适当的内部时间步来满足容差值,那么存储中间状态是一个不必要的负担。你知道吗
  2. 将状态从t0传播到tf,但在预先指定的时间存储状态,这些时间不一定均匀分布,方式与上面对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,而不让我指定存储时间。你知道吗

我该怎么办?你知道吗


Tags: 代码状态tf时间积分器scipy特性times
1条回答
网友
1楼 · 发布于 2024-06-03 04:08:51

似乎您正在寻找^{}函数:

它允许您指定调用观察者的精确时间范围,如有必要,可以调整步长以精确到达每个时间步长。你知道吗

特别是对于自适应方法,这非常有用,因为它在指定的精确时间计算解,同时仍然控制时间步长不超过错误界限。你知道吗

所以你现在的电话可以改成

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));

相关问题 更多 >