Имя: Пароль:
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 века финский математик Карл Зундман нашёл решение этой задачи в виде сходящихся рядов. Увы, ряды Зундмана не позволяют получить долгосрочный и точный прогноз динамики трёх тел и, кроме того, требуют для своего вычисления колоссальной, малодоступной даже сейчас вычислительной мощности. (с)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн