Math 最小化两个数据集之间的插值误差

Math 最小化两个数据集之间的插值误差,math,compression,interpolation,sampling,Math,Compression,Interpolation,Sampling,在下图的顶部,我们可以看到一些值(y轴)随时间(x轴)变化 在这种情况下,我们在不同且不可预测的时间对值进行采样,同时在两个数据集之间交替采样,以红色和蓝色表示 在任何时候计算该值时,我们希望红色和蓝色数据集都将返回相似的值。然而,如三个较小的方框所示,情况并非如此。随着时间的推移,每个数据集(红色和蓝色)的值将出现发散,然后围绕原始值收敛 最初我使用线性插值来获得一个值,接下来我尝试使用Catmull Rom插值。前者的结果是,数值接近,然后在每个数据点之间漂移;后者的结果是数值更接近,但平

在下图的顶部,我们可以看到一些值(y轴)随时间(x轴)变化

在这种情况下,我们在不同且不可预测的时间对值进行采样,同时在两个数据集之间交替采样,以红色和蓝色表示

在任何时候计算该值时,我们希望红色和蓝色数据集都将返回相似的值。然而,如三个较小的方框所示,情况并非如此。随着时间的推移,每个数据集(红色和蓝色)的值将出现发散,然后围绕原始值收敛

最初我使用线性插值来获得一个值,接下来我尝试使用Catmull Rom插值。前者的结果是,数值接近,然后在每个数据点之间漂移;后者的结果是数值更接近,但平均误差更大


有谁能提出另一种策略或插值方法来提供更大的平滑度(可能通过使用每个数据集中更多的采样点)?

我相信,如果不进一步了解基本的采样过程,您所问的问题不会有一个直接的答案。就其性质而言,样本之间的函数值只能是任何东西,因此我认为无法确保两个样本数组插值的收敛性

也就是说,如果您对基本过程有先验知识,那么您可以从几种插值方法中进行选择,以将误差降至最低。例如,如果你测量阻力作为机翼速度的函数,你知道这个关系是平方的(a*V^2)。然后,您可以选择二阶多项式拟合,并在两个系列的插值之间进行相当好的匹配。

我想引用一句话,建议不要使用Catmull Rom进行此插值任务

Catmull Rom的特点之一 样条曲线是指指定的曲线 将通过所有的控制 点-并非所有类型都如此 样条函数

根据定义,红色插值曲线将通过所有红色数据点,蓝色插值曲线将通过所有蓝色点。因此,您无法获得两个数据集的最佳匹配

您可以更改边界条件,并使用两个数据集中的数据点进行分段近似,如图所示。

尝试:Catmull Rom插值(穿过数据点),B样条曲线进行平滑。
例如,对于等距数据(不是您的情况)

当然,插值的红/蓝曲线取决于红/蓝数据点的间距,
因此无法完美匹配。

对原始连续函数进行采样时,采样频率应符合,否则采样过程会引入错误(也称为混叠)。两个数据集中的错误不同,插值时会产生不同的值


因此,您需要知道原始函数的最高频率B,然后以至少2B的频率采集样本。如果您的函数具有非常高的频率,并且您无法进行如此快速的采样,那么您至少应该在采样之前尝试将其过滤掉。

我同意ysap的观点,即这个问题无法像您预期的那样得到回答。可能有更好的插值方法,这取决于您的模型动力学-与ysap一样,我建议使用基础动力学(如果已知)的方法

关于红色/蓝色样本,我认为您对采样和插值数据集进行了很好的观察,我将挑战您最初的期望:

在任何时候计算该值时,我们希望红色和蓝色数据集都将返回相似的值

我不希望这样。如果您假设无法完美插值,特别是如果插值误差与样本中的误差相比较大,那么您肯定拥有一个连续误差函数,该函数在样本点处显示最大误差(最长时间)。因此,具有不同采样点的两个数据集应显示您看到的行为,因为远离红色采样点的点(在时间上)可能靠近蓝色采样点,反之亦然-如果像您的点那样交错,这肯定是正确的。因此,我希望你所展示的是:

随着时间的推移,每个数据集(红色和蓝色)的值将出现发散,然后围绕原始值收敛


(如果您没有关于基本动态的信息(频率内容除外),那么Giacomo的采样点是关键-但是,如果查看Nyquist下面的信息,您不需要插值。)

值得注意的是,我准备牺牲准确性以保持一致性。线性和Catmull Rom插值都保证,如果我要求一个恰好是采样点的时间值,它们将返回采样的精确值;我不需要这个保证。我有点不清楚这是否有用,但你知道吗?它在一些情况下非常有用,例如积分概率分布,通常使用随机抽样。感谢ysap,这些值实际上是位置向量的组成部分,因此它是一个连续函数。因此,Catmull Rom实际上是一种非常好的插值方法,但它会在两个数据集之间产生所述的误差。您知道有哪种样条线类型不能保证它们通过所有控制点吗?同样感谢幻灯片的链接,我应该注意到,两个数据集不一定来自同一个数据集(因此我们无法对它们进行比较),将它们视为相同的数据集来演示问题是很有用的。
Bspline(t) = (data(t-1) + 4*data(t) + data(t+1)) / 6