Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python NumPyのpolyvander3d()で指定した次数とサンプル点(x, y, z)の疑似ファンデルモンド行列を生成する方法

指定された次数とサンプル点 (x, y, z) からファンデルモンド行列を生成するには、Python NumPy の polynomial.polyvander3d() を使用します。このメソッドは、指定した次数 deg とサンプル点 (x, y, z) に対応する疑似ファンデルモンド行列を返します。

パラメータ x、y、z は点座標の配列で、すべて同じ形状である必要があります。dtype は要素に複素数が含まれるかどうかに応じて float64 または complex128 に変換され、スカラーは自動的に 1 次元配列へ変換されます。パラメータ deg は [x_deg, y_deg, z_deg] の形式で、各軸の最大次数を指定するリストです。

なお、ファンデルモンド行列は各サンプル点の冪乗を並べた行列であり、多項式補間や最小二乗近似など、多項式に関する数値計算で広く活用されます。3次元の場合、出力行列の形状は (サンプル点数, (x_deg+1)×(y_deg+1)×(z_deg+1)) になります。

実行手順

まず、必要なライブラリをインポートします。

import numpy as np
from numpy.polynomial.polynomial import polyvander3d

numpy.array() メソッドを使って、同じ形状の点座標配列を作成します。

x = np.array([1.5, 2.3])
y = np.array([3.7, 4.4])
z = np.array([5.3, 6.6])

配列を表示します。

print("Array1...\n",x)
print("\nArray2...\n",y)
print("\nArray3...\n",z)

データ型を確認します。

print("\nArray1 datatype...\n",x.dtype)
print("\nArray2 datatype...\n",y.dtype)
print("\nArray3 datatype...\n",z.dtype)

次元を確認します。

print("\nDimensions of Array1...\n",x.ndim)
print("\nDimensions of Array2...\n",y.ndim)
print("\nDimensions of Array3...\n",z.ndim)

形状を確認します。

print("\nShape of Array1...\n",x.shape)
print("\nShape of Array2...\n",y.shape)
print("\nShape of Array3...\n",z.shape)

polyvander3d() を使って、指定した次数とサンプル点 (x, y, z) のファンデルモンド行列を生成します。

x_deg, y_deg, z_deg = 2, 3, 4
print("\nResult...\n",polyvander3d(x,y, z, [x_deg, y_deg, z_deg]))

コード例全体

import numpy as np
from numpy.polynomial.polynomial import polyvander3d

# numpy.array()メソッドを使って、同じ形状の点座標配列を作成します
x = np.array([1.5, 2.3])
y = np.array([3.7, 4.4])
z = np.array([5.3, 6.6])

# 配列を表示します
print("Array1...\n",x)
print("\nArray2...\n",y)
print("\nArray3...\n",z)

# データ型を表示します
print("\nArray1 datatype...\n",x.dtype)
print("\nArray2 datatype...\n",y.dtype)
print("\nArray3 datatype...\n",z.dtype)

# 次元を確認します
print("\nDimensions of Array1...\n",x.ndim)
print("\nDimensions of Array2...\n",y.ndim)
print("\nDimensions of Array3...\n",z.ndim)

# 形状を確認します
print("\nShape of Array1...\n",x.shape)
print("\nShape of Array2...\n",y.shape)
print("\nShape of Array3...\n",z.shape)

# 指定した次数とサンプル点(x, y, z)から疑似ファンデルモンド行列を生成します
x_deg, y_deg, z_deg = 2, 3, 4
print("\nResult...\n",polyvander3d(x,y, z, [x_deg, y_deg, z_deg]))

出力結果

Array1...
[1.5 2.3]

Array2...
[3.7 4.4]

Array3...
[5.3 6.6]

Array1 datatype...
float64

Array2 datatype...
float64

Array3 datatype...
float64

Dimensions of Array1...
1

Dimensions of Array2...
1

Dimensions of Array3...
1

Shape of Array1...
(2,)

Shape of Array2...
(2,)

Shape of Array3...
(2,)

