У меня проблемы с компиляцией кода для интеграции кубического c сплайна.
Я дал список чисел, из которых я вычисляю кубический c сплайн с помощью функции в boost. Пока это работает. Теперь я хочу вычислить, например, длину сплайна или площадь под ним, поэтому мне нужно интегрировать. Но как передать интегратору функцию сплайна? Я использую интегратор для ODE, доступных в boost. Я попытался передать интегратор как класс с оператором (), но код не компилируется с сообщением об ошибке:
no type named 'type' in 'struct boost::enable_if<mpl_::bool_<false>, long long unsigned int>'
no matching function for call to 'integrate(integration_of_spline&, double&, double&, double&, double&, boost::numeric::odeint::null_observer)'
Мой код:
#include <iostream>
#include <vector>
#include <boost/math/interpolators/cardinal_cubic_b_spline.hpp>
#include <boost/numeric/odeint.hpp>
int main()
{
//create vector
std::vector<double> y_values = {0.0, 1.5, 5.0, 11.0, 13.0};
double step = 0.25;
//create spline
boost::math::interpolators::cardinal_cubic_b_spline<double> spline(y_values.data(), y_values .size(), 0, step);
//create rhs of ODE
class integration_of_spline {
public:
integration_of_spline ( boost::math::interpolators::cardinal_cubic_b_spline<double> &spline ) : spline(spline) { }
void operator()( const double &L , double &dLdt , const double t ) const
{
dLdt = this->spline(t);
return;
}
private:
boost::math::interpolators::cardinal_cubic_b_spline<double> spline;
};
//initial condition
double L = 0.0;
// Test: these all work
integration_of_spline integrator(spline);
double dLdt = 0;
integrator(L,dLdt,0.8);
std::cout << "dLdt test " << dLdt << std::endl;
std::cout << "spline(0.8) " << spline(0.8) << std::endl; //dLdt=spline(0.8) accordingly
//Integration. This step fails
boost::numeric::odeint::integrate( integrator, L , 0.0 , 1.0 , step );
//This also fails
boost::numeric::odeint::integrate( integration_of_spline(spline) , L , 0.0 , 1.0 , step );
return 0;
}
У меня такое ощущение, что это как-то связано с тем, как я передаю сплайн классу, но я не могу этого понять. Похоже, оператор () работает правильно.
Документация по сплайнам находится здесь boost spline . Я хочу сделать что-то похожее на пример boost odeint , но еще проще в том смысле, что тип состояния - одно значение.