A A A A Автор Тема: как просчитать траекторию спутника?  (Прочитано 12938 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн xd

  • *****
  • Сообщений: 17 982
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: как просчитать траекторию спутника?
« Ответ #20 : 02 Мая 2012 [16:06:45] »
a = F/m
F = GMm/R2
a = GM/R2 = const(m)
Это при условии m << M. Если они сопоставимы, вид уравнений несколько иной.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #21 : 02 Мая 2012 [17:21:27] »
пытаюсь написать функцию С++ этой траектории по

ma =-G((Mm)/(|r|^3))r

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


//взятие корня у long long
long long sqrBig(long long A, int clear)
{long long B=A/2;
int i=0;
while( i < clear)
{
//temp=B;
if((B*B)<A)
{
B=B+B/2;

}
else
{B=B-B/2;}
//B0=temp;
i++;
}
return B;
}

//сама функция подсчета траектории
void Calc(double &X, double &Y,double &Xold, double &Yold,double &SpeedX,double &SpeedY)
{     
//масса земли умноженная на гравитационную постоянную
    const long long Kearth =667384000000000;
 //для затирания следа сохраняю предыдущие координаты
    Xold =X;
    Yold =Y;
    long long Rx =X/0.031392; //  0.031392 - отношения маштабирования Земли (пиксели/км)
    long long Ry =Y/0.031392;
    long long absR = sqrBig(Rx*Rx+Ry*Ry);
    SpeedX+=(-Kearth)/(absR*absR*absR)*Rx*(TIMER/1000);
    SpeedY+=(-Kearth)/(absR*absR*absR)*Ry*(TIMER/1000);
    Rx+=SpeedX;
    Ry+=SpeedY;
    X=Rx*0.031392;
    Y=Ry*0.031392;
}

возможно что-то упераеться в порядок чисел, так что если, кто знает класс для работы с порядками до 10^25 степени буду признателен.

Tau

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #22 : 02 Мая 2012 [17:34:26] »
Обычной точности double всегда хватает.
Гравитационная постоянная Земли (G*M)  = 398600.448 км3/сек2
-GM*r/r3 это ускорение, а оно у вас в скорости фигурирует.
И, наверное, лучше сначала вычислить положение, а потом уже масштабировать в пиксели, а то как-то дико. У вас гравитационная постоянная в пиксели3/сек2 переведена?
Не совсем понятно, что вы хотите получить. Начинали с вопроса о скоростях, теперь положения в двумерном пространстве вычисляете...

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #23 : 02 Мая 2012 [18:19:30] »
Ну начинал я с вопроса о скоростях Vx и Vy которые зададут вектор в двумерном пространстве, они не эквивалент радиальной и трансверсальной скорости, хотя конечно можно путем манипуляций этот вектор собрать  на проекции оси к центру земли и по касательной(такую задачу я сейчас и вовсе решить не берусь).

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

 По замечаниям спасибо сейчас попытаюсь осознать.

ускорение есть отношение дельта скорости к дельта времени. (TIMER/1000) мой минимальный шаг(дельта времени) в тех формулах скорость прибавляет к себе дельту скорости. Другое дело я не уверен в том как разложил вектора скорости на X и Y там я могу быть вкорне не прав.


Сейчас функция выглядит так
#define EarthR 200 //радиус пикселях. реальный 6371 км
void Calc(double &X, double &Y,double &Xold, double &Yold,double &SpeedX,double &SpeedY /*double &OldSpeedX, double &OldSpeedY,unsigned int MASS*/)
{
const double Kearth =398600.448; //масса земли умноженная на гравитационную постоянную
Xold = X; // сохранение старого положения для затирания метки спутника на экране
Yold = Y;
//OldSpeedX=SpeedX;
//OldSpeedY=SpeedY;
double Rx =X/0.031392;  // получение из координат в окне в пикселях координат до планеты
double Ry =Y/0.031392;
double absR = pow((Rx*Rx+Ry*Ry),0.5);  //получение модуля вектора
SpeedX+=((-Kearth)/(absR*absR*absR))*Rx*TIMER; //скорость по Х увеличесвается за время TIMER  => (-GM*r/r^3)*dt
SpeedY+=((-Kearth)/(absR*absR*absR))*Ry*TIMER;
Rx+=SpeedX*TIMER; //    координата Х вектора R равна старой + скорость*dt   
Ry+=SpeedY*TIMER; //
X =Rx*0.031392; //возврат в пиксельные координаты для прорисовки
Y =Ry*0.031392;
}
« Последнее редактирование: 02 Мая 2012 [18:37:28] от Arderun »

Tau

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #24 : 02 Мая 2012 [18:54:09] »
Использовать дифференциальное уравнение движения - это обязательное условие? В случае невозмущенного движения обычно используют уравнение Кеплера, там простая тригонометрия. А то, подозреваю, в вашем способе траектория замкнутым  эллипсом  вряд ли будет. Дифференциальные уравнения решают немного не так.
 А в случае движения в плоскости орбиты вообще взять орбитальные координаты и не мучиться. Тут например http://space.msu.ru/education/cosmoprak/z8.php эти координаты обозначены греческими буквами кси и эта.

А еще проще использовать:
x=r*cos(v)
y=r*sin(v)
r=a*(1-e2)/(1+e*cos(v))
v-истинная аномалия
e-эксцентриситет
a-большая полуось
r - расстояние от центра Земля до спутника при истинной аномалии v.
Изменяете v от 0 до 360 градусов и нарисуется эллипс. Пользователь тыкает мышкой в точку на эллипсе, однозначно определяются r и v, и скорости заодно (трансверсальная и радиальная). Не нужно усложнять задачу, если ее можно не усложнять.
« Последнее редактирование: 02 Мая 2012 [19:05:38] от Tau »

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #25 : 02 Мая 2012 [21:34:02] »
задача, сводится ближе к выходу на орбиту, падению и слету с нее. эти все пункты должны быть реализованы. имея эллипс этого не добится. а как же случаи попытки смоделировать пролетающий метиорит итп? Эллипс как таковой не главная задача, но даже если бы и был то он должен нарисоваться по полученным данным с случайной точки и случайного направления.   Как к примеру на форму элипса повлияет скорости в предложенном варианте?

Tau

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #26 : 02 Мая 2012 [21:40:16] »
Серьезно вы замахнулись :).
Понятнее не стало,  какие у вас входные параметры, а какие выходные.

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #27 : 02 Мая 2012 [22:31:22] »
не сильно то и высоко. задача очень апроксиммирована и в 2D.