Result...
[[1.00000000e+00 5.30000000e+00 2.80900000e+01 1.48877000e+02
7.89048100e+02 3.70000000e+00 1.96100000e+01 1.03933000e+02
5.50844900e+02 2.91947797e+03 1.36900000e+01 7.25570000e+01
3.84552100e+02 2.03812613e+03 1.08020685e+04 5.06530000e+01
2.68460900e+02 1.42284277e+03 7.54106668e+03 3.99676534e+04
1.50000000e+00 7.95000000e+00 4.21350000e+01 2.23315500e+02
1.18357215e+03 5.55000000e+00 2.94150000e+01 1.55899500e+02
8.26267350e+02 4.37921695e+03 2.05350000e+01 1.08835500e+02
5.76828150e+02 3.05718920e+03 1.62031027e+04 7.59795000e+01
4.02691350e+02 2.13426415e+03 1.13116000e+04 5.99514801e+04
2.25000000e+00 1.19250000e+01 6.32025000e+01 3.34973250e+02
1.77535822e+03 8.32500000e+00 4.41225000e+01 2.33849250e+02
1.23940102e+03 6.56882543e+03 3.08025000e+01 1.63253250e+02
8.65242225e+02 4.58578379e+03 2.43046541e+04 1.13969250e+02
6.04037025e+02 3.20139623e+03 1.69674000e+04 8.99272202e+04]
[1.00000000e+00 6.60000000e+00 4.35600000e+01 2.87496000e+02
1.89747360e+03 4.40000000e+00 2.90400000e+01 1.91664000e+02
1.26498240e+03 8.34888384e+03 1.93600000e+01 1.27776000e+02
8.43321600e+02 5.56592256e+03 3.67350889e+04 8.51840000e+01
5.62214400e+02 3.71061504e+03 2.44900593e+04 1.61634391e+05
2.30000000e+00 1.51800000e+01 1.00188000e+02 6.61240800e+02
4.36418928e+03 1.01200000e+01 6.67920000e+01 4.40827200e+02
2.90945952e+03 1.92024328e+04 4.45280000e+01 2.93884800e+02
1.93963968e+03 1.28016219e+04 8.44907045e+04 1.95923200e+02
1.29309312e+03 8.53441459e+03 5.63271363e+04 3.71759100e+05
5.29000000e+00 3.49140000e+01 2.30432400e+02 1.52085384e+03
1.00376353e+04 2.32760000e+01 1.53621600e+02 1.01390256e+03
6.69175690e+03 4.41655955e+04 1.02414400e+02 6.75935040e+02
4.46117126e+03 2.94437303e+04 1.94328620e+05 4.50623360e+02
2.97411418e+03 1.96291536e+04 1.29552414e+05 8.55045929e+05]]

この例では次数を [2, 3, 4] と指定しているため、出力される行列は「2つのサンプル点 × (3×4×5=60) 列」の形状になります。各行は対応するサンプル点 (x, y, z) について、xi・yj・zk(0 ≤ i ≤ 2、0 ≤ j ≤ 3、0 ≤ k ≤ 4)の値を順に並べたものです。この行列を用いることで、3変数多項式の係数推定や曲面フィッティングなどを効率的に行えます。

  1. Pythonでエルミート多項式とx・y・zサンプル点の疑似ファンデルモンド行列を生成する方法

    エルミート多項式とx、y、zのサンプル点から疑似ファンデルモンド行列を生成するには、PythonのNumPyが提供する hermite.hermvander3d() メソッドを使用します。このメソッドは、計算結果として疑似ファンデルモンド行列を返します。 エルミート多項式は、物理学や確率論などの分野で広く利用される直交多項式の一種です(NumPyの numpy.polynomial.hermite モジュールでは、物理学者が用いる形式のエルミート多項式が採用されています)。疑似ファンデルモンド行列とは、各サンプル点における多項式の値を次数ごとの列として並べた行列のことで、多項式による最小二乗近

  2. Pythonでチェビシェフ多項式とx、y、zサンプル点から疑似ファンデルモンド行列を生成する方法

    PythonのNumPyライブラリでは、numpy.polynomial.chebyshevモジュールのchebvander3d()関数を使うことで、チェビシェフ多項式とx、y、zのサンプル点から疑似ファンデルモンド行列を簡単に生成できます。このメソッドは、指定された次数degとサンプル点(x, y, z)に対応する疑似ファンデルモンド行列を返します。パラメータのx、y、zは点の座標を表す配列で、すべて同じ形状である必要があります。データ型は、要素に複素数が含まれるかどうかに応じてfloat64またはcomplex128へ自動的に変換されます。また、スカラー値は1次元配列として扱われます。パラ