Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python NumPy로 복소수 좌표 배열을 활용한 에르미트(Hermite) 다항식 의사 반데르몬드(Pseudo Vandermonde) 행렬 생성 방법

에르미트(Hermite) 다항식의 의사 반데르몬드(pseudo-Vandermonde) 행렬을 생성하려면 Python NumPy에서 제공하는 hermite.hermvander2d() 함수를 사용합니다. 이 메서드는 2차원 점 좌표(x, y)에 대한 에르미트 다항식 기저 함수 값들로 구성된 의사 반데르몬드 행렬을 반환합니다.

주요 매개변수는 다음과 같습니다.

  • x, y: 점 좌표 배열로, 두 배열은 서로 동일한 shape(형태)를 가져야 합니다. 요소 중 하나라도 복소수가 포함되어 있으면 dtype은 complex128로, 그렇지 않으면 float64로 변환됩니다. 스칼라 값은 자동으로 1차원 배열로 변환됩니다.
  • deg: 각 축의 최대 차수를 나타내는 [x_deg, y_deg] 형태의 리스트입니다.

의사 반데르몬드 행렬은 다항식 피팅(fitting), 근사(approximation), 직교 다항식 기반 회귀 분석 등에 널리 활용되며, 에르미트 다항식은 물리학과 확률론에서 특히 유용하게 사용되는 직교 다항식입니다.

단계별 구현 방법

1. 필요한 라이브러리 임포트

먼저 필요한 라이브러리를 가져옵니다.

import numpy as np
from numpy.polynomial import hermite as H

2. 복소수 점 좌표 배열 생성

numpy.array() 메서드를 사용하여 서로 동일한 형태(shape)를 가진 복소수 점 좌표 배열 x와 y를 생성합니다.

x = np.array([-2.+2.j, -1.+2.j])
y = np.array([1.+2.j, 2.+2.j])

3. 배열 내용 확인

생성된 배열을 출력하여 내용을 확인합니다.

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

4. 데이터 타입(dtype) 확인

복소수 요소가 포함되어 있으므로 dtype이 complex128로 지정되었는지 확인합니다.

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

5. 배열의 차원(ndim) 확인

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

6. 배열의 형태(shape) 확인

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

7. 의사 반데르몬드 행렬 생성

hermite.hermvander2d() 함수를 호출하고, x축 최대 차수를 2, y축 최대 차수를 3으로 지정하여 의사 반데르몬드 행렬을 생성합니다.

x_deg, y_deg = 2, 3
print("\nResult...\n",H.hermvander2d(x,y, [x_deg, y_deg]))

전체 예제 코드

import numpy as np
from numpy.polynomial import hermite as H

# numpy.array() 메서드로 동일한 형태의 복소수 점 좌표 배열 생성
x = np.array([-2.+2.j, -1.+2.j])
y = np.array([1.+2.j, 2.+2.j])

# 배열 출력
print("Array1...\n",x)
print("\nArray2...\n",y)

# 데이터 타입 출력
print("\nArray1 datatype...\n",x.dtype)
print("\nArray2 datatype...\n",y.dtype)

# 두 배열의 차원 확인
print("\nDimensions of Array1...\n",x.ndim)
print("\nDimensions of Array2...\n",y.ndim)

# 두 배열의 형태(shape) 확인
print("\nShape of Array1...\n",x.shape)
print("\nShape of Array2...\n",y.shape)

# hermite.hermvander2d()로 에르미트 다항식의 의사 반데르몬드 행렬 생성
# x_deg=2, y_deg=3으로 설정

x_deg, y_deg = 2, 3
print("\nResult...\n",H.hermvander2d(x,y, [x_deg, y_deg]))

실행 결과

Array1...
    [-2.+2.j -1.+2.j]

Array2...
    [1.+2.j 2.+2.j]

Array1 datatype...
complex128

Array2 datatype...
complex128

Dimensions of Array1...
1

Dimensions of Array2...
1

Shape of Array1...
(2,)

Shape of Array2...
(2,)

Result...
    [[ 1.000e+00 +0.j   2.000e+00  +4.j  -1.400e+01 +16.j  -1.000e+02 -40.j
      -4.000e+00 +4.j -2.400e+01  -8.j  -8.000e+00 -120.j  5.600e+02 -240.j
      -2.000e+00 -32.j 1.240e+02  -72.j  5.400e+02 +416.j -1.080e+03 +3280.j]
     [ 1.000e+00  +0.j  4.000e+00  +4.j  -2.000e+00 +32.j  -1.520e+02 +104.j
      -2.000e+00  +4.j -2.400e+01  +8.j -1.240e+02  -72.j -1.120e+02 -816.j
      -1.400e+01  -16.j 8.000e+00 -120.j 5.400e+02 -416.j  3.792e+03 +976.j]]

결과 해석

위 실행 결과를 보면, 입력 좌표가 복소수였기 때문에 결과 행렬의 dtype 역시 complex128로 계산된 것을 확인할 수 있습니다. 반환된 행렬의 열 개수는 (x_deg + 1) × (y_deg + 1) = 3 × 4 = 12개이며, 각 행은 대응하는 점 좌표 (x, y)에서 계산된 에르미트 다항식 기저 함수 H_i(x)·H_j(y)의 값을 나타냅니다. 이렇게 생성된 행렬은 2변수 에르미트 다항식 기반의 데이터 피팅 및 회귀 분석에 바로 활용할 수 있습니다.