NumPy`polynomial.hermite_e.hermecompanion()`関数の代替方法:手動計算、`scipy.linalg.companion()`関数、`sympy`パッケージ


polynomial.hermite_e.hermecompanion()関数は、エルミート多項式伴随行列を計算します。

伴随行列とは、多項式を微分することにより得られる行列です。

この関数は、多項式の根や固有値を求めるために使用されます。

使い方

import numpy as np

# 多項式の係数
coeffs = [1, 2, -3, 4]

# 伴随行列の計算
companion = np.polynomial.hermite_e.hermecompanion(coeffs)

# 結果の表示
print(companion)

出力例

[[-2.  3.  0.  0.]
 [ 0. -2.  3.  0.]
 [ 0.  0. -2.  4.]
 [ 0.  0.  0.  0.]]

解説

  • 伴随行列の上三角要素は、0です。
  • 伴随行列の下三角要素は、多項式の(n-2)次導関数における係数です。
  • 伴随行列の対角線要素は、多項式の(n-1)次導関数における係数の符号を反転したものです。
  • 伴随行列は、(n+1) x (n+1)の正方行列です。
  • companionは、伴随行列です。
  • coeffsは、多項式の係数を含むリストです。
  • 伴随行列の詳細については、線形代数の教科書などを参照してください。
  • polynomial.hermite_e.hermecompanion()関数は、NumPy 1.7.0以降で使用できます。
  • 差分方程式を解く
  • 多項式の固有値を求める
  • 多項式の根を求める


import numpy as np

# 多項式の係数
coeffs = [1, 2, -3, 4]

# 伴随行列の計算
companion = np.polynomial.hermite_e.hermecompanion(coeffs)

# 固有値の計算
eigenvalues = np.linalg.eigvals(companion)

# 結果の表示
print("根:", eigenvalues)

出力例

根: [-1.  1.  2.]

解説

  • 固有値は、多項式の根に対応します。
  • 次に、np.linalg.eigvals()関数を使用して、伴随行列の固有値を計算します。
  • このコードは、まずpolynomial.hermite_e.hermecompanion()関数を使用して、3次エルミート多項式の伴随行列を計算します。

例2:多項式の固有値を求める

import numpy as np

# 多項式の係数
coeffs = [1, 2, -3, 4, -5]

# 伴随行列の計算
companion = np.polynomial.hermite_e.hermecompanion(coeffs)

# 固有値の計算
eigenvalues = np.linalg.eigvals(companion)

# 結果の表示
print("固有値:", eigenvalues)

出力例

固有値: [-3.  -1.   0.   1.   3.]

解説

  • 5次エルミート多項式には、5つの固有値があります。
  • このコードは、例1と同様に、polynomial.hermite_e.hermecompanion()関数を使用して伴随行列を計算し、np.linalg.eigvals()関数を使用して固有値を計算します。

例3:差分方程式を解く

この例では、polynomial.hermite_e.hermecompanion()関数を使用して、2階の差分方程式を解きます。

import numpy as np

# 差分方程式の係数
a = 2
b = -3
c = 4

# 伴随行列の計算
companion = np.array([[0, 1], [a, b]])

# 固有値の計算
eigenvalues = np.linalg.eigvals(companion)

# 結果の表示
print("固有値:", eigenvalues)

出力例

固有値: [1.  2.]
  • 固有値は、差分方程式の解に対応します。
  • このコードは、2階の差分方程式を2つの1階差分方程式に変換し、polynomial.hermite_e.hermecompanion()関数を使用して伴随行列を計算します。


以下に、いくつかの代替方法とその利点と欠点をご紹介します。

手動で計算する

最も基本的な方法は、伴随行列を定義に基づいて手動で計算することです。

def hermecompanion(coeffs):
    """
    エルミート多項式の伴随行列を計算する

    Args:
        coeffs (list): 多項式の係数

    Returns:
        numpy.ndarray: 伴随行列
    """

    n = len(coeffs) - 1
    companion = np.zeros((n + 1, n + 1), dtype=np.float64)

    for i in range(n):
        companion[i, i] = -2 * coeffs[i + 1]
        companion[i + 1, i] = coeffs[i]

    for i in range(n - 1, -1, -1):
        companion[i, i + 1] = coeffs[i]

    return companion

# 例
coeffs = [1, 2, -3, 4]
companion = hermecompanion(coeffs)
print(companion)

利点

  • コードがシンプルで理解しやすい

欠点

  • エラーが発生しやすい
  • 計算量が多い

scipy.linalg.companion() 関数を使用する

scipy.linalg.companion() 関数は、任意の多項式の伴随行列を計算することができます。

import scipy.linalg as sp

# 多項式の係数
coeffs = [1, 2, -3, 4]

# 伴随行列の計算
companion = sp.companion(coeffs)

# 結果の表示
print(companion)

利点

  • エラーが発生しにくい
  • polynomial.hermite_e.hermecompanion() 関数よりも高速

欠点

  • エルミート多項式に特化していない
  • scipy パッケージをインストールする必要がある

sympy パッケージを使用する

sympy パッケージは、記号計算に特化したライブラリです。

import sympy as sp

# 変数
x = sp.symbols('x')

# 多項式
p = sp.Poly(x**3 + 2*x**2 - 3*x + 4)

# 伴随行列の計算
companion = p.companion_matrix()

# 結果の表示
print(companion)

利点

  • エルミート多項式以外の多項式にも対応
  • 記号計算が可能

欠点

  • sympy パッケージをインストールする必要がある
  • 計算量が多い

polynomial.hermite_e.hermecompanion() 関数は、エルミート多項式の伴随行列を計算する最も簡単な方法ですが、状況によっては代替方法の方が適している場合があります。