2013-05-29 16 views
5

Ho un sacco di punti in 2D per cui conosco il valore, e mi piacerebbe inserire una spline cubica attraverso di essi per interpolare altri dati usando MATLAB.Perché dovrebbe restituire NaN in MATLAB

mio codice è simile:

fitobject = fit(x,y,'cubicinterp'); 
yy=feval(fitobject,xx) 

con i seguenti ingressi:

Coordinate

x = [... 
    313  3; 
    313  5; 
    313  7; 
    315  3; 
    315  5; 
    317  3; 
    319  5]; 

Valori

y = [... 
    28.0779; 
    28.0186; 
    11.6220; 
    16.7640; 
    23.7139; 
    -14.7882; 
    -20.4626]; 

interpolazione punti

xx = [... 
    313  3; 
    313  4; 
    313  5; 
    313  6; 
    313  7; 
    313  8; 
    313  9; 
    314  3; 
    314  5; 
    314  7; 
    315  3; 
    315  4; 
    315  5; 
    315  6; 
    315  7; 
    316  3; 
    316  5; 
    317  3; 
    317  4; 
    317  5; 
    318  3; 
    319  5; 
    319  6; 
    319  7; 
    320  5]; 

Nella mia uscita vettore yy, ottengo diversi NaN valori. Per me, i dati di input sembrano puliti (sono tutti valori finiti e non c'è NaN). Non capisco che cosa potrebbe causare feval per restituire NaN durante l'adattamento dei dati. Perché non potrebbe dare la migliore forma possibile, anche se è cattiva? C'è un errore nel mio approccio?

Ho sfogliato un po 'e sembra che la stessa domanda sia stata posta un sacco di volte sui forum di matematica, ma nessuno ha dato una risposta chiara.

Grazie in anticipo per il vostro aiuto.

+0

Non ho la toolbox adatta alla curva. Avete un modo per esaminare la funzione adattata? Forse alcuni dei punti dati che utilizzi per valutare la funzione adattata sono tali da causare ['NaN'] (http://www.mathworks.com/help/matlab/ref/nan.html) – Schorsch

+0

Puoi usare' yy = fitobject (xx) 'anche la sintassi –

risposta

7

E 'a causa di un interpolazione non può essere utilizzato come un estrapolazione:

%xx(:,1) xx(:,2) yy 

    313.0000 3.0000 28.0779 
    313.0000 4.0000 29.5074 
    313.0000 5.0000 28.0186 
    313.0000 6.0000 22.3233 
    313.0000 7.0000 11.6220 
    313.0000 8.0000  NaN % xx exceeds bounds of original x interval 
    313.0000 9.0000  NaN % xx exceeds bounds of original x interval 
    314.0000 3.0000 24.1239 
    314.0000 5.0000 27.5130 
    314.0000 7.0000  NaN % xx exceeds bounds of original x interval 
    315.0000 3.0000 16.7640 
    315.0000 4.0000 21.7028 
    315.0000 5.0000 23.7139 
    315.0000 6.0000 11.2710 
    315.0000 7.0000  NaN % xx exceeds bounds of original x interval 
    316.0000 3.0000 1.4641 
    316.0000 5.0000 13.9662 
    317.0000 3.0000 -14.7882 
    317.0000 4.0000 -5.4876 
    317.0000 5.0000 2.7781 
    318.0000 3.0000  NaN % xx exceeds bounds of original x interval 
    319.0000 5.0000 -20.4626 
    319.0000 6.0000  NaN % xx exceeds bounds of original x interval 
    319.0000 7.0000  NaN % xx exceeds bounds of original x interval 
    320.0000 5.0000  NaN % xx exceeds bounds of original x interval 

In altre parole, si sta cercando di ottenere i dati oltre i confini dei vostri dati di superficie originali (estrapolazione), che di solito è già abbastanza pericoloso, e fit non ti permette nemmeno di farlo.

+0

Perfetto, grazie. Pensavo che "in forma" usasse il mucchio di punti che ho dato come input per restituire una funzione definita ovunque. – Virginie

+0

@Virginie: se vuoi, puoi passare a 'nearestinterp' per copiare i valori * su * il bordo, o' biharmonicinterp' per continuare fuori dal limite.Nota che i tuoi valori esploderanno completamente in quel caso; un effetto collaterale di base dell'uso di un'interpolazione * precisa * per * estrapolazione * :) –

+0

Ora che capisco cosa sta succedendo penso che abbia più senso prendersi cura solo dei valori nell'intervallo di interpolazione. Grazie comunque per il trucco! – Virginie

6

Sembra che i punti che emergono come NaN giacciono al di fuori dell'interpolazione. Puoi tracciarlo per dare un'occhiata.

cubic interpolation

Il codice che ho usato per giocare con questo è la seguente: (Nota che ho impostato il NaNs a -25 solo in modo che possano essere tracciati)

x = [313  3; 
    313  5; 
    313  7; 
    315  3; 
    315  5; 
    317  3; 
    319  5]; 
y = [ 
    28.0779 
    28.0186 
    11.6220 
    16.7640 
    23.7139 
    -14.7882 
    -20.4626]; 

fitobject = fit(x,y,'cubicinterp'); 

xx = [ 
    313  3 
    313  4 
    313  5 
    313  6 
    313  7 
    313  8 
    313  9 
    314  3 
    314  5 
    314  7 
    315  3 
    315  4 
    315  5 
    315  6 
    315  7 
    316  3 
    316  5 
    317  3 
    317  4 
    317  5 
    318  3 
    319  5 
    319  6 
    319  7 
    320  5]; 


yy = fitobject(xx); 
badindices = isnan(yy); 
yy(badindices) = -25; 

plot(fitobject, xx, yy, 'Exclude', badindices) 

Tra l'altro, si noti che non sto utilizzando feval, ma una chiamata diretta a fitobject

+2

+ 1: Sempre un +1 per una buona risposta accompagnata da una trama :) –

+0

La trama è esattamente quello che volevo vedere. Non sapevo nemmeno di poter chiamare fitobject direttamente. Risposta molto utile, grazie! – Virginie