所以我们有一个类似
的矩阵12,32
24,12
...
长度为2xN,另一个
44,32
44,19
...
长度为2xN,并且有一些函数f(x,y)返回z [1],z [2]。我们给出的2个矩阵代表x,y和z [1],z [2]的已知值对。什么是在这种情况下有用的插值公式?
答案 0 :(得分:4)
如果您针对一个返回值解决问题,则可以通过插值找到两个函数f_1(x,y)
和f_2(x,y)
,并将函数组合为f(x, y) = [f_1(x,y), f_2(x,y)]
。只需选择任何方法来解决适合您问题的插值函数。
对于二维的实际插值问题,有很多方法可以解决这个问题。如果您需要简单,您可以使用线性插值。如果您对分段函数没问题,可以选择贝塞尔曲线或样条曲线。或者,如果数据是统一的,你可以通过一个简单的多项式插值(嗯,在2D时不是很简单,但很容易)。
编辑:更多信息和一些链接。
使用Bilinear interpolation (wikipedia)可以实现分段解决方案。
对于多项式插值,如果数据在网格上,则可以使用以下算法(我找不到它的参考,它来自内存)。
如果数据点位于k
l
网格上,请按如下方式重写多项式:
f(x,y) = cx_1(x)*y^(k-1) + cx_2(x)*y^(k-2) + ... + cx_k(x)
这里,每个系数cx_i(x)
也是度l
的多项式。第一步是通过插入网格的每一行或每列来查找度k
的{{1}}多项式。完成此操作后,您将l
系数集(或者换句话说,l
多项式)作为l
多项式的插值点,cx_i(x)
,{{1} },...,cx_i(x0)
(给你总共l * k分)。现在,您可以使用上述常量确定这些多项式作为插值点,从而为您提供结果cx_i(x1)
。
相同的方法用于贝塞尔曲线或样条曲线。唯一的区别是您使用控制点而不是多项式系数。首先得到一组将生成数据点的样条线,然后插入这些中间曲线的控制点以获得曲面曲线的控制点。
让我举一个例子来澄清上述算法。我们有以下数据点:
cx_i(xl)
我们首先拟合两个多项式:一个用于数据点(0,0)和(0,1),另一个用于(1,0)和(1,1):
f(x,y)
现在,我们在另一个方向插值来确定系数。当我们垂直读取这些多项式系数时,我们需要两个多项式。一个在0和1处评估为1;另一个在0处评估为1,在1处评估为3:
0,0 => 1
0,1 => 2
1,0 => 3
1,1 => 4
如果我们将这些结合到f_0(x) = x + 1
f_1(x) = x + 3
中,我们会得到:
cy_1(y) = 1
cy_2(y) = 2*y + 1