Як побудувати рекурсивну функцію сплайна в C ++


10

На даний момент я працюю над методом розв'язання диференціальних рівнянь, який називається колокалізація базисно-сплайн. З чим у мене виникають проблеми - це побудова методу побудови сплайну довільного порядку із співвідношенням з початкова умова і у мене виникають проблеми, навіть коли я починаю цю проблему, оскільки рекурсивна робота може починатися з "верхнього" або "нижнього", і я стикаюсь із загальним типом блоку авторів Зрештою, там, де я не можу зрозуміти, що мені потрібно зробити.B 1 i (x)={ 1

Bik+1(x)=xxixk+ixiBik+xk+i+1xxk+i+1xi+1Bi+1k(x)
Bi1(x)={1for xix<xi+10otherwise

Відповіді:


7

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


6

Я є другою книгою NURBS, а також хотів би підкреслити, що хоча ця рекурсивна формула, як правило, виражає основу B-сплайну (як у статті), це не те, як ви реалізуєте основні функції. Оскільки всі функції вищого порядку базуються на нижчому порядку, ви можете обчислити всі не нульові функції одночасно і повторно використовувати оцінки нижчого порядку. Ось так це робить алгоритм Піеля.p+1


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.;
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.