是Euler-Cromer方法吗?还是说不正确?

问题描述 投票:0回答:1
k=3;m=123
eulerC_x=[A]
eulerC_v=[0]
eulerC_t=[0]
c=0
for z in np.arange(t_euler,t_max,dt_euler):
    a=-(k/m)*eulerC_x[c]
    eulerC_v.append(eulerC_v[c]+a*dt_euler)
    eulerC_x.append(eulerC_x[c]+eulerC_v[c+1]*dt_euler) 
    #c+1 uses new velocity value to update the position, removing the energy increase in euler         
    eulerC_t.append(z)
    c+=1

这是求解与简谐运动相关的常微分方程的代码。 我的讲师似乎认为这是错误的,因为我首先更新速度,然后使用 (n+1) 速度来计算新位置。他认为我应该先更新位置,然后使用(n+1)位置来计算新的速度。每条资源线都在说我认为正确的事情,但我的讲师却说相反的事情。 这消除了我的欧拉方法中的能量增加,我的图表证实了这一点。我只是想知道它是否正确。谢谢!

python physics numerical-methods
1个回答
0
投票

这个半显式欧拉方法确实是辛的,并且也被称为 Euler-Cromer。

这是一阶方法。作为辛方法,这意味着能量函数的一阶修正是恒定的,或者至少在更高阶上发生变化。在能量与位置和脉冲成二次方的情况下,修改后的能量实际上在浮点误差累积之前是恒定的。未经修改的物理能量将在宽度为 O(h) 的恒定带内振荡,其中 h 是步长。

半隐式辛欧拉方法有两种变体,都是正确的。由于它们具有相反的局部截断误差,因此将它们交替组合可以消除一阶误差项,得到二阶辛方法,即 Verlet 方法。

© www.soinside.com 2019 - 2024. All rights reserved.