Что например?
По большому счету дайте волю своей фантазии.
Астероид падает за Землю.
Массивный спутник возмущает океан.
Землятресения и вулканы.
Ураганы, торнадо.
Тела из плазмы.
Да все, что угодно.
Например, может быть интересно посмотреть на астероид, который входит в атмосферу. Причем посмотреть из какой-то определенной точки на Земле или в космосе. Потом повторить вычислительный эксперимент, изменив начальную массу или состав астероида, начальную скорость или траекторию. Или покрыть модель планеты океаном, и разместить возле планеты очень массивный спутник (или другую планету), посмотреть на поведение океана из космоса, или с поверхности планеты. Сделать модель планеты и разместить на ней тектонические плиты, смоделировать столкновения плит и пронаблюдать последующие землятресения, или смоделировать вулканы. Можно попробовать смоделировать что-то совершенно фантастическое, например локально изменить метрику пространства, и со стороны посмотреть на результат :-)
Вы должны понимать, что мои модели не могут превзойти мой IQ, который очень невысок. Я не использую никаких программных пакетов, модели буду создавать на C++ и OpenGL, отталкиваясь только от моего уровня понимания теоретической физики. Больших вычислительных мощностей у меня нет, так что для моделей я буду делать много допущений, обобщений, усреднений, и снова же только полагаясь на свой уровень понимания. Поэтому ни в коем случае не рассматривайте эти модели как истинные, это лишь точка зрения. В свободное время я буду пробовать делать наброски этих моделей, и выкладывать сюда результаты. Если кто-то тоже любит создавать такие модели, то я с радостью предлагаю здесь делиться результатами.
kostiantynm, здесь не разрешено выкладывать ссылки (кроме некоторых, см. Правила) и картинки, поэтому и делиться результатами затруднительно. На моей аватарке одна из моделей (тоже на OpenGL).
:-)
Спасибо, Леонид! Ну, тогда на этом тема и завершена :-)
По-правде сказать, я когда создавал свое сообщение, уже заранее знал, что ничего не будет.
А это только фрактал, да? Картинка без динамики, и без гравитации?
kostiantynm, так у меня, так же как и у вас, обычный компьютер, а не супер на петафлоксы, так что "гравитацию" в динамике не рассчитаешь :-)
Чисто математические программки с отрисовкой в GL делал, например график орбитальных скоростей в диске галактики или движение Солнечной системы с колебанием относительно плоскости диска галактики, исключительно не для картинки, хотя картинка красивая,, но для проверки правильности представления. В них расчёт делал по 100000-200000 "звёздочек", долго, но терпимо.
А уж если считать ВСЕ тела со ВСЕМИ даже для десятка тел, как с Солнечной системе, то динамической картинки не получится год за минуту компьютерного времени.
Ну... можем попробовать сделать "все со всеми". Вдруг все окажется не так уж и страшно. Если интересно, конечно. Представьте, что у нас есть компьютер с неограниченной производительностью. Опишите мне в общих чертах исходное состояние желаемой модели, может, для начала что-то не совсем реальное, но простое в формулировке. А я прикину, где можно вычисления убрать, поскольку тела в целом друг друга не чувствуют, где можно перейти от набора тел к плотностям распределения, ну и все в таком роде. В итоге расскажу, как я вижу финальную модель, ну и в OpenGL ее набросаю. В астрономии и астрофизике я такой же тук-тук откройте как и во всем остальном, так что заранее прошу прощения :-)
kostiantynm, самое простое -- наша родная Солнечная система: Солнце и девять планет и Луна, да ещё смертельный астероид Апофис, всего-то 12 тел.
Задача сугубо практическая: рассчитать лет триста -- четыреста на предмет столкновения с Землёй. Исходные данные (массы, положение 3D, скорости 3D) могу представить, есть у меня на 30.11.2008 г. (считал тогда).
Расчёт по Ньютону ускорение каждого тела от каждого, формула: a=-M*G/R^2
Число тел N, выбранное время t = 1 сек (0.01---100 сек)
Двойной цикл, первый i от 1 до (N-1), вложенный j от (i+1) до N
Расстояние между телами:
R^2=(Xi-Xj)^2+(Yi-Yj)^2+(Zi-Zj)^2
R^3=R^2*SQRT(R^2)
Ускорение от взаимодействия:
A(i,j)x=-Mi*G*(Xi-Xj)/R^3
A(j,i)x=-Mj*G*(Xj-Xi)/R^3
Ускорение всего (накапливаем):
Ajx=Ajx+A(i,j)x
Aix=Aix+A(j,i)x
То же для координат Y и Z.
При окончании циклов известны 3D ускорения всех тел
Опять же в цикле i от 1 до N рассчитываем новые координаты тел
Xi=Xi + Vix*t + Aix*t^2/2
и новые скорости
Vix=Vix + Aix*t
(так же и для Y, Z)
Данные находятся в массиве, число строк по количеству тел, колонок десять: M*G, и по три колонки координат, скорости и ускорения.
Вывод координат на индикацию можно делать через некоторое количество циклов, скажем при выбранном времени 1 сек через сутки -- 86400 циклов
(Как видно из расчёта криволинейное движение тел аппроксимируется линейными кусочками, из-за этого набегает погрешность и чем больше выбранное время, тем больше погрешности, но быстрее бежит время и наоборот).
Спасибо за столь подробное описание! Леонид, сразу есть несколько вопросов:
1. Можно ли на время расчетов перейти в систему, где G = 1.0?
2. Xi=Xi + Vix*t + Aix*t^2/2 - можно ли тут "потерять" член с ускорением (Aix*t^2/2) и предположить, что на линейном кусочке тело движется с постоянной скоростью (Xi=Xi + Vix*t)?
3. Я еще не придумал, что сделать с квадратным корнем, но его присутствие при таком количестве циклов реально напрягает)))
4. Леонид, а существуют ли какие-то аналитически решенные задачи нескольких тел, или хорошие приближения? Я к тому, что перед моделированием нашей задачи хотелось бы "пощупать" программу на каком-то заранее известном случае, понять насколько она вообще брешет, а потом чуть-чуть "покачать" начальные условия, и посмотреть насколько программа в целом устойчива.
kostiantynm
1. Смысла нет, в формулах присутствует величина G*Mi, которая считается один раз и записывается в массив.
2. Нет, точность должна быть максимальной (речь идёт не о картинке, но об угрозе жизни на Земле, hi-hi), школьная формула равноускоренного движения в двух видах, второй вид: Xi=Xi + (Vix+Vx)*t/2, где конечная скорость Vx=Vix+A*t, так что операции делать всё равно придётся.
3. Корень квадратный -- вычисление расстояния, которое необходимо для разложения ускорения по трём координатам: Ax=A*(Xi-Xj)/R, никуда не деться.
4. Аналитическое решение для тел в собственном силовом поле просто для двух тел (формулы Кеплера), также имеется для трёх тел, но представлено в плохо сходящихся рядах, для четырёх и более тел аналитического решения нет (и не может быть в принципе).
.
Большинство симуляторов Солнечной системы используют рассчитанные по Кеплеру орбиты и представляют их неизменным, что конечно далеко от истины. Предлагаемые расчёты по Ньютону с прямолинейными кусочками тоже выдают нарастающую погрешность и на длительных промежутках времени удаляются от истины. Можно, конечно, приблизиться к ней (истине) заменив прямую кривой второго порядка учитывая изменение направления скорости, но такие расчёты в четыре раза увеличат число операций, да ещё и с корнями.
Добрый день, Леонид!
Ну, я сделал программу практически 1-в-1 по вашему алгоритму.
Отличия:
1. Ускорение от взаимодействия (A(i,j), A(j,i)x) я сразу внес в ускорение всего (накопление)
2. В расчете новых координат тел я предварительно посчитал Aix*t, и дополнительно вынес время за скобки
Только что запустил расчет на 1 год:
const int CONSTANT_N = 12;
const int CONSTANT_NUMBER_OF_CYCLES = 86400 * 365;
const GLfloat CONSTANT_DELTA_T_SEC = 1.0f;
вычисления начались в 15 часов 02 минуты 00 секунд
вычисления закончились в 15 часов 05 минут 25 секунд
Итого, расчет одного года длится 3 минуты 25 секунд. Посчитать 400 лет займет почти 23 часа.
MP, ой, и правда! Ну надо же! Уже два месяца как :-))
.
kostiantynm, упомянутые данные "Солнечная система на 30.11.2008 12:00:00" могу выложить на Яндекс-диске, или выслать на почту в формате *.txt или *..xlsx. Есть ещё карты планет для текстур GL.
Перед тем, как вводить данные о положении планет, я хотел бы прояснить несколько вопросов. Напоминаю, что я полный гуманитарий, и еще раз прошу прощения за большое количество уточнений:
1. Леонид, к сожалению доступ к Яндексу у нас закрыт (я из Киева), так что остается только почта. Я здесь хотел бы на всякий случай заметить, что если это проблема (я не про Яндекс, в сложившейся печальной обстановке для многих это болезненная проблема), то просто скажите что проблема есть, я целиком без обид пойму и не буду отнимать время. Извините. если это замечание неуместное
2. Мне хотелось бы показать программу, вдруг при первом взгляде на нее будут какие-то явные замечания. Будет нормально, если я выложу ее на GitHub, а здесь в комментарии оставлю ссылку?
3. Что из себя представляет система координат в тех данных, которые вы собираетесь выложить? Судя по алгоритму она будет декартовой. Ее центр совпадает с центром одного из тел (Солнца)? А оси направлены на неподвижные звезды? Точнее, получены приведением такой косоугольной прямолинейной системы к декартовой?
4. Как вы себе представляете визуализацию этой модели? Ведь расстояния между телами колоссальные, и размеры самих тел пренебрежительно малы
4.1. Где мне разместить камеру и куда ее направить, какой угол обзора сделать?
4.2. Камера будет на месте или двигаться?
4.3. Стоит ли мне для минимальной визуальной ориентации в пространстве дорисовать какие-то опорные звезды?
4.4. Или запустить расчет, и только в случае когда расстояние R между любыми двумя телами окажется меньше какого-то установленного вами минимума, то именно в этом случае начать визуализировать можель, а камеру направить к телам, которые потенциально могут столкнуться?
Леонид, меня зовут Костя. "kostiantynm" - это то, что сделала форма регистрации на сайте из моего имени и фамилии :-)
kostiantynm, так скачать программку по ссылке на моей аватарке у вас получилось же? Это не сайт Яндекса, а кусочек облачного диска, который я арендую у Яндекса.
Вот ссылка на текстовой файл с координатами "yadi.sk/d/3H26BAgBrG2J6g".
Файл программы лучше переслать на почту (указана в личных данных) Если и Яндекс-почта блокируется, то в вашей личке выложите свой e-mail, напишу с другого ящика :-)
Это экваториальная система координат в декартовом исполнении. Начало координат в центре масс (почти в центре Солнца), ось Z параллельна земной оси смотрит на Полярную звезду, плоскость X-0-Y соответственно параллельна плоскости земного экватора, куда направлена ось X уже и не помню, да в принципе для GL не имеет значения.
А вот по "визуализации" предложений особых и нет, сам никогда не заморачивался, исключительно чтобы проверить, а всё-ли правильно. В GL можно реализовать масштаб для всей сцены и отдельно для объектов, тем более что объекты "шарики". Столкновений ждать -- не дождаться, разве что специально прицелиться или кадры снимать, а потом из них фильм делать :-))
Добрый вечер, Леонид!
" скачать программку по ссылке на моей аватарке у вас получилось же" - нет, я просто рассматривал саму картинку на аватарке, не более того.
Скачать файл с Яндекс диска у меня не вышло, программу я отправил по почте.
Я подумаю над тем, как можно было бы красивее визуализировать результаты.
Leonid, по ссылке текстовый файл с планетами СС и данными.
kostiantynm - Я где то видел визуализацию МКС над землей, где видно как она летит - видно планету, все модули станции. Т.е. в реальном времени.
А визуализацию входа челябинского например? Или тут была новость, что тунгусский метеорит мог вылететь с высоты 10 км от земли обратно в космос.
Добрый вечер) MP - простите, мне сложно обращаться по никам, и если это не секрет - скажите свое имя.
Можем попробовать смоделировать станцию, можем и Челябинский метеорит, и Тунгусский метеорит. Реальное время самой модели я не обещаю, но я могу сбрасывать расчитанные кадры в видеофайл используя библиотеку OpenCV (она вообще используется для распознавания фото и видео), и уже сам видеофайл будет в реальном времени. Скажите, с какой из этих трех тем вы хотели вы начать... или все три сразу? И опишите мне в общих чертах свое видение ожидаемого результата. Если есть какие-то исходные данные для модели, то тоже будет классно, если нет - то будем импровизировать, и походу подгонять модель к желаемому результату.