Поэтому я пытаюсь создать базовую программу на C ++, которая рассчитывает средние, эксцентричные и истинные аномалии, а также радиальное расстояние и скорость планеты. Это одна из моих первых программ, над которыми я работал, поэтому я знаю, что она не так лаконична, как могла бы быть. Мне просто трудно заставить его работать. Я знаю, что некоторые значения, возможно, придется преобразовать, чтобы единицы совпадали, и я могу сделать это позже. Я просто хочу знать, что заставляет его не работать. Также, в основном, у меня есть утверждения для каждой планеты; Я не включил остальные, потому что это заняло бы слишком много места.
В конечном счете, цель программы — напечатать таблицу времен, аномалий, r и v с учетом названия планеты. Если вам нужны какие-либо разъяснения, пожалуйста, дайте мне знать. Спасибо
заранее спасибо
const float G = 6.673E-11;
const float solar_m = 1.989E30;
const float mu = G*solar_m;
class Planet
{
double a, ec, T;
public:
void SetValues(float, float, float);
float Calculations();
};
void Planet::SetValues(float m_a, float m_ec, float m_T)
{
m_a = a;
m_ec = ec;
m_T = T;
}
float Planet::Calculations()
{
//Set up values
a = a*1.496E11; //AU to m
T = T*365; //Period converted to days
float delta = 0.001;
float M;
float E;
float E1;
float E2, f_E2;
float E3, f_E3;
float f,r,v;
for(int t; t<T; t++)
{
M= sqrt(mu/(a*a*a))*t;
E1= M;
E2 = (M-E1+ec*sin(E1))/(ec*cos(E1)-1);
f_E2 = M-E2+ec*sin(E2);
E3 = (M-E2+ec*sin(E2))/(ec*cos(E2)-1);
f_E2 = M-E3+ec*sin(E3);
if (f_E2<delta)
E=E2;
else if (f_E3<delta)
E=E3;
else
cout<<"not enough iterations";
f = 2*atan(sqrt((1+ec)/(1-ec))*tan(E/2));
r = (a*(1-ec*ec))/(1+ec*cos(f));
v = sqrt(mu*(2/r -1/a));
cout<< t<<" "<<M<<" "<<E<<" "<<f<<" "<<r<<" "<<v;
}
};
int main()
{
int i;
float t;
string pName;
cout<<"What planet do you want to simulate?";
cin>>pName;
if (pName.compare("mercury") || pName.compare("Mercury"))
{
Planet me;
me.SetValues(.387, .2056, .24);
me.Calculations();
};
Вы действительно не объяснили свою проблему, но я предложу несколько критических замечаний.
Вы смешиваете и сочетаете свое использование double
а также float
, Это приводит к ошибкам округления. Выберите один и придерживайтесь его.
У вас есть несколько методов, которые заканчиваются };
(Консольно-Запятая). Проверьте синтаксис: методы не заканчиваются точкой с запятой. Также ваше if-выражение заканчивается точкой с запятой. Та же проблема.
Ваш main
Функция, однако, не заканчивается.
Некоторые твои расчеты меня беспокоят.
M= sqrt(mu/(a*a*a))*t;
E1= M;
E2 = (M-E1+ec*sin(E1))/(ec*cos(E1)-1);
f_E2 = M-E2+ec*sin(E2);
В уравнении для E2
, M
а также E1
имеют одинаковое значение, по определению E1=M
назначение, так что это дает:
E2 = (0+ec*sin(E1))/(ec*cos(E1)-1);
или же
E2 = (ec * sin(E1)) / (ec * cos(E1) - 1);
Правильно ли указано «- 1» в знаменателе? Это предотвращает факторинг ec
,
Ваш алгоритм не работает, потому что SetValues
устанавливает значения аргумента, а не значения члена.
Попробуй это:
void Planet::SetValues(float m_a, float m_ec, float m_T)
{
a = m_a;
ec = m_ec;
T = m_T;
}