Pull to refresh

Comments 29

UFO just landed and posted this here
Когда я ковырял простое выражение: F =ma = G*m*M / r^2, то картина получается гораздо проще, чем кажется — планета не падает на солнце, при некоторой минимальной скорости и ее начальном векторе. Согласно законам Кепплера, она вращается по обычным эллипсам.
Если интересно, то могу написать об этом. Правда, физик из меня никакой :-) и любой человек из физмата меня сразу на место поставит.
У меня на первой картинке точка движется по окружности с расчитанной скорость. из a = v^2 / r
UFO just landed and posted this here
Даже если честно вычислять новую скорость, когда очередное смещение вдруг меняет радиус? Или лишь если считать скорость константой?
UFO just landed and posted this here
При непрянолинейном движении ускорение есть всегда, меняется направление, а не длина вектора
UFO just landed and posted this here
Если модуль постоянен, то, как правильно заметил x0wl, может спокойно изменяться направление скорости, ибо она вектор . Второй закон Ньютона формулируется для векторов: (приобретаемое ускорение равно силе, делёной на массу). Проще говоря, куда сила, туда и ускорение. Бывает, что есть ускорение без силы, которое необходимо вводить, если мы из лабораторной системы переходим в ускоренно движущуюся систему отсчета (она будет неинерциальна). Чтобы соблюсти правило сила->ускорение, то вводят нереальную силу инерции. Именно она Вас толкает в метро, когда вагон разгоняется или тормозит, именно она придавливает в пол ускоренно поднимающегося лифта и т.п. Существует принцип эквивалентности Эйнштейна, гласящий, что локально сила инерции неотличима от гравитационной. Именно поэтому есть идея создавать искусственное тяготение на космическом корабле путем его вращения вокруг своей оси. Ведь, при вращении в с/о, связанной с вращающимся космическим кораблем, возникают центробежные ускорение и сила (эффективные), и центростремительное ускорение которое их уравновешивает и создается реальными силами (к примеру, трения или реакции опоры).
Если Вы говорите, что «скорость равна константе», то это может понимается, что сам вектор постоянен или только его длина (модуль скорости). Неплохо бы уточнять :)

Что касается описания движения взаимодействующих тел, самым простым является случай движения в заданном поле (к примеру, тяготения) — это задача Кеплера. Там три степени свободы (одно тело), одно векторное уравнение движения (три скалярных — на каждую координату). Решением уравнения движения является уравнение кривой второго порядка. То есть, траекторией небесного тела в поле тяготения одного лишь солнца может быть эллипс (планета), гипербола (комета) и парабола (камень брошен под углом к горизонту). Какая же будет траектория — зависит от величины эксцентриситета кривой в сравнении с 1. Сам эксцентриситет выражается через физические параметры системы. Подробнее смотрите в Ландау-Лившиц, том 1 или в Интернетах.
Задача двух тел — когда есть два свободных от внешних сил, но взаимодействующих друг с другом тела сравнимых масс — уже сложнее, но имеет аналитическое решение. Задача же трех и более тел аналитически пока не решается. Во всяком случае, для Кулоновского (гравитационного) потенциала.
Также я бы был очень аккуратен в плане применения метода Рунге-Кутта (в явной схеме) — он, емнип, с физической точки зрения не сохраняет энергию системы, и решать им уравнение, к примеру, колебаний очень плохо. Для кеплеровой задачи, весьма вероятно, тоже могут быть проблемы. Однако, когда-то еще в школе я пробовал рисовать на Pascal траекторию планеты самым очевидным методом решения уравнения движения: просто расписывая производные как отношение «дельт». Получался отличный эллипс которые ооочень медленно корежился. Как узнал уже в ВУЗе, я тогда применял метод Эйлера, а он еще проще метода Рунге-Кутта. Этим я хочу сказать, что физически задача движения тел во внешнем поле устойчива и по начальным значениям, и вообще :) Однако численный метод может внести сильные погрешности и неустойчивости.
UFO just landed and posted this here
Уточнили. И я уточнил — вдруг кому будет полезно посмотреть на формулы :)

