2013-05-29 5 views
5

私は値を知っている2Dの点をたくさん持っており、MATLABを使って周りの他のデータを補間するために3次スプラインをフィットさせたいと思います。次の入力でfevalがMATLABでNaNを返す理由

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

私のコードは次のようになります

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

補間点を座標

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には、いくつかのNaNという値があります。私にとって、入力データはきれいに見えます(すべて有限の値であり、NaNはありません)。私はデータをフィッティングするときfevalNaNを返す原因になりません。なぜそれが悪い場合でも、最高のフィットを与えることができませんでしたか?私のアプローチに誤りがありますか?

私は少し閲覧しましたが、同じ質問が数学フォーラムで何度も尋ねられたようですが、誰も明確な答えを出していないようです。

ご協力いただきありがとうございます。

+0

カーブフィッティングツールボックスはありません。フィットした関数を調べる方法はありますか?おそらく、フィット関数を評価するために使用するデータポイントのいくつかは、[NaN](http://www.mathworks.com/help/matlab/ref/nan.html)を引き起こすようなものでしょう。 – Schorsch

+0

' yy = fitobject(xx) 'も構文 –

答えて

7

それは補間外挿として使用することはできませんのでです。言い換えれば、

%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 

、あなたは(外挿)元表面データの境界を越えてデータを取得しようとしています通常はすでにかなり危険ですし、fitはあなたがそれをすることを許可しません。

+0

パーフェクト、ありがとう。私は、「フィット」は、どこにでも定義された関数を返すために入力として与えた点群を使用していると考えました。 – Virginie

+0

@Virginie:あなたが望むならば、境界線の上に*値をコピーするために 'nearestinterp'に変更するか、境界の外で続けるために' biharmonicinterp'をコピーすることができます。その場合、値は完全に爆発することに注意してください。 *補間*のための正確な補間*を使用する基本的な副作用:) –

+0

私は何が起こっているのか分かったので、補間間隔内の値だけを気にするほうが理にかなっていると思います。とにかくトリックに感謝します! – Virginie

6

補間の外側にNaNがあると思われる点のようです。あなたはそれを見てプロットすることができます。

cubic interpolation

私はこれは次のようであると遊ぶために使用されるコード:ところで(私は、彼らがプロットすることができ、ちょうどそのよう-25 NaNを設定することに注意してください)

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) 

、 fevalを使用していないことに注意してください。fitobject

+2

+ 1:プロットを伴うよい答えのために常に+1: –

+0

プロットは私が見たいと思ったものです。 fitobjectを直接呼び出すこともできませんでした。非常に有用な答え、ありがとう! – Virginie

関連する問題