Come creare una funzione spline ricorsiva in C ++


10

Al momento sto lavorando a un metodo di risoluzione delle equazioni differenziali chiamato collocazione base-spline. Ciò di cui sto avendo problemi è la costruzione di un metodo per costruire una spline di ordine arbitrario, con la relazione con la condizione iniziale B 1 i (x)={ 1

Bik+1(x)=xxixk+ixiBik+xk+i+1xxk+i+1xi+1Bi+1k(x)
e ho problemi anche a partire da questo problema, in quanto è ricorsivo potrebbe iniziare sia dal "top" che dal "bottom", e sto incontrando un tipo di blocco di scrittori generali, dove non riesco a ottenere la mia mente su ciò che devo fare.
Bi1(x)={1for xix<xi+10otherwise

Risposte:


7

Posso consigliare di consultare il libro NURBS , che sembra essere un classico testo su questo argomento. L'algoritmo stesso è riportato a pagina 72 , è disponibile per la visualizzazione online.



4

Onestamente non so quanto sia efficiente, ma un modo per farlo è con i modelli c ++:

L'ordine è k, t è la struttura del nodo e x è il valore desiderato.

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.;
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.