为什么feval会在MATLAB中返回NaN

为什么feval会在MATLAB中返回NaN,matlab,interpolation,curve-fitting,spline,Matlab,Interpolation,Curve Fitting,Spline,我有一堆二维点,我知道它们的值,我想通过它们拟合一条三次样条曲线,用MATLAB插值其他数据 我的代码如下所示: 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 = [...

我有一堆二维点,我知道它们的值,我想通过它们拟合一条三次样条曲线,用MATLAB插值其他数据

我的代码如下所示:

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
)。我不知道拟合数据时什么会导致
feval
返回
NaN
。为什么它不能提供尽可能好的拟合,即使它是坏的?我的方法有错误吗

我浏览了一下,似乎同样的问题在mathworks论坛上被问了很多次,但没有人给出明确的答案

提前感谢您的帮助。

这是因为插值不能用作外推:


换句话说,您试图获取超出原始曲面数据边界的数据(外推),这通常已经相当危险,
fit
甚至不允许您这样做

看起来,作为NaN出现的点位于插值之外。你可以画出来看看

我使用的代码如下:(注意,我将NAN设置为-25只是为了能够绘制它们)


顺便说一下,请注意,我没有使用feval,而是直接调用
fitobject

我没有曲线拟合工具箱。您有办法检查安装的功能吗?也许您用于计算拟合函数的某些数据点是这样的,因为您可以使用
yy=fitobject(xx)
语法,谢谢。我以为“fit”是用我给出的一堆点作为输入来返回一个处处定义的函数。@Virginie:如果你愿意,你可以改为
nearestinterp
复制边界上的值,或者
biharmonicinterp
继续在边界之外。请注意,在这种情况下,您的值将完全爆炸;使用精确插值进行外推的一个基本副作用:)现在我了解了发生的事情,我认为只关注插值间隔内的值更有意义。无论如何,谢谢你的把戏@维吉尼:我同意你的第一个评论,我本以为返回的函数可以在初始数据范围之外进行评估(罗迪·奥登豪斯提到的外推可能会产生所有单独的问题)。图正是我想要看到的。我也不知道我可以直接给fitobject打电话。非常有用的回答,谢谢!
  %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
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)