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