我正在尝试计算给定一组位置向量的圆形轨道的 xyz 速度向量,但我似乎无法正确计算。
获得速度大小的公式是引力常数的平方根乘以初级的质量除以初级到围绕它运行的物体的距离。我用太阳质量表示质量,用天文单位表示距离,用年表示时间。为简化起见,主要是我们的太阳,这意味着 G * M 等于 39.5。太阳的位置是 0, 0, 0,你看到的地球矢量是 au,是从 JPL Horizons 工具获得的。
这是代码:
function getDistanceParams(p1, p2) {
const dx = p2.x - p1.x;
const dy = p2.y - p1.y;
const dz = p2.z - p1.z;
return { dx, dy, dz, dSquared: dx * dx + dy * dy + dz * dz };
}
function getCircularOrbit() {
const dParams = getDistanceParams(
{ x: 0, y: 0, z: 0 },
{
x: 0.9197324105567349,
y: -0.4147318273536994,
z: -1.750037390352759e-5
}
);
const vMag = Math.sqrt(39.5 / Math.sqrt(dParams.dSquared));
return {vx: dParams.dx * vMag, vy: dParams.dy * vMag, vz: dParams.dz * vMag};
}
getCircularOrbit();
/*
The above outputs this:
{ vx: 5.754832301294686,
vy: -2.59500707927136,
vz: -0.00010950110691846996 }
The actual velocity vectors:
vx: 2.4645428337894026,
vy: 5.7097644117945805,
vz: -3.3177815766459033e-4,
*/
我哪里错了???
更新:有效的代码
如果有人好奇,这是最终完成这项工作的代码:
export function getDistanceParams(p1, p2) {
const dx = p2.x - p1.x;
const dy = p2.y - p1.y;
const dz = p2.z - p1.z;
return { dx, dy, dz, dSquared: dx * dx + dy * dy + dz * dz };
}
export function getIdealCircularOrbit(primary, secondary, g) {
const dParams = getDistanceParams(primary, secondary);
const d = Math.sqrt(dParams.dSquared);
const vMag = Math.sqrt(g * primary.m / d);
return {
x: secondary.x,
y: secondary.y,
z: secondary.z,
vx: primary.vx + -dParams.dy * vMag / d,
vy: primary.vy + dParams.dx * vMag / d,
vz: primary.vz + dParams.dz * vMag / d
};
}