5

我有一堆二维点,我知道它们的值,我想通过它们拟合三次样条,以使用 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 论坛上被问了很多次,但没有人给出明确的答案。

在此先感谢您的帮助。

4

2 回答 2

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甚至不允许您这样做。

于 2013-05-29T14:54:33.277 回答
6

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

三次插值

我用来玩这个的代码如下:(请注意,我将 NaN 设置为 -25 以便可以绘制它们)

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

于 2013-05-29T15:02:58.947 回答