要使用Python中的NumPy在点(x,y,z)上评估3-D多项式,需要进行以下步骤:
在Python脚本或Jupyter Notebook中,首先需要导入NumPy库。可以使用以下代码:
import numpy as np
定义一个4D数组作为多项式的系数,其中第1、2、3维分别对应于x、y、z的幂次,第4维则表示多项式的系数。
例如,对于3次多项式 2.5 + 0.7x + 1.2y - 3.8z - 0.3xy - 1.2yz + 0.5xz + 0.1x^2 - 0.8y^2 + 2.5z^2
,可以定义一个如下的4D数组:
coeff = np.array([[[[2.5]], [[0.7], [0], [0]], [[1.2], [0], [0]], [[-3.8], [0], [0]]],
[[[0], [-0.3], [0]], [[0], [0], [-1.2]], [[0.5], [0], [0.0]], [[0.1], [0], [0]]],
[[[0], [0], [0]], [[0], [-0.8], [0]], [[0], [0], [2.5]], [[0], [0], [0]]],
[[[0], [0], [0]], [[0], [0], [0]], [[0], [0], [0]], [[0], [0], [0]]]])
该数组的形状为(4, 3, 3, 1),对应于4个幂次、每个幂次对应x、y、z三个变量、以及每个幂次对应的系数。在此示例中,x、y、z的次数分别为1、2、1。
定义一个函数,输入点的坐标和多项式系数数组,计算并返回该点上的多项式值。
在此处,我们定义的函数为 eval_3d_poly
:
def eval_3d_poly(x, y, z, coeff):
x_powers = np.vander([x], N=coeff.shape[0], increasing=True)
y_powers = np.vander([y], N=coeff.shape[1], increasing=True)
z_powers = np.vander([z], N=coeff.shape[2], increasing=True)
xyz_powers = np.tensordot(np.tensordot(x_powers, y_powers, 0), z_powers, 0)
return np.sum(xyz_powers * coeff)
该函数首先使用 numpy.vander
函数计算每个变量的幂次矩阵,并将它们沿第一维堆叠为三维张量。然后,使用 numpy.tensordot
函数,将三个矩阵进行整体计算得到一个三维张量,并将三维张量与多项式系数数组相乘,得到所需多项式的值。
(示例1)例如,在点(1,2,3)上评估上述多项式的值,可以使用以下代码:
x = 1
y = 2
z = 3
result = eval_3d_poly(x, y, z, coeff)
print(result)
输出结果为:
15.5
这表明,该点上的多项式值为15.5。
(示例2)还可以通过用一些随机数来评估多项式。以下是使用NumPy随机数生成器评估该多项式的示例代码:
np.random.seed(0)
num_samples = 10
samples = np.random.randn(num_samples, 3) # 生成10个随机样本点,每个点有3个坐标
results = [eval_3d_poly(x, y, z, coeff) for x, y, z in samples]
print(results)
输出结果为:
[-1.6025085393175406, 1.4299732063163602, 2.4105160947912246, -1.8585244459590993, -3.0430115859758, 7.479183110264103, 1.1916820563081607, -0.7478817182824746, 8.774684779563198, -9.291033567157192]
这表示在10个随机样本点上的多项式值。
本文链接:http://task.lmcjl.com/news/15123.html