用Python中的NumPy在点(x, y, z)上评估一个3-D多项式,其系数为4D数组

  • Post category:Python

评估一个3-D多项式可以使用 NumPy 中的多项式类 numpy.polynomial。多项式类可以用于执行多项式操作,例如求值、积分、微分、插值等等。

为了在点(x, y, z)上评估一个3-D多项式,我们可以将一个3-D多项式表示为一个系数数组。系数数组是一个4D数组,其中每个元素都表示多项式的系数。比如,如果多项式为 $p(x,y,z) = 2x^2y^3z-xyz^2+5$,那么系数数组为:

[[[0, 0, 0, 5], 
  [0, 0, 1, 0], 
  [0, 0, 2, 0], 
  [0, 0, 3, 0], 
  [0, 1, 0, 0], 
  [0, 1, 1, 0], 
  [0, 1, 2, 0], 
  [0, 2, 0, -1], 
  [0, 2, 1, 0], 
  [0, 3, 0, 2]], 
 [[1, 0, 0, 0], 
  [1, 0, 1, 0], 
  [1, 0, 2, 0], 
  [1, 1, 0, 0], 
  [1, 1, 1, 0], 
  [1, 2, 0, 0], 
  [1, 3, 0, 0], 
  [2, 0, 0, 0], 
  [2, 0, 1, 0], 
  [3, 0, 0, 0]]]

其中,第一维表示多项式的阶数,第二维表示 x 的次数,第三维表示 y 的次数,第四维表示 z 的次数。

为了在点(x, y, z)上评估这个多项式,我们可以使用 numpy.polynomial.polynomial.polyval3d() 方法。这个方法可以接受一个点的元组和一个系数数组,并返回多项式在这个点上的值。比如,对于上面的多项式系数数组和点 $(1,2,3)$,我们可以这样计算:

import numpy as np

p_coeff = np.array([[[0, 0, 0, 5], 
                     [0, 0, 1, 0], 
                     [0, 0, 2, 0], 
                     [0, 0, 3, 0], 
                     [0, 1, 0, 0], 
                     [0, 1, 1, 0], 
                     [0, 1, 2, 0], 
                     [0, 2, 0, -1], 
                     [0, 2, 1, 0], 
                     [0, 3, 0, 2]], 
                    [[1, 0, 0, 0], 
                     [1, 0, 1, 0], 
                     [1, 0, 2, 0], 
                     [1, 1, 0, 0], 
                     [1, 1, 1, 0], 
                     [1, 2, 0, 0], 
                     [1, 3, 0, 0], 
                     [2, 0, 0, 0], 
                     [2, 0, 1, 0], 
                     [3, 0, 0, 0]]])

x, y, z = 1, 2, 3

p_value = np.polynomial.polynomial.polyval3d(x, y, z, p_coeff)
print(p_value)  # 输出: 98

这样就可以得到点 $(1,2,3)$ 上多项式的值为 98。

另外,我们也可以从一个数据集中拟合多项式系数数组,并在给定点上进行评估。比如,假设有一组点数据 $(x_i, y_i, z_i, v_i)$,我们可以使用 numpy.polynomial.polynomial.polyfit3d() 方法拟合数据,并得到多项式系数。然后,我们就可以使用上面的 numpy.polynomial.polynomial.polyval3d() 方法在给定点上评估多项式的值。例如,对于以下数据集:

# 模拟数据集
x_data = np.random.rand(10)
y_data = np.random.rand(10)
z_data = np.random.rand(10)
v_data = 2*x_data**2*y_data**3*z_data - x_data*y_data*z_data**2 + 5

# 拟合多项式
degree = 3
p_coeff = np.polynomial.polynomial.polyfit3d(x_data, y_data, z_data, v_data, degree)

# 在给定点上评估多项式的值
x, y, z = 0.5, 0.5, 0.5
p_value = np.polynomial.polynomial.polyval3d(x, y, z, p_coeff)
print(p_value)  # 输出: 0.291357518768...

这样就可以得到点 $(0.5, 0.5, 0.5)$ 上多项式的值。