Имя: Пароль:
IT
 
Небесная механика 2
,
0 wladimir90
 
24.12.11
17:17
Всем привет! Выдалось свободное время, решил вернутся к старой задаче, о которой уже как то тут писал. Задача n тел. Необходимо построить относительно точный симулятор движения небесных тел. Алгоритм, который я использую ведет себя странно:
1. При максимальном сближении скорость сближаемых объектов резко возрастает и объекты вылетают со сцены на гигантской, нереальной скорости.
2. Если добавить в сцену 3е тело, с точно такими же параметрами как и второе (меньшее), и позицией точно такой же, только отрицательной (у 1го, массивного - 0,0,0), то реакции на него практически нет. Два тела идут на встречу друг другу, а третье почти что стоит.

Код (C#):

// По факту использую 2д, z = y (особенность Irrlicht)

           foreach (var body1 in arr)
           {
               foreach (var body2 in arr)
               {
                   if ((body1 != body2) && (body1 != null) && (body2 != null))
                   {
// Выставляем знаки направлений
                       bool ZnakX = true;
                       bool ZnakZ = true;
                       if (body2.Position.X > body1.Position.X)
                       {
                           ZnakX = false;
                       }
                       else
                       {
                           ZnakX = true;
                       }
                       if (body2.Position.Z > body1.Position.Z)
                       {
                           ZnakZ = false;
                       }
                       else
                       {
                           ZnakZ = true;
                       }


                       float rass = ((body1.Position.X - body2.Position.X) * (body1.Position.X - body2.Position.X)) +
                           ((body1.Position.Y - body2.Position.Y) * (body1.Position.Y - body2.Position.Y));
                       double d = (System.Math.Sqrt(Convert.ToDouble(rass))); // расстояние между телами
                       double gamma = (0.0000006 * body1.ID * 1) / (d * d * d);
                       double F = (gamma * body1.ID) / (d * d); // ID тут масса
                       float Ff = (float)F;
                       float Fx = 0;
                       float Fz = 0;
                       if (ZnakX)
                       {
                           Fx = Ff;
                       }
                       else
                       {
                           Fx = -(Ff);
                       }
                       if (ZnakZ)
                       {
                           Fz = Ff;
                       }
                       else
                       {
                           Fz = -(Ff);
                       }

// Rotation я использую как скорость

                       float Vx = body2.Rotation.X + Fx; // тек скорость + ускорение
                       float Vz = body2.Rotation.Z + Fz;
                       float Px = body2.Position.X + Vx;
                       float Pz = body2.Position.Z + Vz;

                       body2.Position = new Vector3Df(Px, 0, Pz); // положение
                       body2.Rotation = new Vector3Df(Vx, 0, Vz); // скорость
                   }
               }
           }
1 wladimir90
 
24.12.11
17:21
(0) Поясню формулы.
Формула расстояния думаю понятна.
далее - гамма(честно, не знаю что это и зачем) = Грав.Постоянная * Масса тела к кому притягиваемся * Время / расстояние в 3 степени.
ускорение Ф = (гамма * масса тела к кому притягиваемся) / квадрат расстояния
2 Mikeware
 
24.12.11
17:23
студенты охамели...
3 Rie
 
24.12.11
17:24
(0) Ищи ошибки. Их там много. В частности, зачем массу первого тела в квадрат возводишь, а массу второго - игнорируешь?
Что за возня со Znak'ами?
Зачем постоянные преобразования double<->float?
И т.д.
4 Rie
 
24.12.11
17:28
+(3) Что касается "максимального сближения" - попробуй с калькулятором в руках рассчитать орбиту Земли вокруг Солнца, взяв в качестве шага по времени 1 год.
5 wladimir90
 
24.12.11
17:43
(3) Насчет массы точно - наверное нужно F = Масса2 * F; (F = mg)
Возня со знаками для того что бы тела двигались друг к другу, а не оба в одну и ту же сторону (в сторону увеличения координат).
Преобразования мне весьма не нравятся, но как без них не пойму - возведение в степень возвращает и использует double, поэтому сначала приходится преобразовывать расстояние в double. Затем нужно преобразовать все это дело в float, т.к. Vector3Df принимает только его. Int позволяет избавится от преобразований, но он образает знаки после запятой, т.е. всегда возвращает 0.
(4) Ну у меня шаг не год, а так, милисекунда... но если тут аналогичная ситуация даже не знаю как исправить.

(2) Да, студенты физики такие. Я тоже студент. Юрист.
6 SerMaxim
 
24.12.11
17:45
(0) Oh my God! Откройте для себя законы кеплера, имеются выведенные уравнения движения небесных тел!
7 SerMaxim
 
24.12.11
17:47
(0) Как человек который писал дипломную работу по близкой к данной тематике с уверенностью могу заявить что "относительно" точный расчет движения небесных тел - используйте готовые формулы. Точный расчет - составляйте систему ДУ и решайте методом Рунге-Кутта и получите все необходимые сведения! Советую начинать не с книжек по небесной механике, а с классических книг по механике (к примеру, под редакцией Яблонского, нужна глава "Элементы небесной механики"). Удачи!
8 Mikeware
 
24.12.11
17:54
(5) Мальчик (М) лет 18, в очках, такой весь из себя интеллигентный,
симпатишненький, со скрипочкой в руках, взгляд возвышеный и мечтательный,
заходит в общежитие Института Искусств. На проходной сидит такая баба Муся
(Б), здоровая, с усами, потная, и жрет какую-то лабудень из банки,
периодически почавкивая.
М — Извините, Вы не можете позвать Свету из 312 комнаты?
Б (чавкая) — это кто такая?
М — ну: она блондинка такая, миниатюрненькая, красивая, с пуантами ходит,
балерина она.
Б — нету ее.
М — извините, а Галю из 216 комнаты можно позвать?
Б (между чавканиями) — а это кто?
М — ммм.. это такая рыженькая, симпатичная, миниатюрная, с пуантами ходит,
балерина.
Б — нету ее.
М — Ну а Иру из 408 можно позвать?
Б — а это кто?
М — это такая брюнеточка, с короткой стрижкой, миниатюрненькая, красивая, с
пуантами ходит, балерина она.
Б — Нету ее.
М -разочарованно — растерянно): и.. и что мне делать?
Б — (облизывая аллюминиевую ложку, заканчивая обед)- не знаю. Балет уехал на
гастроли……. Е$ите хор!
©
Собственно, к чему это... да к тому, что каждый должен заниматься своим делом...
9 wladimir90
 
