Cómo construir una función spline recursiva en C ++

10

En este momento estoy trabajando en un método de resolución de ecuaciones diferenciales llamado colocación de base-spline. Con lo que tengo problemas es con la construcción de un método para construir una spline de orden arbitrario, con la relación con la condición inicial B 1 i (x)={ 1

Bik+1(x)=xxixk+ixiBik+xk+i+1xxk+i+1xi+1Bi+1k(x)
y tengo problemas incluso para comenzar con este problema, ya que es recursivo podría comenzar desde "arriba" o "abajo", y me encuentro con un tipo de bloque de escritores generales, donde no puedo obtener mi mente en torno a lo que necesito hacer.
Bi1(x)={1for xix<xi+10otherwise
Kane
fuente

Respuestas:

7

Puedo recomendar consultar el libro NURBS , que parece ser un texto clásico sobre este tema. El algoritmo en sí se proporciona en la página 72 , está disponible para su visualización en línea.

faleichik
fuente
6

p+1

Nathan Collier
fuente
4

Sinceramente, no sé qué tan eficiente es esto, pero una forma de hacerlo es con plantillas de c ++:

El orden es k, t es la estructura de nudos y x es el valor que desea.

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
fuente