2017-01-16 98 views
3

我似乎無法弄清楚如何將Vandermonde矩陣實現爲多元插值。我能夠得到實際的矩陣,但我不明白如何獲取值(數組)c00,c01,c02 ...。我知道c = V/z,但我覺得我錯過了一些東西(或許不是部門?)。我也知道我需要以某種方式建立一個方程組(V的列是每個cij)。在Python中使用Vandermonde矩陣的多元(3D)插值

你如何在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.polynomial.polynomial.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): https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/05Interpolation/multi/ 希望這有助於!

回答

0

給定位置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²] 

的線性內插的目的是解決:

$$Ž= V \ CDOTÇ$$

因此我們需要解決:

$$Ç= V^{ - 1} Z $ $

c = np.linalg.solve(V, z) 

c現在保持與範德蒙德矩陣相同的順序的係數。

您可以手動評價它:

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])