24.12.11
18:01
(6) А разве законы Кепплера могут описать что-то сложнее элипса который не может менять форму?
(7) Спасибо. Я думал о методе рунге кутта, но плохо его понял. Вы не помните название книги Яблонского? Что то не могу найти.


(8) Точно точно. Именно поэтому я программист а не авиатехник и не юрист. И именно поэтому я изучаю то чего еще не понимаю. А вы наверное занимаетесь только своим делом? Только программист 1С, это так интересно и развивающе.
10 Rie
 
24.12.11
18:01
(5) Уберите нахрен Vector3Df. Отделите саму модель от её визуализации. И тогда Вам не придётся подстраиваться под кем-то созданные для совершенно других целей классы и структуры.
"Как быть" - почитать умные книжки о методах вычислений. Пересказывать их здесь вряд ли стоит.
11 Mikeware
 
24.12.11
18:06
(9) Программист обычно говорят: "во я какую штуку написал! работает!", а не "дяденьки, я тут какую-то куйню нарисовал, которая никуя не работает..."
12 Mikeware
 
24.12.11
18:08
(10) он юрист...
13 SerMaxim
 
24.12.11
18:09
(6) Яблонский А.А. Курс теоретической механики вроде!

А вы что хотите решать задачу в общем виде, ну на это у вас уйдет минимум полгода, т.к. курс небесной механики это НУ ВАЩЕ мягко говоря не то что написано в первом посте, а если вы еще плохо поняли метод рунге-кутта то начинать надо вообще с общего курса диф.уравнений! Мой совет - сделайте программу по готовым уравнениям Кеплера если так нужно, а остальное - пусть делают астрономы!
14 wladimir90
 
