에서 내 대답 A와 MSE에 대한 질문 2 차원 해밀턴 물리 시뮬레이션에 대하여, 나는 고차원 사용하여 제안 사교 통합을 .
그런 다음 순서가 다른 메소드의 전역 정확도에 대해 다른 시간 단계의 효과를 보여주는 것이 좋을 것이라고 생각하고 그 효과를 위해 Python / Pylab 스크립트를 작성하고 실행했습니다. 비교를 위해 나는 선택했다 :
- ( leap2 ) leapfrog 라는 이름으로 알고 있지만 Wikipedia의 친숙한 2 차 예제 ,
- ( ruth3 ) 루스의 3 차 증상 적분기 ,
- ( ruth4 ) 룻의 4 차 상징적 통합 자 .
이상한 점은 내가 선택한 시간 단계에 관계없이 루스의 3 차 방법은 루스의 4 차 방법보다 훨씬 더 정확하다는 것입니다.
따라서 내 질문은 : 내가 여기서 뭘 잘못하고 있니? 자세한 내용은 아래를 참조하십시오.
이 방법은 분리 가능한 Hamiltonian, 즉
우리의 셋업에서, 우리는 그것들에 적용되는 질량에 의해 힘과 모멘트를 정규화 할 수 있습니다. 따라서 힘은 가속으로 바뀌고 모멘트는 속도로 바뀝니다.
증상 적분기에는 특별한 (주어진, 일정한) 계수가 붙어 있는데, 이것은 및 됩니다. 이러한 계수를 사용하여 시간 에서 시간 로 시스템을 진화시키는 한 단계 는 다음과 같은 형식을 취합니다.
들어 :
- 모든 위치의 벡터 q 가 주어지면 모든 가속도의 벡터 계산
- 모든 속도의 벡터 를
- 변경 벡터 모든 위치의 전
지혜는 이제 계수에 있습니다. 이것들은
테스트를 위해 1D 초기 값 문제
δ t = 2 π 의 stepize로 대해 위의 방법으로 IVP를 통합했습니다. 정수와사이 어딘가에 선택및. 촬영leap2계정으로의 속도를, 나는 배하는 방법에 대해. I는 위상 공간에서 생성 된 곡선을 플로팅으로 확대 곡선 이상적 다시 도착해야.
다음은 및 대한 플롯과 줌입니다 .
들면 , leap2 스텝 크기 은 스텝 크기가2π 인ruth4 보다 집에 더 가까이 도착합니다. . 들면,ruth4승leap2. 그러나ruth4와 동일한 단계 크기를가진 ruth3은 지금까지 테스트 한 모든 설정에서 다른 것보다 훨씬 더 가깝습니다.
다음은 Python / Pylab 스크립트입니다.
import numpy as np
import matplotlib.pyplot as plt
def symplectic_integrate_step(qvt0, accel, dt, coeffs):
q,v,t = qvt0
for ai,bi in coeffs.T:
v += bi * accel(q,v,t) * dt
q += ai * v * dt
t += ai * dt
return q,v,t
def symplectic_integrate(qvt0, accel, t, coeffs):
q = np.empty_like(t)
v = np.empty_like(t)
qvt = qvt0
q[0] = qvt[0]
v[0] = qvt[1]
for i in xrange(1, len(t)):
qvt = symplectic_integrate_step(qvt, accel, t[i]-t[i-1], coeffs)
q[i] = qvt[0]
v[i] = qvt[1]
return q,v
c = np.math.pow(2.0, 1.0/3.0)
ruth4 = np.array([[0.5, 0.5*(1.0-c), 0.5*(1.0-c), 0.5],
[0.0, 1.0, -c, 1.0]]) / (2.0 - c)
ruth3 = np.array([[2.0/3.0, -2.0/3.0, 1.0], [7.0/24.0, 0.75, -1.0/24.0]])
leap2 = np.array([[0.5, 0.5], [0.0, 1.0]])
accel = lambda q,v,t: -q
qvt0 = (1.0, 0.0, 0.0)
tmax = 2.0 * np.math.pi
N = 36
fig, ax = plt.subplots(1, figsize=(6, 6))
ax.axis([-1.3, 1.3, -1.3, 1.3])
ax.set_aspect('equal')
ax.set_title(r"Phase plot $(y(t),y'(t))$")
ax.grid(True)
t = np.linspace(0.0, tmax, 3*N+1)
q,v = symplectic_integrate(qvt0, accel, t, leap2)
ax.plot(q, v, label='leap2 (%d steps)' % (3*N), color='black')
t = np.linspace(0.0, tmax, N+1)
q,v = symplectic_integrate(qvt0, accel, t, ruth3)
ax.plot(q, v, label='ruth3 (%d steps)' % N, color='red')
q,v = symplectic_integrate(qvt0, accel, t, ruth4)
ax.plot(q, v, label='ruth4 (%d steps)' % N, color='blue')
ax.legend(loc='center')
fig.show()
간단한 오류를 이미 확인했습니다.
- 위키 백과 오타가 없습니다. 특히 참조 ( 1 , 2 , 3 )를 확인했습니다.
- 계수 순서가 맞습니다. Wikipedia의 순서와 비교하면 운영자 응용 프로그램의 시퀀싱은 오른쪽에서 왼쪽으로 작동합니다. 내 번호는 Candy / Rozmus에 동의합니다 . 그럼에도 불구하고 다른 주문을 시도하면 결과가 악화됩니다.
내 의심 :
- 잘못된 단계 순서 : 아마도 루스의 3 차 체계는 묵시적 상수가 훨씬 더 작고, 단계 크기가 실제로 작 으면 4 차 방법이 이길까요? 그러나 나는 심지어 시도했지만 3 차 방법은 여전히 우수합니다.
- 잘못된 테스트 : 내 테스트에서 특별한 점이있어 Ruth의 3 차 방법이 고차 방법처럼 작동합니까?