Python中使用Vandermonde矩阵的多变量(3D)插值
我似乎不知道如何将范德蒙矩阵应用到多元插值中。我能够得到实际的矩阵,但我不知道如何得到值(数组)c00,c01,c02。我知道c=V/z,但我觉得我遗漏了什么(也许不是除法?)。我也知道我需要建立一个方程组(V的列是每个cij) 如何在python中实现这一点 以下是我到目前为止的情况: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.
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])