两条曲线之间的插值(matlab)

时间:2014-05-06 12:06:23

标签: matlab interpolation

好的伙计们。我有以下问题:

我有以下情节的数据。 enter image description here

因此该图的数据文件包含三列。 第二和第三个是x,y点。第一个是这些点所属的系统。 在这种情况下,红色的是20年的系统。蓝色的30年。

我想要找到的是25年的曲线。因此,如果我绘制它应该在红色和蓝色曲线之间。

我不知道如何插入数据以获得我想要的东西。实际上我想要21,22,... 29年,我想如果我们能在这两者之间找到它,那么该方法应该适用于20到30之间的任何时间。

PS:我猜每条曲线的插值(在这种情况下是红色或蓝色曲线)非常简单。只使用interp1(x,y,xx)就行了。但是其他"维度" (M)

数据。

20.0000    3.4076         0
20.0000    3.4226   99.5405
20.0000    3.4701  196.3360
20.0000    3.5592  287.0781
20.0000    3.6248  328.8516
20.0000    3.6643  348.3373
20.0000    3.7091  367.2823
20.0000    3.7591  385.4784
20.0000    3.8077  402.7170
20.0000    3.8957  437.5221
20.0000    4.0314  506.9907
30.0000    3.6335         0
30.0000    3.6373   49.8884
30.0000    3.6488   99.5405
30.0000    3.6685  148.5936
30.0000    3.7363  243.2204
30.0000    3.7876  287.7398
30.0000    3.8537  329.6097
30.0000    3.8935  349.9452
30.0000    3.9384  368.9776
30.0000    3.9892  387.2576
30.0000    4.0410  404.5759
30.0000    4.1350  439.5416
30.0000    4.2153  474.2420
30.0000    4.2813  509.3309

2 个答案:

答案 0 :(得分:6)

实际上,通过查看Matlab文档,我发现了一种更简单的方法。您可以使用函数griddata。 (matlab帮助中的doc显示了可视化示例)。对公共网格进行重采样并将插值嵌入到函数中。

%// First separate (and name your column to identify them better)
t = d(:,1) ;
x = d(:,2) ;
y = d(:,3) ;

%// use the function 'griddata'
[TI,YI] = meshgrid( 20:30 , 0:20:500 ) ; %// change these values to change the grid limits
XI = griddata(t,y,x,TI,YI) ;

%// show result in 3D ... but could be projected in X-Y plane if necessary
plot3(TI,YI,XI , 'Marker','o' )
xlabel('Time') ; ylabel('Y') ; zlabel('X')

代码的最后一行显示了这个情节: figure

所有插值数据都在XI矩阵中。检索它们的方法取决于您最终如何组织它们。

<小时/> 编辑: 要将所有插值数据放在单个表InterpData中,组织方式与原始表相同,请使用以下命令:

nLine = numel(XI) ;
InterpData = [ reshape(TI,nLine,[]) reshape(XI,nLine,[]) reshape(YI,nLine,[]) ] ;

<小时/> 关于NaN s。每当你要求在最初已知的值之外进行插值时,它们会打扰你 例如,如果您在原始数据中的时间在[20到30]间隔内,matlab将很乐意在该间隔内插入任何内容,但如果您要求返回time = 19的值,则返回NaN 。同样适用于Y,要插入的网格必须在初始范围内。 (在此实现中,我们使用由Time (第1列)Y (第3列)组成的基础网格来插入{ {1}}栏)。

答案 1 :(得分:3)

尝试使用此代码实现@Hoki的评论:

m20=[3.4076 0; 3.4226 99.5405; 3.4701 196.3360; 3.5592 287.0781; 3.6248 328.8516; 3.6643 348.3373; 3.7091 367.2823; 3.7591 385.4784; 3.8077 402.7170; 3.8957 437.5221; 4.0314 506.9907];
m30=[3.6335 0; 3.6373 49.8884; 3.6488 99.5405; 3.6685148.5936; 3.7363 243.2204; 3.7876 287.7398; 3.8537 329.6097; 3.8935 349.9452; 3.9384 368.9776; 3.9892 387.2576; 4.0410 404.5759; 4.1350 439.5416; 4.2153 474.2420; 4.2813 509.3309];
yy = [0:50:500];
xx20 = interp1(m20(:,2),m20(:,1),yy);
xx30 = interp1(m30(:,2),m30(:,1),yy);
for m = 1:9
    mm(:,m) = xx20 + (xx30-xx20)*(m/(30-20));
end
plot(m20(:,1),m20(:,2),xx20,yy,xx30,yy,m30(:,1),m30(:,2),mm,yy)

您插入给定的M向量以查找一组x值的y坐标 - 这些是interp1行。然后,在插值m - 坐标之间线性插值为x的函数。