24.12.11
18:20
(10) Дельный совет, спасибо.

(12) Что такое де юре и де факто? Я не знаю. За этот курс был на занятиях 1 раз. Я юрист? Хочешь оскорбить назови уж дятлом.

(13) Полной реализации мне не нужно, скорее компромисс между маскимальным упрощением и приемлимой точностью, надеюсь это займет чуть меньше чем полгода :) Но я не спешу, хочу вспомнить что забыл и изучить что не знал. Спасибо за книжку )
15 SerMaxim
 
25.12.11
11:11
Хотел бы напомнить что вроде как задача трех тел в общем случае решения не имеет в связи с этим надо быть готовым к интегрированию и лучше бы изучить еще и диф.уравнения.
16 Rie
 
25.12.11
11:13
(13) В общем виде решение задачи 3-х тел? :-)
17 Neco
 
25.12.11
11:47
(16) Пуская с двумя разберется ;-)

(0) Камрад. У тебя с размерностями все впорядке?

Вот здесь:  float Vx = body2.Rotation.X + Fx;
ты скорость с чем складываешь? Импульс, сила или что-то иное?

Проверку правильности вычислений начинай с проверки размерностей, чтобы операции с  величинами были в тех единицах в которых ты запланировал.
18 URAL
 
25.12.11
11:51
охххренеть, а я то считал себя программистом 1С.......
19 G-Re
 
25.12.11
11:54
(0) Лет 10-15 назад написал в DOC Basic(Borland) задачу N тел в 3 измерениях. При сближении на расстояние, меньше заданного, у меня было слипание. Очень занятно было наблюдать за эволюцией случайных N тел. Результат практически всегда один и тот же: некая планетарная система и несколько(мало) безвозвратно улетевших.
Ищи у себя ошибку в математике, обрати внимание на точность - все таки итерационный процесс, ошибки накапливаются. Текст на Basic где-то в архивах режит.
20 Rie
 
25.12.11
11:57
(14) Ты хвастаешься тем, что ты юрист, не знающих ни хрена по своей специальности? Странный предмет для хвастовства...

Что же касается точности - в таких случаях можно шаг по времени изменять динамически, "на ходу" оценивая погрешность.
21 Оболтус
 
25.12.11
11:59
Почему код не на православной 1С? Стыд и срам.
22 G-Re
 
25.12.11
12:00
(19)+ Да, систему решал одной из модификаций Рунга-Кутта.
23 Neco
 
25.12.11
12:00
В интеренетах полно хороших книг, в которых написан уже готовый код: http://dspace.univer.kharkov.ua/bitstream/123456789/1344/2/пособие%20Solar.pdf

(21) 1С - авно
24 Оболтус
 
25.12.11
12:02
(23)Пять веков назад в Испании за такое бы сожгли на костре.
25 Neco
 
25.12.11
12:02
(24) Пора сжигать на костре за вопросы, которые легко находятся в поисковиках.
26 Оболтус
 
25.12.11
12:04
(25)Я не про вопрос, а про еретические высказывания по поводу 1С. :)
27 Rie
 
25.12.11
12:05
(26) В Испании уже пять веков назад была 1С? Нуралиев - плагиатор?!!
28 Neco
 
25.12.11
12:06
(27) А вы не в курсе. Нуралиев - и.о. Христа. А в Испании и за более мелкие проступки сжигали.
29 wladimir90
 
25.12.11
17:03
(20) Я не хвастаюсь что плохой юрист, я говорю что я НЕ юрист, в контесте высказывания какогото камрада что все должны работать по образованию.

