2D太阳系模拟器开发:从位置速度计算轨道参数(a、e、T等)求助
先揪出你的核心公式错误
你之前的计算里,能量公式中的M被当成了天体质量——这是致命错误!引力系统的轨道参数计算,所有公式里的M都是中心恒星的质量,不是绕转天体的质量。这个错误直接导致椭圆轨道下半长轴a的计算完全偏离实际。
修正后的基础公式(明确变量定义)
先把变量说清楚,避免混淆:
r:天体到恒星的直线距离(位置向量的模长)v:天体的速度大小(速度向量的模长)M:恒星质量(划重点!)m:绕转天体的质量G:引力常数
比机械能E(单位质量总能量)
这个值在轨道上是守恒的,公式是:E = (v²)/2 - (G*M)/r椭圆轨道下E是负数,抛物线是0,双曲线是正数,你的模拟里应该都是椭圆轨道。
半长轴a的正确计算
半长轴只由比机械能决定,和当前位置无关,公式:a = - (G*M) / (2*E)修正M的取值后,你可以用椭圆轨道的特性验证:远心点距离
r_ap = a*(1+e),近心点距离r_pe = a*(1-e),两者相加等于2a。偏心率e的正确计算
偏心率需要用到角动量(轨道上守恒的另一个量),先算角动量的模长h:h = |r_vec × v_vec| // 二维下等价于 r*v*sinθ,θ是位置向量和速度向量的夹角然后用下面的公式算e:
e = sqrt(1 + (2*E*h²)/(G²*M²))或者用半长轴推导的等价公式:
e = sqrt(1 - h²/(G*M*a))你之前的e公式没用到角动量,仅靠能量和距离,这肯定不对——同一能量下,不同的角动量对应不同扁率的椭圆轨道。
周期T的计算
直接用开普勒第三定律,简单粗暴:
T = 2π*sqrt(a³/(G*M))
这个公式在恒星固定的简化模型下完全适用,和偏心率无关。
远/近心点时间的计算
这个稍微复杂点,需要用到开普勒方程,步骤如下:
计算真近点角θ:即从近心点到天体当前位置的角度,用位置和速度向量计算:
cosθ = ( (r*v² - G*M)*r_x - (r_vec·v_vec)*v_x ) / (G*M*r) sinθ = ( (r*v² - G*M)*r_y - (r_vec·v_vec)*v_y ) / (G*M*r)用
arctan2(sinθ, cosθ)确定θ的正确象限,避免歧义。转换为偏近点角E:
tan(E/2) = sqrt( (1-e)/(1+e) ) * tan(θ/2)计算平近点角M:
M = E - e*sin(E)计算到达目标点的时间差:
平均角速度n = 2π/T,近心点对应M=0、2π、4π...,远心点对应M=π、3π...。找出离当前M最近的目标M值,计算差值ΔM,然后Δt = ΔM / n,就是到达目标点的时间。
你的模拟代码额外注意点
看你的getAttractionForce函数,返回的是1/dist² * object.getMass() * G——正确的引力公式是F = G*M_star*m_object / dist²。如果你的gravitationalConstant已经包含了恒星质量M_star,那没问题;如果没有,这里的加速度计算会出错,导致轨道模拟本身就不准,自然轨道参数也会错。
内容的提问来源于stack exchange,提问作者Z1nK

