我正在尝试创建一个太阳系模拟,我在尝试找出我放入模拟中的随机物体的初始速度矢量时遇到了问题。
假设: - 我正在使用高斯格雷夫常数,所以我的所有单位都是AU / Solar Masses / Day - 使用x,y,z作为坐标 - 一颗恒星,固定在0,0,0。确定准随机质量 - 我将一个行星放在一个随机的x,y,z坐标上,并确定它自己的准随机质量。
在我启动nbody循环(使用RK4)之前,我希望行星的初始速度能够围绕恒星进行圆形轨道运动。当然,其他放置的行星将在模拟开始时拉上它,但我想给它一个稳定轨道的机会......
所以,最后,我需要有一个行星的初始速度矢量(x,y,z),这意味着在1次步之后它将围绕恒星形成一个圆形轨道。
帮助?几个星期以来,我一直在反对这一点,我不相信我有任何合理的解决方案......
答案 0 :(得分:3)
如果你假设恒星M
的质量远大于所有行星sum(m[i])
的总质量,那么这很简单。这简化了问题,因为它允许您将星形钉在坐标系的中心。还可以更容易地假设所有行星的运动是共面的,这进一步将问题的维数降低到2D。
首先根据半径矢量r[i]
(轨道半径)的大小确定圆形轨道速度的大小。它仅取决于恒星的质量,因为上述假设:v[i] = sqrt(mu / r[i])
,其中mu
是恒星的标准引力参数mu = G * M
。
从phi[i]
统一采样,选择随机轨道相位参数[0, 2*pi)
。然后,行星在笛卡尔坐标系中的初始位置为:x[i] = r[i] * cos(phi[i])
y[i] = r[i] * sin(phi[i])
对于圆形轨道,速度矢量始终垂直于径向矢量,即其方向为phi[i] +/- pi/2
(+pi/2
用于逆时针(CCW)旋转,-pi/2
用于顺时针旋转)。我们以CCW轮换为例。行星速度的笛卡尔坐标为:vx[i] = v[i] * cos(phi[i] + pi/2) = -v[i] * sin(phi[i])
vy[i] = v[i] * sin(phi[i] + pi/2) = v[i] * cos(phi[i])
这可以通过添加z[i] = 0
和vz[i] = 0
轻松扩展到共面3D动作,但这没有任何意义,因为Z方向上没有力,因此z[i]
和{{1将永远等于vz[i]
(即你将解决完整3D空间的2D子空间问题)。
通过全3D模拟,每个行星在一个随机倾斜的初始轨道上移动,可以这样工作:
此步骤与2D案例中的步骤1相同。
您需要在单位球体的表面上选择一个初始位置。有关如何以统一随机方式执行此操作的示例,请参阅here。然后将单位球体坐标缩放0
。
在3D情况下,不是两个可能的垂直向量,而是存在行星速度所在的整个切向平面。切向平面的法线向量与半径向量共线,r[i]
。可以选择任何垂直于dot(r[i], v[i]) = 0 = x[i]*vx[i] + y[i]*vy[i] + z[i]*vz[i]
的向量,例如r[i]
。这导致极点处的零向量,因此可以选择e1[i] = (-y[i], x[i], 0)
。然后,通过取e1[i] = (0, -z[i], y[i])
和r[i]
:e1[i]
的叉积,可以找到另一个垂直向量。现在e2[i] = r[i] x e1[i] = (r[2]*e1[3]-r[3]*e1[2], r[3]*e1[1]-r[1]*e1[3], r[1]*e1[2]-r[2]*e1[1])
和e1[i]
可以通过将它们除以规范来规范化:
e2[i]
n1[i] = e1[i] / ||e1[i]||
其中n2[i] = e2[i] / ||e2[i]||
。现在您在切线平面上有一个正交向量基础,您可以在||a|| = sqrt(dot(a, a)) = sqrt(a.x^2 + a.y^2 + a.z^2)
中选择一个随机角度omega
并将速度向量计算为[0, 2*pi)
,或者计算为笛卡尔分量:
v[i] = cos(omega) * n1[i] + sin(omega) * n2[i]
{
{1}} {
{1}}。
请注意,通过构造,步骤3中的基础取决于半径向量,但这并不重要,因为添加了随机方向(vx[i] = cos(omega) * n1[i].x + sin(omega) * n2[i].x
)。
关于单位的选择,在模拟科学中,我们总是倾向于将事物保持在自然单位,即所有计算量都是无量纲的单位,并保持在vy[i] = cos(omega) * n1[i].y + sin(omega) * n2[i].y
或至少在1-2个数量级之内,因此可以使用有限浮点表示的完整分辨率。如果你把恒星质量以太阳质量为单位,以澳大利亚为单位的距离和以年为单位的时间,那么对于类似地球的行星,在类似太阳的恒星周围vz[i] = cos(omega) * n1[i].z + sin(omega) * n2[i].z
AU,轨道速度为omega
(AU / yr),半径矢量的大小为[0, 1]
(AU)。
答案 1 :(得分:1)
让向心加速度等于重力加速度。
m 1 v 2 / r = G m 1 m 2 / r 2 < / SUP>
v = sqrt(G m 2 / r)
当然,星体质量m 2 必须远大于行星质量m 1 ,否则你实际上并不存在单体问题。
在设置物理问题时,单位是一个痛苦的屁股。我花了几天时间来解决与时间步长单位相比的错误。您选择AU / Solar Masses / Day是完全疯狂的。先解决这个问题。
并且,请记住,计算机本身具有有限的精度。 nbody模拟会累积积分误差,因此无论步长持续时间如何,在经过一百万或十亿步后,您肯定不会有圆。我对这个数学知之甚少,但我认为稳定的n体系统通过共振来保持稳定,这些共振吸收了微小的变化,无论是由附近的恒星还是由FPU引入的。因此,设置可能适用于稳定的5体问题,但仍然无法解决1体问题。
答案 2 :(得分:0)
正如Ed建议的那样,我会使用mks单位,而不是其他一些单位。
对于初始速度,我同意Ed所说的部分内容,但我会使用向心加速度的向量形式:
m 1 v 2 / rr(hat)= G m 1 m 2 / r2 r(帽子)
将z设置为0,并将极坐标转换为笛卡尔坐标(x,y)。然后,您可以为y或x分配初始速度,并计算另一个变量满足圆形轨道标准的内容。这应该给你一个初始(Vx,Vy),你可以从你开始你的问题。关于nbody中心力问题的数值配方也应该有相当多的文献。