входные.
1. абсолютно случайная точка в 2D пространстве => (x,y) . центр земли берется естественно как [0,0]
2. произвольный вектор скорости(Vx,Vy).


выходные: выдача координат в новой точке и соотвествено выдача скоростей в этой новой точке.  для анимации движения на экране.

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

немного может обьяснить игра angry birds space Angry Birds Space - Walkthrough 2-25 3 stars cold cuts level guide how to get three star levels в ней задействована похожая функция, разве что в моей случае нужен  реалистичный результат ->  с возможностью выхода обьекта на орбиту, хотя бы временно.

Я чуствую что таки дифур здесь к месту, просто я совсем не могу его до конца раскрыть,  точнее то что раскрыто явно где-то очень сильно врет(на порядки).
ну либо что-то другое. Я чесно пытался апроксимировать под свою задачу обьяснения оленеуса, но в точке весеннего равноденствия завис.
« Последнее редактирование: 02 Мая 2012 [22:47:25] от Arderun »

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #28 : 03 Мая 2012 [10:57:59] »
Мучения закончены. Вопреки сомнениям по дифуру получается вполне себе элипс. вот рабочий код. Написать программу с этой функцией мне дали на собеседовании в самсунге. сейчас пойду отправлять только от мусора почищу  ^-^ .
 при 7.9 км/с спутники зависают на орбите, как и положено  :-X

#define EarthR 150  // радиус земли на экране в пикселях. Можно менять связь с размерами в функции сохраниться
#define TIME 10 //дельта времени для расчетов
const double RealKoef= (double)EarthR/6371; // коефициент маштабированния
const double Kearth =398600.448; // км3/сек2. масса земли умноженная на гравитационную постоянную и разделенная на количество секунд в часе


