2014-06-12 11 views
7

Sto provando ad utilizzare la GNU Scientific Library (GSL) per tracciare un percorso uniforme da A a B. Sto usando un API che restituisce un numero piccolo (8 in questo caso) di punti irregolarmente distanziati (in rosso), che si può vedere nella figura seguente:Uso di GNU Scientific Library (GSL) per disegnare un tracciato B-Spline 2D utilizzando punti non equamente distanziati

returned points and desired result from GSL

i punti viola rappresentano i punti che vorrei vedi restituito da GSL.

In primo luogo, questo tipo di forma B-Spline 2D è ottenibile utilizzando GSL? Non so molto su B-Splines, per non parlare delle B-Spline 2D. Sono stato in grado di ottenere l'esempio B-spline mostrato here esecuzione e la creazione di un file .ps liscio senza problemi, ma che esempio utilizza i punti di interruzione uniformi con il seguente codice:

/* use uniform breakpoints on [0, 15] */ 
gsl_bspline_knots_uniform(0.0, 15.0, bw); 

Nel mio caso, visto che i dati da me ho dato è irregolare e non equidistante, dovrei usare nodi non uniformi? Ho provato a utilizzare gsl_bspline_knots(), per utilizzare punti di interruzione non uniformi all'interno del seguente codice di test, ma non sono sicuro se questa sia la direzione giusta oppure no.

#define NCOEFFS 8 // not sure what this number should be - number of data points? 
#define NBREAK (NCOEFFS - 2) 
const size_t nbreak = NBREAK; 

int main (void) { 

    // (example code)... 

    gsl_vector *non_uniform = gsl_vector_alloc(nbreak); 

    // create some random breakpoint values 
    for (i=0; i<nbreak; i++) { 
     double val = gsl_ran_gaussian(r, 2.0); 
     printf("val: %f\n", val); 
     gsl_vector_set(non_uniform, i, val); 
    } 

    gsl_bspline_knots(non_uniform, bw); 

    // (more example code)... 
} 

ulteriormente più, come faccio tradurre l'esempio precedente per disegnare B-spline in 2D x/y coordinate spazio? Se GNU Scientific Library non è adatto a questo, qualcuno potrebbe suggerire una libreria C/C++ più adatta?

Qualsiasi aiuto o indicazioni nella direzione sarebbe molto apprezzato.

risposta

2

Prima: spline Basis 1D

Dato un insieme di punti di interruzione NBREAK(t_1, ..., t_{NBREAK}), ci sono cubi B-spline componenti B_j(t). Queste funzioni e le loro derivate prima e seconda sono sempre continue, anche ai punti di interruzione. Di conseguenza, qualsiasi adattamento dato dalla combinazione lineare f(t) = \sum m_j B_j(t) condividerà anche queste proprietà (simili alle spline cubiche naturali). Il numero di componenti b-spline, NCOEFFS, non deve necessariamente essere uguale al numero di punti dati, NDATA. Se NCOEFFS < NDATA, è necessario utilizzare la minimizzazione quadrata minima per ottenere l'adattamento (la documentazione GSL ha un buon esempio di calcolo minimo quadrato minimo per ottenere un adattamento b-spline here). NCOEFFS < NDATA è una buona scelta quando i dati contengono rumore che non sembra essere il tuo caso

Il motivo per cui il numero di coefficienti non è uguale al numero di punti di interruzione, , è correlato al fatto che non si specifica una condizione al contorno quando si tratta di spline di base. Dato che le persone di solito hanno più familiarità con le spline cubiche naturali, vale la pena di commentare che impone la condizione al contorno d^2f(x)/dx^2=0. Questo è il motivo per cui qualsiasi rappresentazione di spline cubiche naturali utilizzando la base polinomiale cubica avrebbe NCOEFFS=NBREAK. Here is a link a una spiegazione molto buona del conteggio dei gradi di libertà dati dai coefficienti dei polinomi cubici che rappresentano sia le naturali b-spline che il numero di equazioni necessarie per imporre la continuità di f(t), df(t)/dt e d^2f(t)/dt^2).

Infine: Adattare una curva parametrica utilizzando le b-splines.

avete la serie di "dati" punti (x_1, y_1)....(x_{NDATA},y_{NDATA}) e si desidera costruire una forma parametrica P(t)=(f_1(t), f_2(t)). B-spline Fit non passerà attraverso tutti i punti di dati se NCOEFFS<NDATA (si può pretendere che se si sceglie con cura i punti di interruzione e NCOEFFS=N_DATA). Nella mia ricerca, io lavoro solo con attacchi non parametriche 1D (y=f(x)) ma credo che questo caso parametrico è simile. Vorrei provare il seguente

PASSO 1: Creare il set di "dati" punti (t, x) = {(1, x_1), (2, x_2)...(NDATA, x_{NDATA})} e utilizzare gsl 1D b-spline per adattarli. Questa misura ti darà f_1(t) = sum_{i=1}^{NCOEFFS} mx_j B_j(t) con t \in [1,NDATA].

FASE 2: Ora costruire la serie di "dati" punti (t, y) = {(1, y_1), (2, y_2)...(NDATA, y_{NDATA})} e l'impiego B-spline per farli stare. Questo vi fornirà f_2(t) = sum_{i=1}^{NCOEFFS} my_j B_j(t) con t \in [1,NDATA]

Ora tracciare P(t)=(f_1(t), f_2(t)), t \in [1,NDATA]. Fondamentalmente, ho mappato un problema di curva parametrica 2 D in 2 accoppiamenti non parametrici 1D (che è ciò che fornisce GSL).

L'ultimo punto è la scelta di punti di interruzione (e il numero dei componenti base NCOEFFS) nella fase 1 e fase 2. Fino a quando si coprono la gamma t\in[1, NDATA] e NCOEFFS <= NDATA, la scelta dei punti di interruzione è arbitrariamente. Credo che se si scelgono i punti di interruzione da {1, 3, ..., NDATA-2, NDATA } l'adattamento passerà attraverso i punti dati (notare che ho saltato i punti interni t=2 e t=NDATA-1 tali che NBREAK=NDATA-2 e NCOEFFS=NDATA). Questo è il modo NAG biblioteca seleziona i punti di interruzione per ottenere una misura di interpolazione (che significa: una misura che passano attraverso gli punti di dati).

+0

La ringrazio molto per la risposta in profondità di Vinicio. Probabilmente mi ci vorrà un giorno o due per digerirlo e comprenderlo davvero. Per me è chiaro che ho bisogno di imparare molto di più riguardo ai fondamenti delle spline. –

+0

Se leggete con attenzione l'esempio nella documentazione GSL, allora si vedrà che l'attuazione pratica della 1D non parametrica fit b-spline non è molto complicato. Seguilo per ottenere f_1 (t) e f_2 (t). –

Problemi correlati