比角动量的计算方法之间存在差异的原因?

时间:2019-07-01 20:21:24

标签: matlab numerical-methods orbital-mechanics

我正试图用数值方法解决两个彼此相对倾斜的椭圆形椭圆轨道之间的转移所需的增量V成本。我使用的方法本质上是计算一个节点处的初始轨道的速度矢量,相对节点处的最终轨道的速度矢量,然后从初始飞行路径角度,初始半径和最终半径计算出转移轨道。

一个关键步骤是计算转移轨道的特定角动量向量和偏心向量,以便计算转移轨道的从焦距到惯性方向的余弦矩阵。但是,当我从惯性系中位置和速度矢量的叉积计算出惯性系中转移轨道的角动量矢量 h 时,我发现了明显的误差(相对误差为-3.9521 e-8)在此向量的大小与代码中较早计算出的标量比角动量之间。

这对我来说很奇怪,因为标量角动量用于计算速度矢量。我对发生精度损失的地方感到困惑。

我尝试提供更高精度的输入,特别是我一直在使用的mu值,但这完全没有改变相对误差。当我使用相同的叉积方法计算轨道1和2的特定角动量时,误差约为机器精度。


        mu = 3.98600437823e+14;

        thetaNT = -55.1582940061466; % deg
        eT = 0.022905923178296;
        aT = 7.243582592195826e+06; % m

        r1A = 7.146263097977215e+06; % m
        v1RA = -1.390985544431790e+02; % m/s
        v1ThetaA = 7.494958913236144e+03; % m/s

        eR1 = [0.355828643065080;-0.934551216774375;0];
        eTheta1 = [0.934551216774375;0.355828643065080;0];

        nCpf1 = [0.263190394679355,-0.840751409136755,0.473146789255815;
            0.880932410956014,0.00949753358184791,-0.473146789255815;
            0.393305102275257,0.541338032000730,0.743144825477394];
        nCpf2 = [0.107314578042381,-0.875080710676727,0.471929370924401;
            0.879361618777851,-0.137938482815824,-0.455736896003458;
            0.463903788257849,0.463903788257849,0.754709580222772];


        v1A = sqrt(v1RA^2 + v1ThetaA^2); % Total speed of orbit 1 at A

        hT = sqrt(aT*mu*(1-eT^2)); % Specific angular momentum of transfer orbit

        eRTB = [-cosd(thetaNT);sind(thetaNT+180);0];
        eThetaTB = [-sind(thetaNT+180);-cosd(thetaNT);0];

        % Calculation of radial speed and tangential speed
        vTRA = mu/hT*eT*sind(thetaNT);
        vTThetaA = mu/hT*(1+eT*cosd(thetaNT));

        vTA = sqrt(vTRA^2+vTThetaA^2);

        vTRB = mu/hT*eT*sind(thetaNT+180);
        vTThetaB = mu/hT*(1-eT*cosd(thetaNT));

        % Conversion of radius and speeds into radius and velocity vectors
        % in perifocal frames
        r1APF1 = r1A.*eR1;
        v1APF1 = v1RA.*eR1 + v1ThetaA.*eTheta1;

        vTBPFT = vTRB.*eRTB + vTThetaB.*eThetaTB;

        v2BPF2 = v2RB.*eR2 + v2ThetaB.*eTheta2;

        % Conversion to inertial reference frame
        r1AN = nCpf1*r1APF1;
        v1AN = nCpf1*v1APF1;

        v2BN = nCpf2*v2BPF2;

        rTAN = r1AN;
        vTAN = v1AN.*(vTA/v1A);

        % Calculation of angular momentum and eccentricity vectors in
        % inertial frame
        hTN = cross(rTAN, vTAN);
        eTN = cross(vTAN, hTN)./mu - rTAN./norm(rTAN);
        diffh = (norm(hTN)-hT)/hT
        diffe = (norm(eTN)-eT)/eT

我希望diffh和diffe大约是机器精度的2.2e-16,但是它们要大得多。具体来说,diffh = -3.9689e-08,差异= 7.5474e-05。

更新:如果这有助于集中您的搜索,该错误似乎出现在我的径向矢量和速度矢量计算中。

2 个答案:

答案 0 :(得分:0)

机器精度是相对,它由给定指数处的浮点数之间的距离组成。例如,在Matlab中,您可以检查给定数字的机器精度:

eps(1)
  ans = 
        2.22044604049250313e-16
eps(12345)
  ans = 
        1.818989403545856e-12.

通常,您应该期望的值大约是您使用的值的e-16倍。因此,1e-8的大小是位置(1e6的阶)和速度(1e2的阶)乘积的机器精度。即该产品应为1e8的量级,因此其机器精度约为8-16 = -8。

还请注意,如果您担心精度,则可以考虑使用弧度而不是度的角度。

答案 1 :(得分:0)

  

我根据惯性系中位置和速度矢量的叉积计算惯性系中转移轨道的角动量矢量h

这是最有可能造成错误的地方。我不遵循您使用的数学方法,因为我对这些问题的处理方式有所不同。我会找到转移轨道的轨道元素,然后将卫星在转移轨道中的位置视为真正的异常,然后计算增量V应该是微不足道的,因为您知道燃烧前后每个时间步长的速度矢量。如果您需要我进一步说明,请告诉我,我会在哪里澄清。