当时间是对数间隔时如何求解 ODE

计算科学 数字 C++
2021-12-20 20:52:31

这是前面两个问题的组合:

我需要解决以下微分方程fN,

ddtfN(k,t)=D(k,t)[fN(k,t)fNeq(k,t)]

在哪里k是一个参数并且t是时间。我需要的价值观fN在特定时间t=T; 在哪里T是一个对数间距数组,来自106103. Python,如第一个链接中所建议的,我会做这样的事情:

solve_ivp(lambda t, y: ODE__system(t, y), 
                     t_span=(1e-6, 1e3), y0=[0], t_eval=T, vectorized=False, 
                     method='BDF', rtol=1e-12, atol=1e-15)

我需要在C++. 对于日志间隔时间,我有以下代码:

std::vector<double> logspace(double a, double b, int k) {
  /*
  y = linspace(start, stop, num=num, endpoint=endpoint, axis=axis)
  if dtype is None:
      return _nx.power(base, y)
  return _nx.power(base, y).astype(dtype, copy=False)
  */
  const auto exp_scale = (b - a) / (k - 1);
  std::vector<double> logspace;
  logspace.reserve(k);
  for (int i = 0; i < k; i++) {
    logspace.push_back(a + i * exp_scale);
  }
  std::for_each(logspace.begin(), logspace.end(),
                [](double &x) { x = pow(10, x); });
  return logspace;
}

...


std::vector<double> T = logspace(-6, 3, 500);

关于 ODE,我认为boost::odeint使用密集输出步进器会有所帮助 - 正如第二个问题中所建议的那样 - 但我不明白如何实现非常量步骤。任何指导将不胜感激。

0个回答
没有发现任何回复~