在 ODEINT 中通过 if 语句选择步进器

choose stepper in odeint through if statement

本文关键字:语句 选择 步进 if ODEINT      更新时间:2023-10-16

我想通过这样的if语句选择集成方案:

//stepper_type steppr; ??
if (integration_scheme == "euler") {
[auto] stepper = euler<state_type>{};
}
else
{
[auto] stepper = runge_kutta4<state_type>{};
}

但步进器仅在大括号内有效。 在 if 语句之前要定义的步进器类型是什么? 另一种方法是将积分方案(甚至步进器(作为参数传递给函数。

在 C++17 及以上版本中,为此目的,我们可以按如下方式应用std::variant

#include <variant>
class state_type {};
template<class T>
class euler {};
template<class T>
class runge_kutta4 {};
template<class T>
using stepper_t = std::variant<euler<T>, runge_kutta4<T>>;

然后你可以这样做:

演示

stepper_t<state_type> stepper;
if (integration_scheme == "euler") {
stepper = euler<state_type>{};
}
else{
stepper = runge_kutta4<state_type>{};
}
std::cout << stepper.index(); // prints 0.

但是,尽管我不知道您项目的整个代码,但我认为上述后续代码不会简单。 如果我是你,我会将基础小牛stepperBaseeulerrunge_kutta4定义为stepperBase的继承。