|
Небесная механика 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 века финский математик Карл Зундман нашёл решение этой задачи в виде сходящихся рядов. Увы, ряды Зундмана не позволяют получить долгосрочный и точный прогноз динамики трёх тел и, кроме того, требуют для своего вычисления колоссальной, малодоступной даже сейчас вычислительной мощности. (с)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |