import numpy as np
from scipy import linalg as sp_linalg
"""
- 1차원의 값들에 대해서는 np.exp()로 간단하게 exponential을 적용할 수 있다.
- 그러나, 1차원이 아닌 matrix인 구조일 때는 np.exp()를 matrix의 각 element에 exponential을 처리한다고 해서,
원하는 결과가 나오지 않는다.
- 이처럼 matrix에 대해서 exponential을 처리하기 위한 함수가 바로 `sp_linalg.expm`를 사용합니다.
- check1: 우선, `sp_linalg.expm(zero_matrix)== Identity matrix`를 확인
- check2: euler identity 의 matrix form에 적용.
"""
N = 2
zero_mat = np.zeros([N, N])
print("== zero_mat")
print(zero_mat)
print("--"*20)
# 해당 matrix에 exponential 를 적용함.
# zero에 적용한 것이므로, exp(Zeros) = I 가 나오게 됨.
print("== sp_linalg.expm(zero_mat)")
print(sp_linalg.expm(zero_mat))
print("--" * 20)
# 반대로, 그대로 np.exp를 씌우면 모든 모든 원소가 1이므로, matrix에 맞는 function이 아님
print("== np.exp(zero_mat)")
print(np.exp(zero_mat))
print("--" * 20)
"""
Euler’s identity (exp(i*theta) = cos(theta) + i*sin(theta)) applied to a matrix:
"""
N = 2
X = np.random.normal(0, 1, N**2).reshape(N, N)
# `j` means imaginary parth
LHS = sp_linalg.expm(1j*X) # ij*X 에 exponential function 적용
RHS = sp_linalg.cosm(X) + 1j*sp_linalg.sinm(X)
print("== LHS")
print(LHS)
print("--" * 20)
print("== RHS")
print(RHS)
print("--" * 20)
== zero_mat
[[0. 0.]
[0. 0.]]
----------------------------------------
== sp_linalg.expm(zero_mat)
[[1. 0.]
[0. 1.]]
----------------------------------------
== np.exp(zero_mat)
[[1. 1.]
[1. 1.]]
----------------------------------------
== LHS
[[-0.87798962+0.62059534j 0.6962854 -0.2663728j ]
[-0.19544771+0.074771j 1.06801666-0.12387402j]]
----------------------------------------
== RHS
[[-0.87798962+0.62059534j 0.6962854 -0.2663728j ]
[-0.19544771+0.074771j 1.06801666-0.12387402j]]
----------------------------------------
댓글남기기