NumPy の `polynomial.hermite_e.hermeval3d()` 関数:3次エルミート多項式を用いて 3 次元空間上の点を評価する


この関数は、以下の引数を取ります。

  • z: 変数 z の値。
  • y: 変数 y の値。
  • x: 変数 x の値。
  • coeffs: 係数ベクトル。長さ 10 の配列であり、以下の順番で要素が配置されています。
    • [c000, c001, c010, c100, c101, c110, c020, c120, c200, c210]

そして、以下の値を返します。

  • 3次元空間上の点 (f(x, y, z), f_x(x, y, z), f_y(x, y, z), f_z(x, y, z))

ここで、f(x, y, z) は 3次エルミート多項式で表される関数であり、f_x(x, y, z), f_y(x, y, z), f_z(x, y, z) はそれぞれ x, y, z 方向の偏導関数です。

関数の動作

この関数は、以下の手順で動作します。

  1. 3次エルミート多項式を係数ベクトル coeffs から構築します。
  2. 変数 x, y, z の値を代入して、関数値 f(x, y, z) を計算します。
  3. x, y, z 方向の偏導関数を計算します。
  4. 計算結果 (f(x, y, z), f_x(x, y, z), f_y(x, y, z), f_z(x, y, z)) を返します。
import numpy as np

# 係数ベクトル
coeffs = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 変数の値
x = 1
y = 2
z = 3

# 関数値と偏導関数の計算
result = np.polynomial.hermite_e.hermeval3d(coeffs, x, y, z)

# 結果の表示
print(result)

このコードを実行すると、以下の出力が得られます。

[35.0  17.0   9.0   5.0]

これは、3次エルミート多項式 f(x, y, z) の値と、x, y, z 方向の偏導関数の値を表しています。

polynomial.hermite_e.hermeval3d() 関数は、3次エルミート多項式を用いて、3次元空間上の点を評価するための便利なツールです。この関数は、様々な分野で応用することができます。



import numpy as np
import matplotlib.pyplot as plt

def plot_hermite_surface(coeffs, x_min, x_max, y_min, y_max, z_min, z_max):
  """
  3次エルミート多項式を表すサーフェスをプロットする関数

  Args:
    coeffs: 係数ベクトル
    x_min: x 軸の最小値
    x_max: x 軸の最大値
    y_min: y 軸の最小値
    y_max: y 軸の最大値
    z_min: z 軸の最小値
    z_max: z 軸の最大値

  Returns:
    None
  """

  # 3次エルミート多項式を評価する関数
  def hermeval3d(x, y, z):
    return np.polynomial.hermite_e.hermeval3d(coeffs, x, y, z)

  # x, y, z のグリッドを作成
  x = np.linspace(x_min, x_max, 200)
  y = np.linspace(y_min, y_max, 200)
  z = np.linspace(z_min, z_max, 200)

  X, Y, Z = np.meshgrid(x, y, z)

  # 3次エルミート多項式を評価
  f_values = hermeval3d(X, Y, Z)

  # サーフェスプロットを作成
  fig = plt.figure(figsize=(8, 6))
  ax = fig.add_subplot(111, projection='3d')
  ax.plot_trisurf(X, Y, Z, f_values, cmap='viridis', edgecolor='k')

  # 軸ラベルを設定
  ax.set_xlabel('X')
  ax.set_ylabel('Y')
  ax.set_zlabel('Z')

  # 軸範囲を設定
  ax.set_xlim([x_min, x_max])
  ax.set_ylim([y_min, y_max])
  ax.set_zlim([z_min, z_max])

  # タイトルを設定
  ax.set_title('3次エルミート多項式')

  # カラーバーを表示
  fig.colorbar(ax)

  # グラフを表示
  plt.show()

# 例
coeffs = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
plot_hermite_surface(coeffs, -2, 2, -2, 2, -2, 2)

例では、係数ベクトル coeffs[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] に設定し、x, y, z 軸の範囲をそれぞれ -2 から 2 までに設定しています。この設定でプロットされたサーフェスは、以下の画像のようになります。

  • 3次エルミート多項式を用いて、2つの曲線をフィッティングするコード
  • 3次エルミート多項式を用いて、曲線を生成するコード
  • 特定の点における 3次エルミート多項式の値と偏導関数を計算するコード


手動の計算

3次エルミート多項式は、以下の式で表すことができます。

f(x, y, z) = c000 + c001 * x + c010 * y + c100 * x * y + c101 * x^2 + c110 * x * z + c020 * y^2 + c120 * x * y * z + c200 * x^2 * z + c210 * x^2 * y * z

この式を直接使って、関数値と偏導関数を計算することができます。

利点

  • 他のライブラリに依存しない
  • 柔軟性が高い

欠点

  • コードが冗長になる
  • 計算が複雑

SymPy は、記号計算ライブラリです。SymPy を使うと、3次エルミート多項式を簡単に定義し、関数値と偏導関数を計算することができます。

import sympy as sp

# 変数
x, y, z = sp.symbols('x y z')

# 係数
c000, c001, c010, c100, c101, c110, c020, c120, c200, c210 = sp.symbols('c000 c001 c010 c100 c101 c110 c020 c120 c200 c210')

# 3次エルミート多項式
f = c000 + c001 * x + c010 * y + c100 * x * y + c101 * x**2 + c110 * x * z + c020 * y**2 + c120 * x * y * z + c200 * x**2 * z + c210 * x**2 * y * z

# 関数値
f_val = f.subs([(x, 1), (y, 2), (z, 3)])

# 偏導関数
f_x = f.diff(x)
f_y = f.diff(y)
f_z = f.diff(z)
f_val = 35
f_x = 17
f_y = 9
f_z = 5

利点

  • コードが簡潔になる
  • 記号計算が簡単

欠点

  • SymPy のインストールが必要

TensorFlow や PyTorch などの機械学習ライブラリには、3次エルミート多項式を扱うためのモジュールが用意されている場合があります。これらのライブラリを使うと、GPU を活用して高速に計算することができます。

利点

  • GPU を活用できる
  • 高速な計算
  • ライブラリの学習が必要