Jak zbudować rekurencyjną funkcję splajnu w C ++

10

Obecnie pracuję nad metodą rozwiązywania równań różniczkowych zwaną kolokacją podstawa-splajn. Mam problem z budowaniem metody budowania splajnu dowolnego porządku z relacją przy czym warunek początkowy i mam problem nawet z początkiem tego problemu, ponieważ jest on rekurencyjny, może zaczynać się od „górnej” lub „dolnej”, a ja wpadam na ogólny typ bloku pisarzy rzeczy, w których nie mogę się skupić na tym, co muszę zrobić.B 1 i (x)={ 1

bjak+1(x)=x-xjaxk+ja-xjabjak+xk+ja+1-xxk+ja+1-xja+1bja+1k(x)
bja1(x)={1dla xjax<xja+10Inaczej
Kane
źródło

Odpowiedzi:

7

Mogę polecić zapoznanie się z książką NURBS , która wydaje się klasycznym tekstem na ten temat. Sam algorytm jest podany na stronie 72 i jest dostępny do oglądania online.

faleichik
źródło
6

p+1

Nathan Collier
źródło
4

Naprawdę nie wiem, jak to jest wydajne, ale jednym ze sposobów jest użycie szablonów c ++:

Kolejność to k, t to struktura węzłów, a x to żądana wartość.

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.;
};
Andrew Spott
źródło