Я пытаюсь преобразовать векторы состояния (положение и скорость) в элементы Кеплера, однако я сталкиваюсь с проблемами, когда отрицательная скорость или положение приведут к неверным результатам при попытке вычислить истинную аномалию.
Вот несколько способов вычислить истинную аномалию:
/// <summary>
/// https://en.wikipedia.org/wiki/True_anomaly#From_state_vectors
/// </summary>
public static double TrueAnomaly(Vector4 eccentVector, Vector4 position, Vector4 velocity)
{
var dotEccPos = Vector4.Dot(eccentVector, position);
var talen = eccentVector.Length() * position.Length();
talen = dotEccPos / talen;
talen = GMath.Clamp(talen, -1, 1);
var trueAnomoly = Math.Acos(talen);
if (Vector4.Dot(position, velocity) < 0)
trueAnomoly = Math.PI * 2 - trueAnomoly;
return trueAnomoly;
}
//sgp = standard gravitational parameter
public static double TrueAnomaly(double sgp, Vector4 position, Vector4 velocity)
{
var H = Vector4.Cross(position, velocity).Length();
var R = position.Length();
var q = Vector4.Dot(position, velocity); // dot product of r*v
var TAx = H * H / (R * sgp) - 1;
var TAy = H * q / (R * sgp);
var TA = Math.Atan2(TAy, TAx);
return TA;
}
public static double TrueAnomalyFromEccentricAnomaly(double eccentricity, double eccentricAnomaly)
{
var x = Math.Sqrt(1 - Math.Pow(eccentricity, 2)) * Math.Sin(eccentricAnomaly);
var y = Math.Cos(eccentricAnomaly) - eccentricity;
return Math.Atan2(x, y);
}
public static double TrueAnomalyFromEccentricAnomaly2(double eccentricity, double eccentricAnomaly)
{
var x = Math.Cos(eccentricAnomaly) - eccentricity;
var y = 1 - eccentricity * Math.Cos(eccentricAnomaly);
return Math.Acos(x / y);
}
Редактировать: еще один способ сделать это, на что указал Призрак:
public static double TrueAnomaly(Vector4 position, double loP)
{
return Math.Atan2(position.Y, position.X) - loP;
}
Все позиции относятся к родительскому телу.
Все эти функции согласуются, если position.x, position.y и speed.y все положительны.Как мне исправить это так, чтобы я получил последовательные результаты, когда положение и скорость отрицательны?
Просто чтобы уточнить: мои углы кажутся правильными, я просто указываю на неправильный квадрант в зависимости от положения и / или векторов скорости.
Да, я былнеправильно, все вышеперечисленное возвращает правильные значения в конце концов. Итак, я обнаружил крайний случай, когда большинство вышеприведенных вычислений не выполняются.Учитывая положение и скорость:
pos = new Vector4() { X = -0.208994076275941, Y = 0.955838328099748 };
vel = new Vector4() { X = -2.1678187689294E-07, Y = -7.93096769486992E-08 };
Я получаю некоторые странные результаты, то есть ~ -31,1 градуса, когда я думаю , он должен вернуть `31,1 (не отрицательно).один из них возвращает ~ 328.8.
Однако при тестировании с этой позицией и скоростью результаты будут вполне нормальными:
pos = new Vector4() { X = -0.25, Y = 0.25 };
vel = new Vector4() { X = Distance.KmToAU(-25), Y = Distance.KmToAU(-25) };
Смотрите мой ответ для дополнительного кода о том, как я тестирую, и о том, как ям, используя для некоторых других переменных.
На этом я буду ходить кругами.это результат ошибки в моем существующем коде, которая обнаруживается при одних условиях, но не при других.Я предполагаю, что реальный вопрос сейчас - ПОЧЕМУ Получаю ли я другие результаты с позицией / скоростью выше, которые не соответствуют моим ожиданиям или друг другу?