моделирование — C ++ Программа для моделирования уравнений Кеплера

Поэтому я пытаюсь создать базовую программу на 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();
};

-2

Решение

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

Вы смешиваете и сочетаете свое использование double а также float, Это приводит к ошибкам округления. Выберите один и придерживайтесь его.

У вас есть несколько методов, которые заканчиваются }; (Консольно-Запятая). Проверьте синтаксис: методы не заканчиваются точкой с запятой. Также ваше if-выражение заканчивается точкой с запятой. Та же проблема.

Ваш main Функция, однако, не заканчивается.

0

Другие решения

Некоторые твои расчеты меня беспокоят.

  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,

0

Ваш алгоритм не работает, потому что SetValues устанавливает значения аргумента, а не значения члена.

Попробуй это:

void Planet::SetValues(float m_a, float m_ec, float m_T)
{
a = m_a;
ec = m_ec;
T = m_T;
}
0