24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Первоначальная цель: сделать симуляцию модифицированной гравитации Лесажа. Это когда два холодных тела притягиваются в горячем газе.
Для этого нужно: 1. Сделать пространство. 2. Поместить туда тела. 3. Наделить тела движением. 4. Организовать взаимодействие с стенками пространства (если они есть). 5. Организовать упругое взаимодействие тел. 6. Поместить в пространство еще два тела побольше. 7. Наделить их неупругими свойствами. 8. Добавить интерактивности, чтоб большие тела можно было перемещать мышкой. 9. Добавить вывод всяких интересных параметров, вроде цветового отображения скорости движения тел. 10. Добавить функциональности по желанию анонимуса.
Пока застрял на пятом пункте, а именно никак не соображу алгоритм просчета столкновений тел. Пилю на js. Вот: http://jsfiddle.net/cjrr5n21/
Короче, симуляций тред го. Пилим всяческие интересные симуляции, разрабатываем алгоритмы, учим матан и применяем его на практике.
>>238498 Извини, я про это ничего не знаю, но в симуляциях разбираюсь. Ты упомянул название этого эффекта, разве он не был еще продемонстрирован?
На жс точные и быстрые симуляторы не пишутся. Оверхед на численных расчетах выйдет тебе в пару порядков по скорости в самом лучшем случае. Простые реализации "в лоб" на жс вполне могут быть в 1000-10000 раз медленнее, чем на С.
Как ты собираешься симулировать газ? Нужны ли там неоднородности, газодинамика?
>>238506 > Простые реализации "в лоб" на жс вполне могут быть в 1000-10000 раз медленнее, чем на С. Нет, всего лишь в 10: https://github.com/nh2/langs-benchmark/blob/master/README.md И к node.js можно писать модули на C/C++. Так что после прототипирования можно будет оптимизировать узкие места.
>>238506 >разве он не был еще продемонстрирован? Был, тут даже один анон делал симуляцию на крестах и показывал результат в виде видео, но это было давно. Я хочу сделать такую, чтоб каждый мог запустить симуляцию в браузере, да еще мышой поиграться с телами. >Как ты собираешься симулировать газ? Сотней мелких движущихся кружочков. >Нужны ли там неоднородности, газодинамика? Неоднородности и газодинамика будут автоматом если придумать алгоритм столкновений кружочков.
>>238521 Лучше пространство разделить сеткой и в каждом кубике пространства хранить скорость потока (вектор), массу (если симулируется сжимаемая жидкость) и т.д. Такая модель получится гораздо точнее.
>>238521 Я об этом и спрашивал. Получается, цель скорее учебная, для иллюстрации. Тогда не обязательно соблюдать какие-то обоснованные аппроксимации, можно делать как угодно.
В этих условиях рекомендую: а) газ делать точками, а не кружочками (если эффект при этом не исчезает). Столкновения между частицами газа игнорируются. б) когда частица газа оказывается внутри тела, придавай телу и частице импульс, увеличивающийся с глубиной проникновения. Надо будет поэкспериментировать с законом и константами, чтобы добиться стабильной симуляции.
>>238524 Ну нет. Хочется сделать на столкновениях, точность и так будет высокой, а если столкновений будет мало на итерацию (100-1000), то проблемы с быстродействием не будет.
>>238541 Безразлично, как это происходит на самом деле, у тебя всего лишь модель. Нужно делать как можно проще, чтобы выделить самую суть явления. В этом смысл моделирования.
>>238549 >Нужно делать как можно проще, чтобы выделить самую суть явления. Да, но считать столкновения с большими телами все равно нужно. А для этого нужен алгоритм.
Обновление: https://jsfiddle.net/raxxla/cjrr5n21/1/ Придуман алгоритм столкновений, который считает все возможные столкновения. Но он не оптимизирован и сотню тел не потянет, поэтому переходить к пункту шесть еще рано.
>>238438 У тебя будут холодные тела нагреваться для достижения термодинамического равновесия в итоге? И разве гравитация Лесажа это не есть несколько другая вещь, нежели хаотичное движение молекул газа?
>>238694 >Придуман алгоритм столкновений, который считает все возможные столкновения. Но он не оптимизирован и сотню тел не потянет, поэтому переходить к пункту шесть еще рано. Quadtree для обсчета коллизий отлично подходит.
>>238726 >У тебя будут холодные тела нагреваться для достижения термодинамического равновесия в итоге? Нет. С точки зрения теории вещество обладает достаточным запасом холода, чтоб не замечать его нагревания. >И разве гравитация Лесажа это не есть несколько другая вещь, нежели хаотичное движение молекул газа? Этот случай более общий нежели гравитация Лесажа и более правдоподобен.
>>238747 Спасибо, но он сильно упрощен. Скажем так, что задача в полной симуляции столкновений. У меня еще стоит задача освоить яваскрипт, который знаю поверхностно.
>>238750 >Quadtree для обсчета коллизий отлично подходит. Это фреймворк? Охота сначала разобраться с голым js, чтобы понять как он работает.
Небольшое обновление: https://jsfiddle.net/raxxla/cjrr5n21/2/embedded/result/ Оптимизирован вывод кадра, прикручен счетчик фпс, лимит поднят до 60 фпс, расширен холст до 800x600, добавлено 150 шариков, чтоб тормозило. Теперь можно приступать к оптимизации алгоритма столкновений.
>>238920 Летит очень быстрая частица, которая за кадр пролетает 10 расстояний ширины холста. На холсте есть еще частицы. Это чтоб посчитать все столкновения мне нужно увеличить количество итераций до ого-го сколько?
При оптимизации возникли некоторые проблемы, о которых не подозревал. А именно коварные краевые эффекты от неточных вычислений и трудноуловимые баги, поэтому оптимизация затянется. Скорее всего движок буду писать по новой, а если не получится, то как анон выше советовал, оставлю неточные вычисления и идеальный газ. Пока дам мозгу отдохнуть пару деньков.
Обновление: https://jsfiddle.net/raxxla/cjrr5n21/3/embedded/result/ Проведена небольшая оптимизация и исправление грубейших ошибок от незнания языка. Теперь спокойно держит 60 фпс при 150 частицах и почти не пропускает столкновения.
Далее займусь полной оптимизацией и перевод расчета столкновений со стенками на точный режим.
>>239283 Прикольно, но только управление виснет немного.
Как рассчитывать неупругие удары? Нужно формулу вывести для такого случая. Один неупругий шарик покоится, а другой неупругий шарик его ударяет, коэффициенты неупругости и массы шариков разные. Нужно найти скорости после столкновения. Удар центральный. Что использовать за коэф. неупругости?
Или если задача сложна, то решите такую. Два шарика одинаковой массы летят навстречу с одинаковыми скоростями, шарики по разному неупруги. Нужно найти скорости шариков после удара.
>>239416 Это наверно сильно сложно, делать куб. Мне б квадрат сначала осилить.
Что-то запутался. При ударе частицы газа об холодное тело передается часть кинетической энергии частицы на нагрев тела, но при этом суммарный импульс системы сохраняется? Такое возможно что импульс системы тот же, а кинетической энергии в сумме меньше?
>>239893 >Такое возможно что импульс системы тот же, а кинетической энергии в сумме меньше? Разумеется. Классический пример - абсолютно неупругое столкновение двух материальных тел (после столкновения слипаются): импульс системы сохраняется, суммарная кинетическая энергия - нет ("переходит в тепло").
>Нет, импульс при этом не сохраняется, он переходит в тепло.
Импульс не может переходить в "тепло". Импульс - векторная характеристика, "тепло" (в термодинамическом смысле, Q) - скалярная. В тепло переходит механич. энергия.
>>239893 Эти формулки связывают модуль импульса и энергию частицы. Притом только одиночной. Здесь не учтен ни векторный характер импульса, ни то, что эти формулы к системе частиц в буквальном смысле неприменимы.
>>240581 Они применимы к отдельной частице, долбаёб. Симуляция в том и заключается, чтобы просчитать каждую частицу в отдельности, получив системный эффект.
>>240643 >Они применимы к отдельной частице Ты жопой читаешь, что ли? >Эти формулки связывают модуль импульса и энергию частицы. Притом только одиночной
Запилил неупругие столкновения. За коэффициент неупругости принял долю кинетической энергии движения тел относительно друг-друга, которая остается кинетической после столкновения. У большего шара он 0.6, у шара поменьше - 0.8, у мелких шариков - 1 (упруги).
Теперь, по сравнению с прошлой версией >>240550, большие шары начали притягиваться к друг-другу и липнуть к стенкам (т.е. по сути притягиваться к своим отражениям) и охлаждать окружающий газ.
На этом притяжение холодных тел в горячем газе считаю подтвержденным.
>>241486 Странно, у меня они жмутся друг к дружке и вместе летят в к стене, а потом сползают в угол. Очень редко когда флуктуации расталкивают их по разным углам. Может ты случайно 4-ю версию запустил, там как раз чисто упругие столкновения.
https://jsfiddle.net/raxxla/cjrr5n21/6/embedded/result/ Добавил расчет цвета по скорости и добавил точный расчет столкновений со стенами. Теперь считает все столкновения, кроме одновременных. При одновременных столкновениях шарики могут проникать друг в друга или за стены, но такие столкновения очень редки, если не опускать коэф. неупругости до нуля.
Дальше развивать капризный движок столкновений не охота. Лучше потратить время на другие симуляции. Кстати, давайте идею следующей симуляции.
>>242288 Но мы смотрим двумя совмещенными проекциями на плоскость, поэтому двумерное всегда нагляднее и проще. А задача Лесажа неплохо работает в двумерии. >>242274 >Как насчёт симуляции эффекта Коанда? Сейчас посмотрю. >Эффект Коа́нда — физическое явление, названное в честь румынского учёного Анри Коандэ (название предложил его французский коллега Альбер Метраль). Коандэ в 1932 году обнаружил, что струя жидкости, вытекающая из сопла, стремится отклониться по направлению к стенке и при определенных условиях прилипает к ней. Это объясняется тем, что боковая стенка препятствует свободному поступлению воздуха с одной стороны струи, создавая вихрь в зоне пониженного давления. Так-так. >стена Трение об стену. Сложновато. >жидкость Это расчет поверхностного натяжения или притяжения частиц жидкости. Сложновато. >воздух Достаточно просто. >вихрь Трехмерность, большое разрешение сетки для участка с вихрем и расчет вязкости воздуха. Сложно. Но вихри это всегда интересно и возможно я этим когда-нибудь займусь. Еще есть предложения?
>>242397 Тоже хочу теперь запилить симуляцию жидкости с вихрями. Через сетку, только нужно решить, какие параметры будут у квадратика пространства. Даже думаю физ-модель в 3Д сделать, но как это красиво отрендерить пока не придумал. Просто 2Д-проекция будет, наверное, а глубину показывать яркостью пикселя.
>>242415 Придётся ещё трассировочный алгоритм какой-то думать, который будет помечать "сгустки молекул" цветами, чтобы отобразить потоки. Иначе будет просто пепемигивающийся шум.
>>242415 На чем хочешь пилить? Параметры масса или плотность, скорость или импульс, давление, температура, да тип вещества (жидкость, твердое тело или газ). Каждое вещество обладает своими свойствами. Можно глубину не показывать, а выводить на экран один слой, который можно интерактивно выбирать или нет.
Вернул обратно неточные соударения со стенами, и запилил неточные соударения шаров, что высвободило ресурсы. https://jsfiddle.net/raxxla/cjrr5n21/7/embedded/result/ 1000 сталкивающихся шариков, 0.1 и 0.2 коэф. неупругости, цветовое отображение скоростей, фпс скачет около 30. Хочется еще реализовать алгоритм по дереву квадрантов и посмотреть на сколько он будет быстрее.
>>242441 Ку-дерево значительно ускорит, и чем больше объектов, тем оно выигрышнее. На JS есть готовые библиотеки таких деревьев, погугли такую от создателя Leaflet.
Обновка: https://jsfiddle.net/raxxla/cjrr5n21/8/embedded/result/ Чуть оптимизировал и добавил небольшой самоподогрев газа. Прикрутил мышку. Теперь при нажатии на шарик, его скорость обнуляется, а при перетаскивании придается ускорение.
>>244274 Слушай, а мне показалось или у тебя со временем газ нехило так остывает? Как ты организуешь саморазогрев? Я бы на твоем месте делал так: считал что граница имеет постоянную температуру (горячая) и тогда частицы газа могли бы от нее получать энергию. Еще обнаружил забавный эффект - если шар затолкать в угол, он там и останется.
>>244276 >со временем газ нехило так остывает? Да, немного, но вроде до некоего предела. >Как ты организуешь саморазогрев? Чуть смухлювал. При ударе о стену скорость по нормали умножается на корень из 1.15. >Я бы на твоем месте делал так: считал что граница имеет постоянную температуру (горячая) и тогда частицы газа могли бы от нее получать энергию. Тоже немного мозговал это, но испугался выводить формулы и решил оставить на потом, а пока просто домножать на множитель. >если шар затолкать в угол, он там и останется Ага. Шары притягиваются к своим отражениям, а в углу из близких целых два, плюс перекрывается доступ к быстрым частицам и газ остывает. >>244410 Есть что по 10-му пункту? >>244423 На моем китаефоне в фуррифоксе - 8 фпс, лол. На ПК в лисе - 45, а в опере - полные 60.
>>244440 > Тоже немного мозговал это, но испугался выводить формулы и решил оставить на потом, а пока просто домножать на множитель. Да че тут думать, при отражении от стенки частица имеет случайную энергию, распределенную по максвеллу в соответствии с температурой (1/T exp(-E/T)) ну и продольный импульс сохраняется. Точно так же я бы описывал столкновения с холодными шарами, только бы полностью учитывал закон сохранения импульса.
>>244701 Очередной школотрон борется за терминологию, которую не понимает. Ты какой из вакуумов имеешь ввиду, не подскажешь? Можешь выбрать в списке на википедии.
>>244754 Хитрец, буквально в следующем же предложении, обрезанной в твоей цитате, написано: > В технике и прикладной физике под вакуумом понимают среду, содержащую газ при давлении значительно нижеатмосферного. А ниже даже приводят критерии измерения степени разряжения вакуума: > Мерой степени разрежения вакуума служит длина свободного пробега молекул газа, связанной с их взаимными столкновениями в газе, и характерного линейного размера сосуда, в котором находится газ. Как школьники мило цепляются за слова, которые сами наделили смыслом, не спрашивая у взрослых их значения.
>>245030 > >В разрезе каждого пикселя канвы > Что сие значит? К каждому пикселю (ну, или квадрату более крупной сетки) назначаешь щочик скорости, который скорости всех пролетающих в этом пикселе/квадрате молекул суммирует (ну, или скользящее среднее, или ещё как - сам придумай). Потом раскрашиваешь красным эти квадраты - прозрачным цветом нулевую скорость, 50% прозрачности - максимальную из всех квадратов. Например.
Первая про парадокс Ольберса, или какой яркости небо в стационарной вселенной равномерно заполненной звездами. Просчитывается достаточно глубоко в космос и под конец может тормозить. Параметры плотности и размера звезд выбраны наглядными. https://jsfiddle.net/raxxla/btm7es6t/embedded/result/
Вторая про решение этого парадокса добавлением старения света по закону Хаббла, где энергия фотона убывает обратно пропорционально расстоянию E=E0/(H*r+1). Смещение в красную область пилить не стал. Симуляция считается в обратном порядке, начиная с далеких звезд. https://jsfiddle.net/raxxla/btm7es6t/1/embedded/result/
>>245674 Там нужно подождать. Через секунд 10 уже заметна прорисовка дальних звезд, затем все ближе и ближе. В итоге должно получиться как на картинке. Суть в том, что видимая поверхностная яркость звезд убывает с расстоянием от космологического красного смещения, и хоть в любой точке неба по лучу зрения мы наткнемся на поверхность звезды, небо ярким как Солнце не будет.
>>246749 Да, но ты сам же говорил что угловой размер уменьшается, а вместе с ней видимая площадь, т.е. интенсивность с единицы телесного угла поверхности звезды постоянна.
Тут такое дело. Решил проверить эксперимент Майкельсона-Морли, но он что-то не хочет работать. Разности фаз нету, только при сильном движении волновой среды она появляется при некоторых положениях прибора. Выходит что релявы в очередной раз соснули?
>>258525 Да верно. Покрутил симуляцию - эффект правда есть, только с некоторыми особенностями.
Если ветер дует вдоль линии с источником, то разности фаз нет, как будто ветра вовсе нету. Если ветер дует вдоль линии с приемником, то разность фаз в два раза больше чем по формуле из википедии. Если повернуть прибор на 90 градусов, то разность фаз между этими положениями будет в одних случаях (завист от начального направления ветра относительно прибора) как по формуле из википедии, а в других нулевая.
Для этого нужно:
1. Сделать пространство.
2. Поместить туда тела.
3. Наделить тела движением.
4. Организовать взаимодействие с стенками пространства (если они есть).
5. Организовать упругое взаимодействие тел.
6. Поместить в пространство еще два тела побольше.
7. Наделить их неупругими свойствами.
8. Добавить интерактивности, чтоб большие тела можно было перемещать мышкой.
9. Добавить вывод всяких интересных параметров, вроде цветового отображения скорости движения тел.
10. Добавить функциональности по желанию анонимуса.
Пока застрял на пятом пункте, а именно никак не соображу алгоритм просчета столкновений тел. Пилю на js. Вот: http://jsfiddle.net/cjrr5n21/
Короче, симуляций тред го. Пилим всяческие интересные симуляции, разрабатываем алгоритмы, учим матан и применяем его на практике.