【问题标题】:Interpolation between two curves (matlab)两条曲线之间的插值(matlab)
【发布时间】:2014-06-23 00:58:23
【问题描述】:

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

我有以下情节的数据。

所以这个图的数据文件包含三列。 第二个和第三个是 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

【问题讨论】:

  • 你的数据列是什么?它们是定义一个表面(3D 对象,列表示 x、y 和 z 坐标)还是只是一系列解耦的数据列,其中第一列作为 X 坐标?
  • 实际上第二列和第三列定义了一个通常的 xy 平面((x,y) 点)。第一列实际上是这些(x,y)点属于哪个“系统”。但是如果我将第一列视为另一个变量,则在 xy 平面中插值非常简单,但在“3D”平面中则不然。我不确定我的回答是否对您有帮助,请告诉我。
  • 好吧,我仍然不能完全理解您对插值的期望。作为基于您上次评论的第一个提示,我建议您将第一列视为Z plane/dimension (如有必要,交换列),看看是否有帮助。但最终,我认为您应该编辑您的原始问题并更好地定义您的问题。
  • 好的,我会的。但我没有看到区别,我的意思是列的位置无关紧要?我不知道。我以为是。 (但谢谢你,我会尽快修复它)
  • 确实更清晰。看剧情也不错。我看到您在 2 条定义的曲线之间有不同数量的点。在公共 X 或 Y 上重新插入每条曲线可能会有所帮助。在您的示例曲线中,我不能确定 X 跨度,但我看到每条曲线具有相同的 Y 跨度(从 0 到 500)。所以我建议首先在一个常见的 Y 网格上重新采样你现有的曲线(你可以使用 interp1)。然后对于每条“Y”线,您每次都会有一个对应的 X 值(您可以在两者之间插入 X 值以获得所需的时间)。

标签: matlab interpolation


【解决方案1】:

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

%// 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')

代码的最后一行显示了这个图:

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


编辑: 要将所有插值数据放在单个表中 InterpData 以与原始表相同的方式组织,请使用以下命令:
nLine = numel(XI) ;
InterpData = [ reshape(TI,nLine,[]) reshape(XI,nLine,[]) reshape(YI,nLine,[]) ] ;


关于NaNs。每次您要求在初始已知值之外进行插值时,它们都会来打扰您。
例如,如果您在原始数据中的时间在 [20 到 30] 区间内,matlab 将很乐意在该区间内插入任何内容,但如果您要求返回时间 = 19 的值,则将返回 NaNY 也是如此,插值的网格必须在初始范围内。 (在这个实现中,我们使用由Time (column 1)Y(column 3) 形成的基本网格,来插入X 列) .

【讨论】:

  • 非常好的答案。谢谢你。不过我有一个问题,那些 NaN 值是因为?有没有一种快速的方法来获取这个插值并制作一张我所拥有的表格? (3 列(M,x,y))
【解决方案2】:

试试这段代码,它实现了@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 向量以找到一组y 值的x 坐标 - 这些是interp1 行。然后,您在插值的x-坐标之间线性插值作为m 的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 2019-08-15
    • 2023-03-19
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多