这是一个基于形状函数的明确示例。
考虑以下函数:
u1(x,z) = (x-x_b)/(x_c-x_b)
其中,u1(x_b,z_b) = u1(x_a,z_a) = 0(因为x_a = x_b),且u1(x_c,z_c) = u1(x_d,z_d) = 1
u2(x,z) = 1 - u1(x,z)
现在我们有u2(x_b,z_b) = u2(x_a,z_a) = 1,且u2(x_c,z_c) = u2(x_d,z_d) = 0
v1(x,z) = (z-z_b)/(z_a-z_b)
此函数满足v1(x_a,z_a) = v1(x_d,z_d) = 1,且v1(x_b,z_b) = v1(x_c,z_c) = 0
v2(x,z) = 1 - v1(x,z)
我们有v2(x_a,z_a) = v2(x_d,z_d) = 0,且v2(x_b,z_b) = v2(x_c,z_c) = 1
现在让我们按照以下方式构建新函数:
S_D(x,z) = u1(x,z) * v1(x,z)
我们得到 S_D(x_d, z_d) = 1,S_D(x_a, z_a) = S_D(x_b, z_b) = S_D(x_c, z_c) = 0
S_C(x,z) = u1(x,z) * v2(x,z)
我们得到 S_C(x_c, z_c) = 1,S_C(x_a, z_a) = S_C(x_b, z_b) = S_C(x_d, z_d) = 0
S_A(x,z) = u2(x,z) * v1(x,z)
我们得到 S_A(x_a, z_a) = 1,S_A(x_b, z_b) = S_A(x_c, z_c) = S_A(x_d, z_d) = 0
S_B(x,z) = u2(x,z) * v2(x,z)
我们得到 S_B(x_b, z_b) = 1,S_B(x_a, z_a) = S_B(x_c, z_c) = S_B(x_d, z_d) = 0
现在定义您的插值函数为
H(x,z) = h_a * S_A(x,z) + h_b * S_B(x,z) + h_c * S_C(x,z) + h_d * S_D(x,z),
其中,h_a 是点 A 的高度,h_b 是点 B 的高度,以此类推。
您可以轻松验证 H 确实是一个插值函数:
H(x_a,z_a) = h_a,H(x_b,z_b) = h_b,H(x_c,z_c) = h_c 且 H(x_d,z_d) = h_d。
现在,为了近似计算 P 点的高度,您只需要在该点处求解 H 即可:
h_p = H(x_p, z_p)
函数 S 通常被称为“形状函数”。对于每个您希望插值值依赖于的节点,都存在一个这样的函数,在这种情况下,它们都满足 Kronecker 的 delta 性质(它们在一个节点上取值为一,在所有其他节点上取值为零)。
有许多方法可以为给定的节点集构建形状函数。如果我没记错的话,通过将1D形状函数相乘构建2D形状函数(就像我们在这个案例中所做的那样)被称为“函数的张量积”(在这种情况下很容易,因为网格是矩形的)。我们最终得到了四个函数(每个节点一个),它们都是{1、x、z、xz}的线性组合。
如果您想要仅使用三个点进行插值,则应该能够轻松地构建三个形状函数,作为{1、x、z}的线性组合,但您将失去网格提供的高度信息的25%,并且当h_b!= h_d时,您的插值器在矩形内部将不平滑。