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

Python NumPy로 라게르(Laguerre) 다항식의 x, y, z 부동 소수점 배열 기반 의사 Vandermonde 행렬 생성하기

Python NumPy에서 laguerre.lagvander3d() 함수를 사용하면 x, y, z 샘플 포인트를 기반으로 라게르(Laguerre) 다항식의 의사 Vandermonde 행렬을 생성할 수 있습니다.

이 함수의 주요 특징은 다음과 같습니다.

  • 매개변수 x, y, z는 포인트 배열을 반환합니다.
  • 데이터 타입(dtype)은 요소 중 하나라도 복소수가 있으면 complex128로, 그렇지 않으면 float64로 변환됩니다.
  • x가 스칼라 값이면 자동으로 1차원 배열로 변환됩니다.
  • 매개변수 deg는 [x_deg, y_deg, z_deg] 형태의 최대 차수 리스트입니다.

구현 단계

먼저 필요한 라이브러리를 임포트합니다.

import numpy as np
from numpy.polynomial import laguerre as L

numpy.array() 메서드를 사용하여 모두 동일한 형태(shape)를 가진 좌표 배열을 생성합니다.

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)

배열들의 차원(dimension)을 확인합니다.

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

배열들의 형태(shape)를 확인합니다.

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

이제 laguerre.lagvander3d() 함수를 사용하여 x, y, z 샘플 포인트에 대한 라게르 다항식의 의사 Vandermonde 행렬을 생성합니다.

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

전체 예제 코드

import numpy as np
from numpy.polynomial import laguerre as L

# 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)

# lagvander3d()로 라게르 다항식의 의사 Vandermonde 행렬 생성
x_deg, y_deg, z_deg = 2, 3, 4
print("\nResult...\n",L.lagvander3d(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.          -4.3        4.445       2.42216667 -2.30432917
    -2.7          11.61     -12.0015    -6.53985     6.22168875
     0.445       -1.9135     1.978025    1.07786417 -1.02542648
     1.99283333  -8.56918333 8.85814417  4.82697447 -4.59214397
    -0.5          2.15      -2.2225     -1.21108333  1.15216458
     1.35        -5.805      6.00075     3.269925   -3.11084437
    -0.2225       0.95675   -0.9890125  -0.53893208  0.51271324
    -0.99641667  4.28459167 -4.42907208 -2.41348724  2.29607199
    -0.875       3.7625     -3.889375   -2.11939583  2.01628802
     2.3625     -10.15875   10.5013125   5.72236875 -5.44397766
   -0.389375     1.6743125  -1.73077188 -0.94313115  0.89724817
   -1.74372917   7.49803542 -7.75087615 -4.22360266  4.01812598]
  [ 1.          -5.6         9.58       -1.376      -7.3226
   -3.4         19.04      -32.572       4.6784      24.89684
    1.88       -10.528      18.0104     -2.58688    -13.766488
    2.64266667 -14.79893333 25.31674667 -3.63630933 -19.35119093
   -1.3         7.28       -12.454       1.7888      9.51938
    4.42       -24.752      42.3436     -6.08192    -32.365892
   -2.444      13.6864     -23.41352     3.362944    17.8964344
   -3.43546667 19.23861333 -32.91177067  4.72720213  25.15654821
   -0.955      5.348       -9.1489       1.31408     6.993083
    3.247     -18.1832     31.10626     -4.467872   -23.7764822
   -1.7954     10.05424    -17.199932   2.4704704   13.14699604
   -2.52374667 14.13298133 -24.17749307  3.47267541 18.48038734]]

정리

NumPy의 laguerre.lagvander3d() 함수는 3개의 독립 변수(x, y, z)에 대해 라게르 다항식 기반의 의사 Vandermonde 행렬을 손쉽게 계산해 줍니다. 각 축의 최대 차수를 [x_deg, y_deg, z_deg] 리스트로 지정하면, 결과 행렬의 열 개수는 (x_deg+1) × (y_deg+1) × (z_deg+1)이 됩니다. 이러한 의사 Vandermonde 행렬은 다변수 라게르 다항식 최소제곱 피팅(least squares fitting) 등 수치 해석 작업에 유용하게 활용됩니다.