Python中使用Vandermonde矩阵的多变量(3D)插值

Python中使用Vandermonde矩阵的多变量(3D)插值,python,numpy,matrix,scipy,interpolation,Python,Numpy,Matrix,Scipy,Interpolation,我似乎不知道如何将范德蒙矩阵应用到多元插值中。我能够得到实际的矩阵,但我不知道如何得到值(数组)c00,c01,c02。我知道c=V/z,但我觉得我遗漏了什么(也许不是除法?)。我也知道我需要建立一个方程组(V的列是每个cij) 如何在python中实现这一点 以下是我到目前为止的情况: import numpy as np x = [1, 1, 1, 2, 2, 2, 3, 3, 3] y = [1, 2, 3, 1, 2, 3, 1, 2, 3] z = [3.2, 4.4, 6.5, 2.

我似乎不知道如何将范德蒙矩阵应用到多元插值中。我能够得到实际的矩阵,但我不知道如何得到值(数组)c00,c01,c02。我知道c=V/z,但我觉得我遗漏了什么(也许不是除法?)。我也知道我需要建立一个方程组(V的列是每个cij)

如何在python中实现这一点

以下是我到目前为止的情况:

import numpy as np
x = [1, 1, 1, 2, 2, 2, 3, 3, 3]
y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
z = [3.2, 4.4, 6.5, 2.5, 4.7, 5.8, 5.1, 3.6, 2.9]
numpy.polynomial.polynomial.polyvander2d(x, y, [2,2])
>>>array([[  1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.],
   [  1.,   2.,   4.,   1.,   2.,   4.,   1.,   2.,   4.],
   [  1.,   3.,   9.,   1.,   3.,   9.,   1.,   3.,   9.],
   [  1.,   1.,   1.,   2.,   2.,   2.,   4.,   4.,   4.],
   [  1.,   2.,   4.,   2.,   4.,   8.,   4.,   8.,  16.],
   [  1.,   3.,   9.,   2.,   6.,  18.,   4.,  12.,  36.],
   [  1.,   1.,   1.,   3.,   3.,   3.,   9.,   9.,   9.],
   [  1.,   2.,   4.,   3.,   6.,  12.,   9.,  18.,  36.],
   [  1.,   3.,   9.,   3.,   9.,  27.,   9.,  27.,  81.]])
np.dot(V,c.flat)
numpy.polynomy.polynomy.polyval2d(x,y,c)
我认为必须以某种方式将其纳入其中,但我不知道该怎么办。请帮忙! 我应该输出:
c=V\z
c=
0.97500
-5.27500
5.95000
-3.92500
19.82500
-21.55000
3.40000
-14.70000
18.50000

以下是我获得此示例的网站(他们使用MatLab):
希望这有帮助

给定位置x和y:

x = [1, 1, 1, 2, 2, 2, 3, 3, 3]
y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
和函数值z:

z = [3.2, 4.4, 6.5, 2.5, 4.7, 5.8, 5.1, 3.6, 2.9]
V将是Vandermonde矩阵:

V = numpy.polynomial.polynomial.polyvander2d(x, y, [2,2])

V = array([[  1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.],
           [  1.,   2.,   4.,   1.,   2.,   4.,   1.,   2.,   4.],
           [  1.,   3.,   9.,   1.,   3.,   9.,   1.,   3.,   9.],
           [  1.,   1.,   1.,   2.,   2.,   2.,   4.,   4.,   4.],
           [  1.,   2.,   4.,   2.,   4.,   8.,   4.,   8.,  16.],
           [  1.,   3.,   9.,   2.,   6.,  18.,   4.,  12.,  36.],
           [  1.,   1.,   1.,   3.,   3.,   3.,   9.,   9.,   9.],
           [  1.,   2.,   4.,   3.,   6.,  12.,   9.,  18.,  36.],
           [  1.,   3.,   9.,   3.,   9.,  27.,   9.,  27.,  81.]])
每行:

a = x[i]
b = y[i]
V[i,:] = [ 1, b, b², a, a*b, a*b², a², a²b, a²b²]
线性插值旨在解决:

$$z=V\cdot c$$

因此,我们需要解决:

$$c=V^{-1}z$$

c = np.linalg.solve(V, z)
c现在保持系数的阶数与Vandermonde矩阵的阶数相同

您可以手动对其进行评估:

def poly_eval(x, y, z):
    return z[0] + z[1]*y + z[2]*np.power(y,2) + z[3]*x + z[4]*x*y + z[5]*x*np.power(y,2) + z[6]*np.power(x,2) + z[7]*np.power(x,2)*y + z[8]*np.power(x,2)*np.power(y,2)
或使用

np.polynomial.polynomial.polyval2d([1,2], [3,4], c)
Out[22]: array([-65.5, -88.4])