Lie-Trotter 공식 중단 오류를 조사
소개
비교환 연산자 $X, Y$에 대해서, 이하의 Lie-Trotter 공식이 성립한다 1 .
\exp(h(X+Y)) = \left( \exp(hX/n)\exp(hY/n) \right)^n + O\left(\frac{h^2}{n}\right)
여기서 $h$는 c수로, 수치 계산에서는 시간 단위로서 사용되는 경우가 많기 때문에, 이하는 시간 단위라고 부른다. $n$가 분해수이다. 이 중단 오차를 제대로 확인해 보자는 것이 본고의 취지.
소스는
htps : // 기주 b. 코 m / 카이 쵸 256 / 에- t 로 루 루 mp ぇ
에 있다.
2017년 7월 14일 추가:
2차 대칭 분해도 시도할 수 있도록 소스를 조금 변경하고 있습니다. 자세한 내용은 다음 문서Lie-Trotter 공식에서 2차 대칭 분해를 참조하십시오.
스크립트가 하는 일에 대한 설명
알맞은 $d$ 차원 정사각형 행렬 $X$, $Y$를 생각한다. 고유치가 실이 되도록 대칭 행렬로 해 두자. $\exp(h(X+Y))$나 $\exp(hX)$, $\exp(hY)$ 등을 엄밀하게 계산하고, Lie-Trotter 공식을 사용하여 오차를 계산한다. 오차는 플로베니우스 놈을 사용하기로 한다.
실대칭 행렬 만들기
우선, 적당한 $d$차원의 대칭 행렬을 랜덤하게 만든다.
import numpy as np
import math
from scipy import linalg
d = 2
np.random.seed(1)
x1 = np.random.rand(d,d)
x2 = np.random.rand(d,d)
X = x1.dot(x1.T)
Y = x2.dot(x2.T)
Z = X + Y
적당히 랜덤한 행렬 만들어, 그 전치를 취한 것과의 곱을 $X$나 $Y$로 한다. 이렇게하면 대칭 행렬이되기 때문에 고유 값이 사실입니다. $X$와 $Y$의 합을 $Z$로 합시다.
행렬 지수 함수 계산
행렬을 지정된 시간 단위 $h$로 지수의 어깨에 올리는 함수를 만든다. 이를 위해서는 먼저 대각화한다.
X = U_x \Lambda_x U_x^{-1}
대각 행렬을 지수 함수의 어깨에 올리는 것은 간단하기 때문에
\exp(h X) = U_x \exp(h \Lambda_x) U_x^{-1}
로 계산할 수 있다. 이것을 Python으로 쓰면 이런 느낌.
def calc_exp(X, h):
rx, Ux = linalg.eigh(X)
Ux_inv = linalg.inv(Ux)
tx = np.diag(np.array([math.exp(h * i) for i in rx]))
eX = Ux.dot(tx.dot(Ux_inv))
return eX
하는 일을 설명하면
\exp(h(X+Y)) = \left( \exp(hX/n)\exp(hY/n) \right)^n + O\left(\frac{h^2}{n}\right)
알맞은 $d$ 차원 정사각형 행렬 $X$, $Y$를 생각한다. 고유치가 실이 되도록 대칭 행렬로 해 두자. $\exp(h(X+Y))$나 $\exp(hX)$, $\exp(hY)$ 등을 엄밀하게 계산하고, Lie-Trotter 공식을 사용하여 오차를 계산한다. 오차는 플로베니우스 놈을 사용하기로 한다.
실대칭 행렬 만들기
우선, 적당한 $d$차원의 대칭 행렬을 랜덤하게 만든다.
import numpy as np
import math
from scipy import linalg
d = 2
np.random.seed(1)
x1 = np.random.rand(d,d)
x2 = np.random.rand(d,d)
X = x1.dot(x1.T)
Y = x2.dot(x2.T)
Z = X + Y
적당히 랜덤한 행렬 만들어, 그 전치를 취한 것과의 곱을 $X$나 $Y$로 한다. 이렇게하면 대칭 행렬이되기 때문에 고유 값이 사실입니다. $X$와 $Y$의 합을 $Z$로 합시다.
행렬 지수 함수 계산
행렬을 지정된 시간 단위 $h$로 지수의 어깨에 올리는 함수를 만든다. 이를 위해서는 먼저 대각화한다.
X = U_x \Lambda_x U_x^{-1}
대각 행렬을 지수 함수의 어깨에 올리는 것은 간단하기 때문에
\exp(h X) = U_x \exp(h \Lambda_x) U_x^{-1}
로 계산할 수 있다. 이것을 Python으로 쓰면 이런 느낌.
def calc_exp(X, h):
rx, Ux = linalg.eigh(X)
Ux_inv = linalg.inv(Ux)
tx = np.diag(np.array([math.exp(h * i) for i in rx]))
eX = Ux.dot(tx.dot(Ux_inv))
return eX
하는 일을 설명하면
linalg.eigh
호출 numpy.diag
로 행렬로 만듭니다 라는 느낌.
지정된 분해 수 트로터 분해
지정된 시간 간격으로 행렬 지수 함수를 계산할 수 있게 되면 나중에 간단합니다. 예를 들어 시간 단위 $h$, 분해수 $n$의 경우 먼저 $\exp( h X/n)$ 과 $\exp( h Y/n)$ 를 만든다. 그리고는 그것을 단위 행렬에 $n$ 돌려 주면 된다.
eX = calc_exp(X,h/n)
eY = calc_exp(Y,h/n)
S = np.diag(np.ones(d))
eXeY = eX.dot(eY)
for i in range(n):
S = S.dot(eXeY)
이렇게 만든 근사 행렬 $S$와 엄격한 평가 $\exp(h Z)$를 비교한다. 여기서는 플로베니우스 놈으로 비교하자. 이상을 전부 정리하면 이런 느낌의 함수가 된다.
def trotter(X,Y,Z,h,n):
eZ = calc_exp(Z,h)
eX = calc_exp(X,h/n)
eY = calc_exp(Y,h/n)
S = np.diag(np.ones(d))
eXeY = eX.dot(eY)
for i in range(n):
S = S.dot(eXeY)
return linalg.norm(eZ - S)/linalg.norm(eZ)
결과
2차원의 경우에, $h$나 $n$를 여러가지 바꾸어 중단 오차가 어떻게 되는지를 조사해 보자.
첫째, 중단 오차의 $h$ 의존성. $n$를 1,2,4로 하고, 각각에 대해 여러가지 $h$의 값으로 중단 오차를 평가한다.
$n$의 값에 관계없이 오차의 $h$의존성이 $(h^2)$인 것을 알 수 있다. $n$가 커지면 오차가 줄어들지만, 이것은 $1/n$에 비례한다. $h=1.0$에 고정해, 다양한 $n$에 대해 중단 오차를 평가해 본다.
확실히 오차가 $O(1/n)$가 되어 있는 것을 알 수 있다.
요약
트로터 분해의 중단 오차를 평가해 보았다. 지금까지 $n=1$의 케이스 $\exp(h (A+B))\sim\exp(hA)\exp(hB)$를 '1차 분해'라고 부르고 있었으므로, 어쨌든 오차도 $O (h)$라고 생각하고 있었지만, $n$의 값에 관계없이 $O(h^2)$이었다는 것을 이제 알았다.
이 공식의 이름에 대해 적당한 것을 말하면 무서운 삼촌들이 올지도 모른다. 우선 연산자가 유계인 경우는 Lie 공식, 유계가 아닌 경우는 Trotter 공식, 이것을 사용해 경로 적분을 하는 알고리즘을 스즈키·트로터 분해라고 하는 것 같다. 필자는 단순히 트로터 분해라고 부르는 경우가 많지만 ... ↩
Reference
이 문제에 관하여(Lie-Trotter 공식 중단 오류를 조사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kaityo256/items/b7e0568cad8b86c5c8ea
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
트로터 분해의 중단 오차를 평가해 보았다. 지금까지 $n=1$의 케이스 $\exp(h (A+B))\sim\exp(hA)\exp(hB)$를 '1차 분해'라고 부르고 있었으므로, 어쨌든 오차도 $O (h)$라고 생각하고 있었지만, $n$의 값에 관계없이 $O(h^2)$이었다는 것을 이제 알았다.
이 공식의 이름에 대해 적당한 것을 말하면 무서운 삼촌들이 올지도 모른다. 우선 연산자가 유계인 경우는 Lie 공식, 유계가 아닌 경우는 Trotter 공식, 이것을 사용해 경로 적분을 하는 알고리즘을 스즈키·트로터 분해라고 하는 것 같다. 필자는 단순히 트로터 분해라고 부르는 경우가 많지만 ... ↩
Reference
이 문제에 관하여(Lie-Trotter 공식 중단 오류를 조사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kaityo256/items/b7e0568cad8b86c5c8ea텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)