Все численные методы вносят ошибку. Это очевидно. Во-вторых, это ошибка машинного округления, но для типа double ею обычно можно уже пренебречь. А во-первых, это изменение исходной задачи в процессе применения численной схемы. Ведь, кода Вы применяете тот самый Рунге-Кутта метод, Вы а) вместо исходной аналитической функции рассматриваете сеточную функцию такую, что: . А это уже совсем другой объект с другими математическими свойствами; б) как следствие, Вы аппросимируете производные разностями (строите разностные схемы). Значение этих «разностей» уже отличаются от настоящей производной. Примером может служить уже упомянутое уравнение колебаний . Решением должен быть синус-косинус, но на практике явный метод Рунге-Кутта любого порядка точности даст нарастающую гармоническую функцию (к примеру, некоторое время назад этот эффект наблюдали тут). Дело в том, что при разностной аппроксимации Вы вносите в исходное уравнение член, пропорциональный . Это трение с отрицательным коэффициентом. То есть, описывает приток энергии. Вещь, конечно же, хорошо известная. Например, тут мужик хорошо это рассказывает. Какой бы численный метод решения чего бы то ни было Вы ни брали, всегда будет раздел «устойчивость метода». Она зависит от шага сетки, порядков аппроксимации и т.д. Если Вы выбрали параметры метода, не удовлетворяющие критериям устойчивости, то численное решение не будет сходится, пусть даже само решение исходной задачи есть и устойчиво во всех смыслах.
UFO just landed and posted this here
Конечно же, я говорил про модуль скорости.

А система явно должна иметь устойчивость, иначе бы солнечной не было б. Вы что-то упускаете в расчетах.
UFO just landed and posted this here
Отнюдь, таких систем миллиарды, это практически самая устойчивая из возможных конфигураций, самостабилизирующаяся к тому же. Это потенциальная яма, из которой очень затратно выбираться.
вот, комметарием ниже, я запостил видео, где без диффуров расчитывал вектора скоростей и ускорений. Вполне можно запустить планетку вращаться без всяких формул.
Если вам интересно, то я выложил флеш-видео моего прототипа, там как раз демонстрируется то, что вы говорили. Как раз для этого я и изучаю CUDA, чтобы попробовать придать моей математике на яваскипте чуть большую производительность.
Видео 1 — уравновешенные четыре планеты
Видео 2 — случайная, но удачная демонстрация предполагаемого апокалипсиса :)
В случае с первым видео, там палочками отмечены вектора скоростей и ускорений. Кстати, вы увидите, что как по науке — ускорение направлено к центру окружности.

Сами планеты (или атомы, как я их называл в своем проекте) разбегаются при приближении друг к другу, потому что силы притяжения увеличиваются в разы, а кода, обрабатывающего столкновения, у меня не было.

p.s. если вам нужны сами SWF файлы с видюшками, могу выложить на хабрасторейдж (просто не хочу захламлять его лишний раз)
Вроде всего два диффура: \dot x и \ddot x. Это уже не говоря про то, что планеты сваливаться не будут.
Или в CUDA что-то изменилось, или люди по-прежнему забывают делать синхронизацию между запуском ядра и копированием результатов с видеокарты.
Так они же вроде в стандартный нулевой stream оба попадают и тем самым сериализуются?
странно, Джейсон Сандрерс не использовал cudaDeviceSynchronize функцию для синхронизации устройства. Единственное, что он применял — это синхронизацию тредов внутри одного блока.

Спасибо вам за заметку, погуглю на эту тему более детально, а то в инете пишут, что не для всех случаев (даже когда используется один поток) эту функцию следует использовать.
Мне кажетя в вашем случае нет нужды гнаться за большим размером блока, т.к. все равно не используется оптимизации вроде разбивки на tiles массива данных (да и вряд-ли тут она возможна), главное что-бы блок имел размер (т.е. общее число тредов) кратный 32, — размер warp-а, что-бы утилизировать ресурсы на полную.
скажите пожалуйста, из-за чего, я получал ошибку о нехватки ресурсов? из-за предельного размера блока, или нехватки регистров? и она возникала именно при выполнении операции деления, которая, как пишут в инете, тяжелая сама по себе.

Когда проект собирается в release режиме, я вижу, что количество используемых регистров ниже, чем максимальное на блок, но в этом случае такой ошибки нет. Забавный тот факт, что и в режиме отладки я использую максимум десять процентов от доступного числа.
Признаться — не знаю. Так-бы сразу написал ;) Я сам еще только изучаю CUDA по курсам на coursera.org.
Кроме "формального" ограничения на количество нитей в блоке, есть еще ограничение на количество памяти, отводимой на блок. Если одна нить использует много памяти, то запустить заявленное количество блоков (1024 в вашем случае) не получится.
Спасибо, что набрели на мою статью. Правильно ли я понимаю, что в режиме отладки количество используемых регистров было больше, чем в "релизной", чисто из-за отладочных целей?
В таких тонкостях я уже не силен, но вы скорее всего правы. Во время отладки видимо видеокарте требуется больше ресурсов. Но знаю точно, что реальное количество нитей в блоке надо определять, исходя из того, сколько памяти занимает одна нить. Это можно либо рассчитать, либо посмотреть в каком-нибудь отладчике типа Parallel Nsight или CUDA Profiler.
Когда прозвучало слово «CUDA», я сразу подумал о решении уравнения Пуассона. А тут оказалось все в рамках школьной физики.
На самом деле, Nbody и SPH вполне популярны на CUDA.
Sign up to leave a comment.

Articles