C ++ 'da özyinelemeli spline işlevi oluşturma


10

Şu anda temel-spline kollokasyonu adı verilen bir diferansiyel denklem çözme yöntemi üzerinde çalışıyorum. Ne ile sorun yaşıyorum ile ilişkisi ile keyfi bir sipariş spline oluşturmak için bir yöntem inşa etmektir ile başlangıç ​​koşulu ve bu sorunla başlamakta bile sorun yaşıyorum, çünkü özyinelemeli "üst" veya "alt" ile başlayabilir ve genel bir yazar bloğu türüne giriyorum yapmam gereken şey hakkında aklımı bulamadığım bir şey.

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

Yanıtlar:



6

Ben NURBS kitap ikinci ve aynı zamanda bu özyinelemeli formül tipik olarak bir B-spline temeli (bir kağıtta olduğu gibi) ifade nasıl olduğunu vurgulamak istiyorum temel fonksiyonları uygulamak değildir. Tüm yüksek dereceli işlevler düşük dereceye dayandığından, tüm sıfır olmayan işlevlerini bir kerede hesaplayabilir ve düşük dereceli değerlendirmeleri yeniden kullanabilirsiniz. Piegl algoritması bunu böyle yapar.p+1


4

Dürüst olmak gerekirse bu ne kadar verimli bilmiyorum, ama bunu yapmanın bir yolu c ++ şablonları ile:

Sıra k, t düğüm yapısı ve x istediğiniz değerdir.

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.;
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.