-
GASpiridonov authored
Доработано интегрирование Введенны кеплеровские элементы орбиты
GASpiridonov authoredДоработано интегрирование Введенны кеплеровские элементы орбиты
Satellite.h 5.99 KiB
#pragma once
#include "Planets.h"
//элементы радиус-вектора в экаваториальной системе координат
struct equator_elements_orbit {
double r; // величина радиус-вектора
double v; // линенйая скорость
double θ; // угол между направлением линейной скорости и трансверсалью орбиты
double i; // наклонение орбиты
double Ω; //а долгота восходящего узла орбиты
double u; // аргумент широты
};
//элементы радиус-вектора в меридиальной системе координат
struct meridian_elements_orbit{
double r; // величина радиус-вектора
double v; // линенйая скорость
double θ; // угол между направлением линейной скорости и трансверсалью орбиты
double i; // наклонение орбиты
double Ω; // долгота восходящего узла орбиты
double u; // аргумент широты
};
//Кеплеровские элементы орбиты
struct Kepler_elements_orbit {
double a; //величина большой полуоси орбиты
double e; //эксцентриситет орбиты
double i; //угол наклонения орбиты в градусах
double Ω; //долгота восходящего узла в градусах
double ω; //аргумент перигея в градусах
double M; //величина средней аномалии градусах
double E; //величина эксцентрической аномалии
double N; //истинная аномалия
double u; //аргумент широты
double convertGradToRad(double grad);
double convertRadToGrad(double rad);
};
class Satellite {
private:
const double Radius_Earth = 6378.13630; // средний радиус земли
const double compression_earth = 1 / 298.257; //сжатие Земли
const std::vector<double> coef_time_step{ 0.000000000000000000, 0.056262560526922147, //коэффиценты для разбития
0.180240691736892365, 0.352624717113169637, // шага на подинтервалы
0.547153626330555383, 0.734210177215410532,
0.885320946839095768, 0.977520613561287501 };
double m_start_time; //момент запуска спутника
double last_moment_integration; // ммомент времени после последнего интегрирования
double m_As{ 1 }; // площадь поперечного сечения спутника
double m_ms{ 1 }; // масса спутника
double m_ks{ 1.5 }; //эмперический коэффициент отражения
double m_r{ 0 }; // радиус-вектор полета спутника в данный момент времени
double m_v{ 0 }; // вектор скорости полета спутника в данный момент времени
double m_h{ 0 }; // высота полета спуттника в данный момент времени
double m_density{0}; //плотность атмосферы на данной высоте
Matrix m_DCS{ 3, 1 }; // геоцентрические небесные координаты спутника
Matrix m_DVS{ 3, 1 }; // геоцентирические небесные компоненты скорости
Matrix m_F{ 3, 1 }; // компоненты ускорения вызванного атмосферой Земли
equator_elements_orbit m_eeo{}; //экватариальный вектор состояния
meridian_elements_orbit m_meo{}; //меридиальный вектор состояния
Kepler_elements_orbit m_Keo{}; // Кеплеровские элементы орбиты
std::vector<Matrix> m_A{}; //массив хранящий коэффициенты полинома
Moon* m_moon{nullptr};
Sun* m_sun{ nullptr };
Earth* m_earth{ nullptr };
// вычисленеие радиус-вектора полета спутника
int calculate_r();
// вычисленеи плотности амосферы
int calculate_density();
//вычисление вектора скорости спутника
int calculate_V();
// вычисление ускорения обусловленного сопротивлением атмосферы
Matrix& calculate_F();
// вычисление ускорения обусловленного сопротивлением атмосферы
Matrix& recalculate_F(const Matrix& i_DVS);
// вычисление всех ускорений на заданный момент времени
Matrix step_calculate_F(const Matrix& i_DCS, const Matrix& i_DVS, const double step_time);
//преобразовние экватариального вектора состояния в декартову ситему
int convertStateVectorToDCe();
//преобразовние мериадильного вектора состояния в декартову ситему
int convertStateVectorToDCm();
//преобразование декартовой системы в эватариальный вектор состояния
int convertDCeTOStateVecror();
//преобразования декартовой системы в меридиальный вектор состояния
int convertDCmTOSteteVector();
//преобразование Кеплеровских элементов орбиты в декартовую систму координат
int convertKeplertoDC();
int initialization_A();
public:
Satellite(double time_TDB, double i_As, double i_ms, double i_ks,
Matrix& i_DCS, Matrix& i_DVS, Moon* ptr_moon, Sun* ptr_sun, Earth* ptr_earth);
//интегрирование на один шаг времени, в качестве параметра конечное время
int integration_step(double i_time);
~Satellite() {};
};