2013-05-29 15 views
5

Ich habe eine Menge Punkte in 2D, für die ich den Wert kenne, und ich möchte einen kubischen Spline durch sie einfügen, um einige andere Daten mit MATLAB zu interpolieren.Warum würde Feval NaN in MATLAB zurückgeben?

Mein Code sieht so aus:

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

mit folgenden Eingaben:

Koordinaten

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

Werte

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

Stützpunkten

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]; 

In meinem Ausgangsvektor yy, erhalte ich mehrere NaN Werte. Für mich sehen die Eingabedaten sauber aus (sie sind alle endliche Werte und es gibt keine NaN). Ich bekomme nicht, was feval veranlassen würde, NaN zurückzugeben, wenn Daten gepasst werden. Warum konnte es nicht die bestmögliche Passform geben, auch wenn es schlecht ist? Ist mein Ansatz fehlerhaft?

Ich blätterte ein wenig und es scheint, dass die gleiche Frage ein paar Mal in Mathfors Foren gestellt wurde, aber niemand gab eine klare Antwort.

Vielen Dank im Voraus für Ihre Hilfe.

+0

Ich habe nicht die Kurven-Toolbox. Haben Sie eine Möglichkeit, die angepasste Funktion zu untersuchen? Vielleicht sind einige der Datenpunkte, die Sie zum Bewerten der angepassten Funktion verwenden, so beschaffen, dass sie ['NaN'] ( – Schorsch

+0

) verursachen yy = fitobject (xx) 'Syntax zu –

Antwort

7

Es ist, weil eine Interpolation nicht als Extrapolation verwendet werden:

%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 

Mit anderen Worten: Sie versuchen, Daten über die Grenzen der ursprünglichen Oberflächendaten (Extrapolation) zu erhalten, die ist in der Regel schon ziemlich gefährlich, und fit erlaubt es Ihnen nicht einmal, es zu tun.

+0

Perfekt, danke. Ich dachte, "fit" würde die Menge der Punkte verwenden, die ich als Eingabe gegeben habe, um eine überall definierte Funktion zurückzugeben. – Virginie

+0

@Virginie: Wenn Sie möchten, können Sie zu 'nearestinterp' wechseln, um die Werte * auf * den Rand zu kopieren, oder' biharmonicinterp', um außerhalb der Grenze fortzufahren.Beachten Sie, dass Ihre Werte in diesem Fall vollständig explodieren werden. ein grundlegender Nebeneffekt der Verwendung einer genauen * Interpolation * für * Extrapolation * :) –

+0

Nun, da ich verstehe, was vor sich geht, denke ich, dass es sinnvoller ist, nur auf Werte innerhalb des Interpolationsintervalls zu achten. Danke für den Trick trotzdem! – Virginie

6

Es sieht so aus, als ob die Punkte, die als NaN auftauchen, außerhalb der Interpolation liegen. Sie können es sich ansehen, um es sich anzusehen.

cubic interpolation

Der Code, den ich mit spielen verwendet, um dies wie folgt: (Beachten Sie, dass ich die NaNs so eingestellt, bis -25 nur, dass sie aufgetragen werden konnten)

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) 

By the way, Beachten Sie, dass ich nicht Feval, aber einen direkten Anruf an fitobject

+2

+ 1: Immer ein +1 für eine gute Antwort, begleitet von einer Handlung :) –

+0

Die Handlung ist genau das, was ich sehen wollte. Ich wusste nicht, dass ich auch direkt fitobject anrufen könnte. Sehr hilfreiche Antwort, danke! – Virginie

Verwandte Themen