void Calc(double &X, double &Y,double &SpeedX,double &SpeedY)
{
double Rx =X/RealKoef; //км. координата Х вектора R
double Ry =Y/RealKoef; //км. координата Y вектора R
double absR = pow((X*X+Y*Y),0.5)/RealKoef; //км. модуль вектора R
SpeedX+=(-Kearth/(absR*absR*absR))*TIME*Rx;  //км/с. прирощение на дельту времени вектора скорости по координате X
SpeedY+=(-Kearth/(absR*absR*absR))*TIME*Ry;  //км/с. прирощение на дельту времени вектора скорости по координате Y
Rx+=(SpeedX)*(TIME); //км. сумирование вектора  радиуса с вектором скорости по координате Х
Ry+=(SpeedY)*(TIME);//км. сумирование вектора  радиуса с вектором скорости по координате Y
X=Rx*RealKoef;//0.031392;//пиксели. возврат к пиксельным координатам
Y=Ry*RealKoef;//пиксели
}


Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #29 : 03 Мая 2012 [13:35:26] »
мда. только проблемка вот вышла, таки не элипс, а круг. Нужно как-то к этой функции приплести кеплера, вот только непойму как

Tau

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #30 : 03 Мая 2012 [14:44:34] »
Раз у вас траектория может быть какой угодно: эллиптической, параболической. гиперболической, то Кеплера использовать смысла нет, программировать все виды траекторий придется. Тогда да - дифференциальное уравнение проще всего, только решать его нужно не так топорно и не с шагом по времени в 10 сек. 
Окружность - частный случай эллипса, круговые орбиты тоже существуют. Вот если у вас при любых значениях скорости окружность получается, то это чудеса.

taurus

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #31 : 03 Мая 2012 [15:48:58] »
Вроде бы код правильный.

только проблемка вот вышла, таки не элипс, а круг.

А это зависит от X, Y, SpeedX, SpeedY на входе!

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #32 : 03 Мая 2012 [16:07:33] »
Tau, а как же его еще решать. решение возможно к стремлению дельты к нулю, но сами те формулы описывают процес изменения. Мне не нужно решать диф ур он сам по себе является тем, что мне нужно, а какая апроксимация при этом берется вопрос  десятый(имено для моего случая). Но все-таки получаются таки круги, такое чуство что сложившись они получаю некий центр мас и вокруг него линейно сумируются.
 либо как-то искривленность планеты нужно задавать, либо в функции таки какая-то лажа.
заданая скорость  и первичный радиус по сути однозначно определяет сумарный радиус круга по которому нужно будет пройти спутнику и этот сумарный радиус уже никак по модулю не меняется.
« Последнее редактирование: 03 Мая 2012 [16:28:54] от Arderun »

AlAn

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #33 : 03 Мая 2012 [16:15:47] »
Уже писал, и не боюсь повториться, если не учитывать ускорение центрального тела, спутник сходит с орбиты, моделировал захват и обмен.

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #34 : 03 Мая 2012 [16:28:01] »
но как его учитывать конкретно для такого случая?
« Последнее редактирование: 03 Мая 2012 [16:37:15] от Arderun »

taurus

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #35 : 03 Мая 2012 [16:34:27] »
но как его учитывать конкретно для такого случая?
Для такого случая его учитывать не нужно.

Оффлайн Arderun

  • Новичок
  • *
  • Сообщений: 15
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Arderun
Re: как просчитать траекторию спутника?
« Ответ #36 : 03 Мая 2012 [16:39:51] »
ну тогда опять старый вопрос. почему результату всех моих пересчетов функции это круги. просто разного радиуса в теории я могу запустить на третей космической скорости спутник и вполне обосновано ожидать что он вернется в эту же точку.  не происходит торможения когда векторы как ыб должны были бы быть в противофазе, они продолжают сумироваться и держать скорость.

AlAn

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #37 : 03 Мая 2012 [17:08:23] »
А вы дайте несколько десятков, или сотен оборотов, увидите, в некоторых случаях сход идет раньше.
Надо поискать в закромах была программка на Паскале лет 12 назад сделанная по "Гравилету" о котором писала в 60е "Техника молодежи"...
« Последнее редактирование: 03 Мая 2012 [17:23:10] от AlAn »

taurus

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #38 : 03 Мая 2012 [17:16:09] »
почему результату всех моих пересчетов функции это круги.
Программы нужно дебажить. Так, на сторонний взгляд, вроде бы код верный, а как он на деле работает...  ::) Пройдите под отладчиком, посмотрите, что происходит.

Tau

  • Гость
Re: как просчитать траекторию спутника?
« Ответ #39 : 03 Мая 2012 [18:01:11] »
Arferun, предлагаю тренироваться на конкретных примерах.
Берем ваш код, переписываем его на VB, задаем начальные условия: X=10000 км, Y = -1000 км; Vx = 1 км/сек; Vy = 7 км/с, запускаем цикл. Получилось то, что на картинке ниже. Голубое - это Земля, красное - это траектория, явный эллипс.