什么数学方法适用于插值2d到2d的函数?

Rel*_*lla 6 math interpolation

所以我们有一个类似的矩阵

12,32
24,12
...
Run Code Online (Sandbox Code Playgroud)

长度为2xN,另一个

44,32
44,19
...
Run Code Online (Sandbox Code Playgroud)

长度为2xN且有一些函数f(x,y)返回z [1],z [2].我们给出的2个矩阵代表x,y和z [1],z [2]的已知值对.什么是插值公式,在这种情况下会有所帮助?

vha*_*lac 4

如果你解决一个返回值的问题,你可以通过插值找到两个函数f_1(x,y)f_2(x,y),并将你的函数组成为f(x, y) = [f_1(x,y), f_2(x,y)]。只需选择适合您的问题的任何方法来求解插值函数即可。

对于二维的实际插值问题,有很多方法可以处理。如果您需要简单,则可以使用线性插值。如果您可以使用分段函数,则可以使用贝塞尔曲线或样条曲线。或者,如果数据是均匀的,您可以使用简单的多项式插值(嗯,在二维中不是很简单,但足够简单)。


编辑:更多信息和一些链接。

使用双线性插值(维基百科)可以实现分段解决方案。

对于多项式插值,如果您的数据在网格上,您可以使用以下算法(我找不到它的参考,它来自内存)。

如果数据点位于网格上kl请按如下方式重写多项式:

f(x,y) = cx_1(x)*y^(k-1) + cx_2(x)*y^(k-2) + ... + cx_k(x)
Run Code Online (Sandbox Code Playgroud)

这里,每个系数cx_i(x)也是一个次数为 的多项式l。第一步是通过对网格的每一行或列进行插值来找到k次数多项式。l完成此操作后,您将获得l系数集(或者换句话说,l多项式)作为每个cx_i(x)多项式的插值点,如cx_i(x0), cx_i(x1), ..., cx_i(xl)(总共有 l*k 个点)。现在,您可以使用上述常数作为插值点来确定这些多项式,从而得到结果f(x,y)

同样的方法也适用于贝塞尔曲线或样条曲线。唯一的区别是您使用控制点而不是多项式系数。您首先获得一组将生成数据点的样条线,然后对这些中间曲线的控制点进行插值以获得曲面曲线的控制点。


让我添加一个例子来阐明上述算法。让我们有以下数据点:

0,0 => 1
0,1 => 2
1,0 => 3
1,1 => 4
Run Code Online (Sandbox Code Playgroud)

我们首先拟合两个多项式:一个用于数据点 (0,0) 和 (0,1),另一个用于 (1, 0) 和 (1, 1):

f_0(x) = x + 1
f_1(x) = x + 3
Run Code Online (Sandbox Code Playgroud)

现在,我们在另一个方向上插值来确定系数。当我们垂直读取这些多项式系数时,我们需要两个多项式。1 在 0 和 1 处评估为 1;另一个在 0 处计算结果为 1,在 1 处计算结果为 3:

cy_1(y) = 1
cy_2(y) = 2*y + 1
Run Code Online (Sandbox Code Playgroud)

如果我们将它们组合起来f(x,y),我们得到:

f(x,y) = cy_1(y)*x + cy_2(y)
       = 1*x + (2*y + 1)*1
       = x + 2*y + 1
Run Code Online (Sandbox Code Playgroud)