Cara membangun fungsi spline rekursif dalam C ++

10

Saat ini saya sedang mengerjakan metode penyelesaian persamaan diferensial yang disebut kolokasi basis-spline. Apa yang saya mengalami masalah adalah membangun metode untuk membangun spline pesanan sewenang-wenang, dengan hubungan dengan kondisi awal B 1 i (x)={ 1

Bik+1(x)=xxixk+ixiBik+xk+i+1xxk+i+1xi+1Bi+1k(x)
dan saya mengalami kesulitan bahkan mulai dengan masalah ini, karena bersifat rekursif pada dapat mulai dari "atas" atau "bawah", dan saya berlari ke penulis umum blok jenis hal, di mana saya tidak bisa mendapatkan pikiran saya di sekitar apa yang perlu saya lakukan.
Bi1(x)={1for xix<xi+10otherwise
Kane
sumber

Jawaban:

7

Saya dapat merekomendasikan membaca buku The NURBS , yang tampaknya menjadi teks klasik tentang hal ini. Algoritma itu sendiri diberikan pada halaman 72 , tersedia untuk dilihat secara online.

faleichik
sumber
6

p+1

Nathan Collier
sumber
4

Sejujurnya saya tidak tahu seberapa efisien ini, tetapi salah satu cara untuk melakukannya adalah dengan templat c ++:

Urutannya adalah k, t adalah struktur simpul, dan x adalah nilai yang Anda inginkan.

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
sumber