【问题标题】:Passing runtime parameters to odeint integrator将运行时参数传递给 odeint 积分器
【发布时间】:2016-02-24 17:24:09
【问题描述】:

我想使用 odeint boost 积分器来查看 Kerr 时空中的测地线曲线。这需要为各种参数值运行积分器(我有初始条件和初始动量向量,因此系统的角动量会根据我想要的启动方式而有所不同)

我一直在关注这里列出的优秀示例

http://headmyshoulder.github.io/odeint-v2/examples.html

特别是 Lorenz 吸引子示例。

我注意到的第一件事(在我的 Kerr 系统中,而不是 Lorenz 中)是,对于某些初始条件,我在 t=0 时间点之后得到 NaN(尽管毫无疑问,这表明某处存在更深层次的错误)。为了进一步探索这一点,我希望能够更改系统的参数,而不必每次都重新编译。这相当于想要改变,比如 R 或 sigma 而不重新编译。据我所知,没有直接的方法可以将额外的参数传递给集成函数,除了这里的第二个代码块

http://headmyshoulder.github.io/odeint-v2/doc/boost_numeric_odeint/tutorial/harmonic_oscillator.html

我承认,由于我缺乏 C++ 知识,我不太明白。

我希望了解如何接收运行时参数并将它们传递给这个求解器,这样我就可以运行一堆批次而无需每次都编译。

【问题讨论】:

  • 这是一个完整的基于模板的编译时解决方案,您不能将运行时参数作为模板参数传递。
  • 不,您可以将运行时参数传递给 odeint。

标签: c++ boost boost-units


【解决方案1】:

您可以将运行时参数传递给定义 ODE 的系统函数:

struct ode
{
    double param;
    ode( double param ) : m_param( param ) {}

    void operator()( state_type const& x , state_type& dxdt , time_type t ) const 
    {
        // your ode
    }
};

integrate_const( stepper {} , ode { 0.1 } , x , t_start , t_end , dt , observer );

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。我所做的是定义全局变量,以便我的函数可以访问我通过 argvs 传递的变量。如果您需要示例,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 2012-05-05
      • 2018-02-06
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多