Как интегрировать сплайн cubi c? - PullRequest
1 голос
/ 28 мая 2020

У меня проблемы с компиляцией кода для интеграции кубического 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 , но еще проще в том смысле, что тип состояния - одно значение.

...