(17) Уже все переписал, не вспомню что имел ввиду. Сейчас так: Скорость = Скорость + Ускорение; Положение = Положение + Скорость; Пока без размерностей, координаты irrlicht, время ФПС, шаг времени - 1 кадр.

(23) Спасибо ) И согласен, 1С для таких задач на самом деле не подходит.

Сейчас все вроде как работает, но насчет верности расчетов судить не могу, позже переведу в реальные величины и соотнесу с движением чего то давно просчитаного.
Пока движения в 2д, 3я координата дает сильную погрешность, пока не понял почему - считается ведь точно так же как остальные.
Если кому интересно выложу архив с тестовой программкой.
30 Rie
 
25.12.11
17:07
(29) Помедитируй над тем, что твой двойной цикл заведомо приводит к ошибкам в расчётах: у тебя силы рассчитываются одни до смещения на новое место, другие - после. В итоге - каша.
Воспользуйся советом из (7) - напиши систему ДУ и решай её одним из старых проверенных методов.
31 kittystark
 
03.01.12
14:45
помнится была книжка по обучению программированию на паскале, среди всего прочего в ней приводился NASA-вский алгоритм метода Рунге-Кутта-Фельдберга 4-го,5-го порядка, процедура называлась rkf45, с ее помощью и решал задачи по небесным телам (кстати на Borland'овском компиляторе проявлялся баг, когда одноименная ЛОКАЛЬНАЯ переменная перезатирала одноименное значение вызывающей процедуры, будь осторожен если будешь юзать)
32 HeroShima
 
03.01.12
15:03
33 Domovoi
 
04.01.12
15:28
(0)В универе была лаба такая) (1-ая по физике) Насколько помню, использовалась одна формула из физики о взаимодействии тел. То что скорость уходит в бесконечность, то это так и есть, но если подставить реальные параметры, то все будет вполне реально.
34 Domovoi
 
04.01.12
15:37
Я вот только не понял каким боком тут система ДУ и метод Рунге-Кутты? Вечерком попробую, даже интересно стало вспомнить)
35 G-Re
 
04.01.12
19:03
(34) Странно, это классическая система обычных нелинейных дифуравнений 2 порядка с начальными условиями. Аналитически для Тел>2 не решается. Самым распространенным методом численного решения таких задач является одна из модификаций метода Рунге-Кутта.
А как еще это можно решить? Даже интересно!
36 G-Re
 
04.01.12
19:04
(35)+ обычных=обыкновенных
37 Domovoi
 
04.01.12
23:47
Ошибся я мы решали задачу по взаимодействия заряженных частиц на основе закона Кулона, но что-то мне подсказывает что и тут ДУ не будут востребованы, хотя может я и ошибаюсь.
38 Domovoi
 
04.01.12
23:55
Я так понял вот такое надо сделать только для планет? http://files.mail.ru/F1KER6
39 Kuzen
 
05.01.12
00:26
Со времён Ньютона наука знает, как описать движение одиночного тела, не взаимодействующего с иными телами. Раз Исаак Ньютон в XVII веке решил задачу для одной и для двух точек, наверное, с тех пор наука значительно продвинулась в своем понимании взаимодействия тел? Так вот, общее решение задачи для трёх тел не найдено до сих пор. Возможность решений этой задачи для некоторых частных случаев показал в конце XVIII века Леонард Эйлер, и вскоре такие решения получил Жозеф Лагранж. После длительных усилий Анри Пуанкаре в конце XIX века доказал, что такая задача не имеет прямого математического решения: она не решается через алгебраические и трансцедентные функции координат и скоростей. В начале XX века финский математик Карл Зундман нашёл решение этой задачи в виде сходящихся рядов. Увы, ряды Зундмана не позволяют получить долгосрочный и точный прогноз динамики трёх тел и, кроме того, требуют для своего вычисления колоссальной, малодоступной даже сейчас вычислительной мощности. (с)