Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模拟地球';Python中使用辛欧拉的s轨道_Python_Simulation_Physics_Orbital Mechanics_Verlet Integration - Fatal编程技术网

模拟地球';Python中使用辛欧拉的s轨道

模拟地球';Python中使用辛欧拉的s轨道,python,simulation,physics,orbital-mechanics,verlet-integration,Python,Simulation,Physics,Orbital Mechanics,Verlet Integration,我试图模拟地球绕太阳的运动。 这就是我到目前为止想到的 import numpy as np import matplotlib.pyplot as plt #Set parameters: N = 365 # Earth days in a year dt = 1.00/N # Time Step: Fractions of a year - 1 Earth day (i.e. 1/365) mu = 4 * np.pi*

我试图模拟地球绕太阳的运动。 这就是我到目前为止想到的

import numpy as np
import matplotlib.pyplot as plt
#Set parameters:
N = 365                     # Earth days in a year
dt = 1.00/N                 # Time Step: Fractions of a year - 1 Earth day (i.e. 1/365)
mu = 4 * np.pi**2           # mu=4pi^2 is the Gravitational Parameter: mu = GM where G=6.67e-11 is the Universal Gravitational Constant and M is the mass of the body
rEar = 1

#Create an array, for all variables, of size N with all entries equal to zero:
xEar = np.zeros((N,))
yEar = np.zeros((N,))
vxEar = np.zeros((N,))
vyEar = np.zeros((N,))

# Initial Conditions:
xEar[0] = rEar                   # (x0 = r, y0 = 0) in AU
vyEar[0] = np.sqrt(mu/rEar)      # (vx0 = 0, v_y0 = sqrt(mu/r)) AU/yr

#Implement Verlet Algorithm:
for k in range(0,N-1):
    vxEar[k+1] = vxEar[k] - (mu*xEar[k]) / (rEar**3)*dt
    xEar [k+1] = xEar[k] + vxEar[k+1]*dt
    vyEar[k+1] = vyEar[k] - (mu*yEar[k]) / (rEar**3)*dt
    yEar [k+1] = yEar[k] + vyEar[k+1]*dt

#Plot:
plt.plot(xEar, yEar, 'go')
plt.title ('Circular Orbit of Earth')
plt.xlabel ('x')
plt.ylabel ('y')
plt.axis('equal')
plt.show()

但是我不认为我对verlet的实现是正确的?有了这个代码,我认为轨道将永远是圆形的。如果有任何改进的建议,我们将不胜感激。

您的文字有点错误。辛欧拉方法是一阶方法,而Stormer-Verlet方法是二阶方法。人们可以通过实施leap-Froging-Verlet方案来弥合两种方法之间的差距,该方案在时间间隔的中点处获取速度。实际上,这意味着初始速度必须在时间
t0 dt/2
时移到1,其他一切保持不变

# Initial Conditions:
xEar[0] = rEar                   # (x0 = r, y0 = 0) in AU
vyEar[0] = np.sqrt(mu/rEar)      # (vx0 = 0, v_y0 = sqrt(mu/r)) AU/yr,
vxEar[0] = 0 - mu / (rEar**2)*(-0.5*dt) # corrected for time -dt/2
你对原力的实施是错误的,因为它使用的是一个恒定半径,而不是当前行星的实际半径。改为

#Implement Verlet Algorithm:
for k in range(0,N-1):
    rEar = (xEar[k]**2+yEar[k]**2)**0.5
    vxEar[k+1] = vxEar[k] - (mu*xEar[k]) / (rEar**3)*dt
    xEar [k+1] = xEar[k] + vxEar[k+1]*dt
    vyEar[k+1] = vyEar[k] - (mu*yEar[k]) / (rEar**3)*dt
    yEar [k+1] = yEar[k] + vyEar[k+1]*dt

您的预期输出是什么?实现是正确的。你可以通过使用2个元素的向量来计算速度(你只需要当前速度和下一个速度),从而节省一些内存,事实上,你不需要在绘图中使用它们。关于圆形轨道,这取决于你的初始速度,例如,如果你在VyEar[0]表达式前加上2,你会得到一个椭圆轨道。谢谢你的帮助,我一直在看一些其他的轨道模拟,它们似乎包括了太阳的质量,所以我想知道我没有包括这一点是否错了?我刚刚复制了你的代码。在当前一个物体处于中心力场的模拟中,太阳的质量已经包含在系数中。显然,选择该值是为了使周期为1年,距离为1 AU。如果你有一个多个相互作用物体的模拟,你将需要通过相关的质量来明确地缩放力。我目前正试图通过为每个物体添加一个加速度计算来实现这一点,使用质量并有一点困难。我会把它放在for循环中,并为加速度创建一个零数组吗?我不认为这是正确的,因为加速度不会随时间累积,但我正在努力了解如何将itSee纳入系统方法,这也是我在javascript中使用velocity Verlet进行重力模拟时投票率最高的答案。