【问题标题】:Why would feval return NaN in MATLAB为什么 feval 会在 MATLAB 中返回 NaN
【发布时间】:2013-05-24 21:01:22
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

  • 我没有曲线拟合工具箱。你有办法检查拟合函数吗?也许您用来评估拟合函数的一些数据点会导致NaN
  • 你也可以使用yy=fitobject(xx)语法

标签: matlab interpolation curve-fitting spline


【解决方案1】:

看起来作为 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

【讨论】:

  • 剧情正是我想看到的。我也不知道我可以直接调用 fitobject 。非常有帮助的答案,谢谢!
【解决方案2】:

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

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

【讨论】:

  • 完美,谢谢。我认为“适合”是使用我提供的一堆点作为输入来返回一个到处定义的函数。
  • @Virginie:如果您愿意,您可以更改为nearestinterp 以复制 边界上的值,或更改为biharmonicinterp 以继续在边界外。请注意,在这种情况下,您的值将完全爆炸;使用准确的 interpolation 进行 extrapolation 的基本副作用 :)
  • 现在我明白了发生了什么,我认为只关心插值区间内的值更有意义。无论如何,谢谢你的伎俩!
  • @Virginie :我同意您的第一条评论,我原以为正在返回一个函数,该函数可以在初始数据范围之外进行评估(外推可能产生的所有单独问题正如Rody Oldenhuis提到的)
猜你喜欢
  • 2020-01-07
  • 2011-10-23
  • 1970-01-01
  • 2017-05-10
  • 2021-06-18
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多