So erstellen Sie eine rekursive Spline-Funktion in C ++


10

Im Moment arbeite ich an einer Differentialgleichungslösungsmethode namens Basis-Spline-Kollokation. Ich habe Probleme damit, eine Methode zum Erstellen eines Splines beliebiger Ordnung mit der Beziehung zu erstellen. mit dem Anfangsbedingung und ich habe Probleme, selbst mit diesem Problem zu beginnen, da es rekursiv ist und entweder von "oben" oder "unten" beginnen kann, und ich stoße auf einen allgemeinen Schreibblocktyp von der Sache, wo ich mich nicht auf das konzentrieren kann, was ich tun muss.B 1 i (x)={ 1

B.ichk+1(x)=x- -xichxk+ich- -xichB.ichk+xk+ich+1- -xxk+ich+1- -xich+1B.ich+1k(x)
B.ich1(x)={1zum xichx<xich+10Andernfalls

Antworten:



6

Ich unterstütze das NURBS-Buch und möchte auch hervorheben, dass diese rekursive Formel zwar normalerweise die Art und Weise darstellt, wie man die B-Spline-Basis ausdrückt (wie in einem Artikel), aber nicht, wie Sie die Basisfunktionen implementieren. Da alle Funktionen höherer Ordnung auf niedrigerer Ordnung basieren, können Sie alle Funktionen ungleich Null gleichzeitig berechnen und die Auswertungen niedrigerer Ordnung wiederverwenden. So macht es der Piegl-Algorithmus.p+1


4

Ich weiß ehrlich gesagt nicht, wie effizient dies ist, aber eine Möglichkeit, dies zu tun, sind C ++ - Vorlagen:

Die Reihenfolge ist k, t ist die Knotenstruktur und x ist der gewünschte Wert.

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.;
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.