这是前面两个问题的组合:
我需要解决以下微分方程,
在哪里是一个参数并且是时间。我需要的价值观在特定时间; 在哪里是一个对数间距数组,来自到. 在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使用密集输出步进器会有所帮助 - 正如第二个问题中所建议的那样 - 但我不明白如何实现非常量步骤。任何指导将不胜感激。