Причина несоответствия между методами расчета удельного момента количества движения?

Я пытаюсь численно решить стоимость дельта-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 и diffe = 7,5474e-05.

ОБНОВЛЕНИЕ: ошибка появляется где-то в моем расчете радиального вектора и вектора скорости, если это поможет сконцентрироваться на вашем поиске.


person ReluctantEarthling    schedule 01.07.2019    source источник
comment
Я не могу запустить ваш код. Я получаю сообщение об ошибке Undefined function or variable 'v2RB'.   -  person gnovice    schedule 11.07.2019
comment
Извините, удалите строки v2BPF2 = v2RB.*eR2 + v2ThetaB.*eTheta2; и v2BN = nCpf2*v2BPF2; и все должно заработать   -  person ReluctantEarthling    schedule 12.07.2019


Ответы (2)


Машинная точность относительна, она состоит из расстояния между числами с плавающей запятой в заданном показателе степени. Например, в Matlab вы можете проверить машинную точность для заданного числа:

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

Обычно вы должны ожидать что-то примерно в e-16 раза превышающее значение, с которым вы работаете. Таким образом, 1e-8 находится в порядке величины машинной точности для произведения положения (порядок 1e6) и скорости (порядок 1e2). т.е. произведение должно быть порядка 1e8, следовательно, его машинная точность порядка 8-16=-8.

Также обратите внимание, что если вас беспокоит точность, вы можете рассмотреть возможность использования углов в радианах, а не в градусах.

person Mefitico    schedule 01.07.2019
comment
Чтобы было ясно, diff возвращает относительную точность. Абсолютная ошибка в этой точке порядка 1e3. Кроме того, есть ли значительная разница в точности в Matlab между градусной и радианской математикой? У меня сложилось впечатление, что математика в градусах и математика в радианах работают с одинаковой точностью в Matlab, и я использовал градусы, потому что необработанные данные, с которыми я работаю, были в этом формате. - person ReluctantEarthling; 03.07.2019
comment
Немного сложно оценить относительную точность такого перекрестного произведения. Положение и скорость должны быть почти ортогональными для большей части орбиты и точно ортогональными в двух точках орбиты. Из-за этого ваша относительная точность не должна использовать норму перекрестного произведения norm(hTN), я бы предпочел использовать norm(rTAN)*norm(vTAN). - person Mefitico; 10.07.2019
comment
Кроме того, если вам нужно использовать много необработанных данных в градусах, я бы посоветовал придерживаться их, а не преобразовывать. - person Mefitico; 10.07.2019
comment
Когда я использовал norm(rTAN)*norm(vTAN) - hT для вычисления ошибки, я получил еще большую относительную ошибку: diff = (norm(rTAN)*norm(vTAN) - hT)/hT дает diff = 1.7216e-04. Я не думаю, что предложенный вами подход сработает в этой ситуации. - person ReluctantEarthling; 11.07.2019
comment
На самом деле, я имел в виду, что вы должны нормализовать с помощью norm(rTAN)*norm(vTAN), что означает деление на него, а не на hT. Отсюда diff = (norm(hTN)-hT)/(norm(rTAN)*norm(vTAN)) - person Mefitico; 11.07.2019
comment
Почему вы думаете, что это будет лучшим решением? Как видно из редактирования моего поста, я совершенно уверен, что проблема заключается в моем расчете rTAN и vTAN, поскольку, когда я начал использовать их для расчета другого значения (эксцентриситета орбиты), они также создали значительную ошибку. - person ReluctantEarthling; 11.07.2019
comment
Это не должно изменить значения для rTAN и vTAN, поэтому это не должно обеспечивать лучшее решение. Скорее, предложение состоит в том, чтобы лучше оценить, действительно ли ошибка, которую вы обнаруживаете, имеет числовую природу. - person Mefitico; 11.07.2019
comment
diff = (norm(hTN)-hT)/(norm(rTAN)*norm(vTAN)) diff = -3.9682e-08 - это результат, который я получил. Это полезно? Кажется, это почти то же самое, что и результат, который я получал ранее. - person ReluctantEarthling; 11.07.2019
comment
Да, это полезно (в некотором смысле). Потому что, как я утверждал в исходном ответе, что-то в порядке 1e-8 - это то, что вы должны были ожидать для числовой точности в первую очередь. Вы ожидали, что diff будет соответствовать величине машинной точности, и я считаю, что это действительно так. Плохая новость для вас заключается в том, что повышение точности далеко не тривиально. В Matlab я не знаю ни одного стандартного метода повышения точности двойного формата по умолчанию, но вы можете подумать о переписывании своего кода на python и использовании некоторой библиотеки произвольной точности, например. mpmath.org - person Mefitico; 11.07.2019
comment
Я думал, что машинная точность в MATLAB была относительной ошибкой 1e-16? Поскольку diff является относительной ошибкой, разве она не должна быть в этом районе, или я что-то упускаю? - person ReluctantEarthling; 12.07.2019
comment
Если вы вычислите 100000001.0-100000000.0, вы получите 1.0. но на самом деле это 1.0 должно иметь точность порядка 1e-8, и не имеет значения, если вы сейчас нормализуете на 1,0. Обратите внимание, что 100000000,0=1e8. Я полагаю, что это то, что происходит, когда вы вычисляете перекрестное произведение: при суммировании появляется ошибка большой величины, потому что результат мал по сравнению с слагаемыми. - person Mefitico; 12.07.2019

Я вычисляю вектор углового момента h переходной орбиты в инерциальной системе от векторного произведения векторов положения и скорости в инерциальной системе отсчета

Вот тут скорее всего и кроется ошибка. Я не следую математике, которую вы используете, поскольку я подхожу к этим проблемам по-другому. Я бы нашел орбитальные элементы вашей переходной орбиты, а затем положение вашего спутника на вашей переходной орбите как настоящие аномалии, а затем вычисление дельты V должно быть довольно тривиальным, поскольку вы знаете свои векторы скорости на каждом временном шаге до и после сжигания. Если вам нужно, чтобы я расширил это, дайте мне знать, где я могу уточнить, и я это сделаю.

person aaastro    schedule 25.07.2019