Как построить рекурсивную функцию сплайна в C ++

10

Сейчас я работаю над методом решения дифференциальных уравнений, который называется базис-сплайн-коллокацией. У меня возникли проблемы с созданием метода построения сплайна произвольного порядка с соотношением с начальным условием B 1 i (x)={ 1

ВяК+1(Икс)знак равноИкс-ИксяИксК+я-ИксяВяК+ИксК+я+1-ИксИксК+я+1-Икся+1Вя+1К(Икс)
и у меня возникают проблемы даже с этой проблемой, так как она рекурсивна, может начинаться либо с «верха», либо с «низа», и я сталкиваюсь с обычным типом блоков писателей, где я не могу получить мой разум вокруг того, что мне нужно сделать.
Вя1(Икс)знак равно{1за ИксяИкс<Икся+10в противном случае
Kane
источник

Ответы:

7

Я могу порекомендовать обратиться к книге NURBS , которая кажется классическим текстом на эту тему. Сам алгоритм приведен на странице 72 , он доступен для онлайн просмотра.

faleichik
источник
4

Честно говоря, я не знаю, насколько это эффективно, но один из способов сделать это с помощью шаблонов c ++:

Порядок k, t это структура узла, а x это желаемое значение.

template <int k> 
real BSpline(real x, real *t)
{
    if (*t <= x && x < *(t+k))
    {
        real a = (x - *t) / (*(t+k-1) - *t);
        real b = (*(t+k) - x) / (*(t+k) - *(t+1));

        return a * BSpline<k-1>(x, t) + b * BSpline<k-1>(x, (t+1));
    }
    else
        return 0;
};

template <>
real BSpline<1>(real x, real *t)
{
    if (*t <= x && x < *(t+1))
        return 1.;
    else
        return 0.;
};
Эндрю Спотт
источник