Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Igors от Ноябрь 03, 2015, 11:09



Название: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 03, 2015, 11:09
Добрый день

Об этом недавно упоминалось в плане дызайна, задача та же самая
Цитировать
Есть 2 объекта, для простоты 2 сферы. Пользователю нужна возможность задать силу их взаимодействия, правила:

- если объекты "достаточно близко" (друг от друга), то между ними возникает сила отталкивания. И чем они ближе тем эта отталкивающая сила больше

- если объекты "достаточно далеко" то наоборот, между ними возникает сила притяжения

- если объекты "совсем далеко" то никакой силы нет
Хорошо, задали силы, задали расстояния и... не работает, хоть с Леннардом, хоть с Джонсом (подозреваю что они здесь вообще ни при чем). Вернее работает очень плохо, совсем не так как хотелось бы. Подебажил, разобрался почему так происходит, и что собственно плохо.

Расчет сил производится 30 раз в секунду. Рассчитанная сила переводится в ускорение с учетом массы тел и шага по времени. Получившееся ускорение добавляется к текущей скорости объекта. Итак

Плохо 1. Если объект(ы) уже имеет какую-то скорость, то сила отталкивания может оказаться недостаточной чтобы предотвратить столкновение объектов.

Плохо 2. Пытаясь пресечь столкновения, пользователь начинает увеличивать силу отталкивания - но получается еще хуже. Пример: пусть никакой силы отталкивания еще нет, объект еще за границами ее действия. Но он имеет скорость, и на след шаге оказывается уже в зоне, и если скорость приличная - то глубоко внутри ее. И тогда сила отталкивания кааак въе.. - ну в общем получается мощнейшее ускорение - а оно интегрируется в скорость. Короче объект улетает хз куда, ну ничего себе  "оттолкнулся".

Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками? :'( Нельзя ли это порешать "как программист", т.е. чисто практически, чтобы юзер был доволен и результаты "вполне". А насколько оно там соответствует теории (или нет) - совершенно не волнует.

Спасибо
    


Название: Re: Потенциал Леннард-Джонса
Отправлено: m_ax от Ноябрь 03, 2015, 11:25
Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся)


Название: Re: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 03, 2015, 11:42
Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся)
Какие-то рекомендации.. ну откровенно беспринципные. Видать вся силенка в темплейты ушла :)


Название: Re: Потенциал Леннард-Джонса
Отправлено: m_ax от Ноябрь 03, 2015, 11:59
Цитировать
Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками?
Используйте интегралы движения, например сохранение энергии:

mv^2/2 + U(r) = E0
где U потенциал. Задаёте E0 и вычисляете скорость. Никаких дифуров)


Название: Re: Потенциал Леннард-Джонса
Отправлено: Racheengel от Ноябрь 03, 2015, 18:19
Цитировать
Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками?

А шо, оно все в реальном времени моделируется? Внутреннее время никак низя ускорить?


Название: Re: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 04, 2015, 09:45
А шо, оно все в реальном времени моделируется? Внутреннее время никак низя ускорить?
Почему Ваша мысль немедленно начинает работать в направлении "как обойти проблему"? Может в ней ничего сложного-то и нет, проще ее решить? Ах, не оказалось готового решения в (несметной) кладовой Вашего опыта! Ну так это вполне нормально, в моей тоже не оказалось :) Давайте думать и решать, а не бегать "по готовому".

Используйте интегралы движения, например сохранение энергии:

mv^2/2 + U(r) = E0
где U потенциал. Задаёте E0 и вычисляете скорость. Никаких дифуров)
Вы же знаете что трогать скорость (грязными руками) я не могу, это делает движок. По поводу приведенной формулы - ну как всегда, котлеты (теория) отдельно, мухи (реализация) отдельно. Как же мне получить вектор силы если у Вас одни скаляры?


Название: Re: Потенциал Леннард-Джонса
Отправлено: m_ax от Ноябрь 04, 2015, 12:25
Цитировать
Как же мне получить вектор силы если у Вас одни скаляры?
F = - grad U(r)


Название: Re: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 05, 2015, 07:29
F = - grad U(r)
Ну вот, выдавили из себя строчку - и умчались опять играться с темплейтами :) Кто же такой "grad"? Это теоретик не соизволил пояснить, единственное разумное что мне приходит в голову - это нормированный вектор центр-центр объектов. А Вы не находите что он может совсем не совпадать с векторами скоростей объектов?

Да, и на следующий такой "лаконичный огрызок" отвечать уже не буду  :) 


Название: Re: Потенциал Леннард-Джонса
Отправлено: m_ax от Ноябрь 05, 2015, 11:18
grad - это градиент) Думал это не требует пояснений)
См. аттач ниже.


 


Название: Re: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 06, 2015, 07:22
grad - это градиент) Думал это не требует пояснений)
Зачем надо было привлекать этот (весьма широкий) термин? Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)? Впрочем с любыми терминами Ваш пост ничего нового не вносит. Совершенно неважно какой "график" (модулятор) сил используется - хоть линейный, проблемы все те же.


Название: Re: Потенциал Леннард-Джонса
Отправлено: ssoft от Ноябрь 06, 2015, 10:00
Наверное, без интегрирования все же не обойдется.
Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком).
Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано.
Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются.


Название: Re: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 06, 2015, 10:26
Наверное, без интегрирования все же не обойдется.
Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком).
Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано.
Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются.
У меня сейчас немало задач такого плана (пошла струя :)). По опыту уже решенных могу сказать - никакой особой "крутизны" не требуется. Ну взять хотя бы притяжение - ну посчитал вектор силы по заданному закону, отдал движку - и все дела. Шо тут интегрировать? :) Да и с проблемами отталкивания (описанными здесь) идея-то понятна - нужно не просто "отталкивать", а еще и гасить вектор скорости, по аналогии с пружиной (соседняя тема).

Конечно советы людей с бОльшими познаниями в физике/математике совсем не помешали бы - но где ж там  :'(


Название: Re: Потенциал Леннард-Джонса
Отправлено: m_ax от Ноябрь 06, 2015, 11:50
Цитировать
Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)?
Потому что это неправильно) Не знаю в какой книжке Вы это вычитали, но
Цитировать
Зачем надо было привлекать этот (весьма широкий) термин?
коль скоро мы говорим в контексте физической задачи, то будьте добры оперировать и на общепринятом языке - градиент  всегда был и есть векторный дифференциальный оператор. И сила не сводится просто к умножению потенциала на единичный вектор (r/r).

А проблема Ваша из-за того, что на масштабе шага потенциал меняется достаточно значительно, что и ведёт к этим артефактам..  Играйтесь с параметрами потенциала (a1, a2, степени) или уменьшайте шаг, или (если есть возможность в движке) меняйте Эйлера на Рунге-Кутта.     Или, на худой конец, добавьте к силе диссипацию.. 


Название: Re: Потенциал Леннард-Джонса
Отправлено: ssoft от Ноябрь 06, 2015, 12:24
Тут дело не в крутизне  :D
Заменяя бесконечно малые изменения dt на конечные, мы получаем существенную погрешность.

Пусть скорость линейная функция

v = v0 + aconst*t
v - скорость
a - ускорение
t - время от начального момента

дистанция рассчитывается через интеграл (надеюсь понятно в такой записи)

d(t) = integral( v(t)dt, t0, t);

если заменить расчет через delta_t, то получим

delta_t = ti-ti-1
d += v(ti) * delta_t

реально же через интегралы

d += v(ti) * delta_t + ( aconst * delta_t2) / 2

Чем больше delta_t тем больше ошибка.

Оба варианта являются конечной разностью интеграла полученной при разложении в ряд Тейлора функции дистанции по времени.
Первый соответствует постоянной скорости (ускорение 0), второй постоянному ускорению (сила воздействия не изменяется).
Ряд сходящийся, сумма остаточных членов ряда - погрешность вычислений.

В случае когда сила воздействия зависит от положения самого тела необходимо иметь градиент потенциала, дивергенцию скорости и ..., собственно решать диф. уравнения.
Простой подгон не даст решения на все случаи.

Для подгона могу предложить только определять силу воздействия не по мгновенному значению, а по формуле

F0 = F(t0);
F1 = F(t1);

F = ( F0 * w0 + F1 * w1 ) / ( w0 + w1 );

и подбирать веса w, чтобы все выглядела достаточно прилично.


Название: Re: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 06, 2015, 12:33
Цитировать
Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)?
Потому что это неправильно) Не знаю в какой книжке Вы это вычитали, но
Да в Вашем же скриншоте. Что такое r/r (вектор деленный на его длину)? Это нормированный вектор

коль скоро мы говорим в контексте физической задачи, то будьте добры оперировать и на общепринятом языке - градиент  всегда был и есть векторный дифференциальный оператор. И сила не сводится просто к умножению потенциала на единичный вектор (r/r).
Напрасно Вы пытаетесь "наводить порядки" и запугать меня "векторным дифференциальным оператором" :) Что ж это у Вас за градиент если никакого взятия производной и в помине не было? Это просто вектор центр-центр - и ничего более. И в том же скриншоте сила именно сводится к умножению, отсюда хапнули вектор, оттуда скаляр - и все дела.

А проблема Ваша из-за того, что на масштабе шага потенциал меняется достаточно значительно, что и ведёт к этим артефактам..  Играйтесь с параметрами потенциала (a1, a2, степени) или уменьшайте шаг, или (если есть возможность в движке) меняйте Эйлера на Рунге-Кутта.     Или, на худой конец, добавьте к силе диссипацию..
m_ax, я ж Вас в тему на аркане не тяну. Есть мысли которыми Вы бы хотели поделиться - пожалуйста, я внимательно слушаю. А нет - так чего порожняк гнать? Уже устал его слушать  :'(


Название: Re: Потенциал Леннард-Джонса
Отправлено: m_ax от Ноябрь 06, 2015, 12:50
Цитировать
Что ж это у Вас за градиент если никакого взятия производной и в помине не было? Это просто вектор центр-центр - и ничего более. И в том же скриншоте сила именно сводится к умножения,
O___o Вы точно скиншот видели? Посмотрите ещё повнимательнее..


Попробуйте к силе добавить член -kv, где коэффициент k может зависеть от скорости, например он становится отличным от нуля при достижении определённого порога скорости. Экстренное торможение, так сказать..


Название: Re: Потенциал Леннард-Джонса
Отправлено: Igors от Ноябрь 06, 2015, 13:12
Тут дело не в крутизне  :D
Заменяя бесконечно малые изменения dt на конечные, мы получаем существенную погрешность.
Заливаете конечно, но творчески, умело, мне Ваш подход импонирует :)

По существу: мне совершенно нафиг не нужен d (пройденный путь), этим занимается движок. Я могу только сообщить ему, мол, прилагаю такую-то силу, а его дело разобраться. Напр я могу приложить безумную силу, но если объект уперся в препятствие - это не возымеет никакого эффекта. По этой же причине я не могу взвешивать силы - ситуация от кадра к кадру может не иметь ничего общего.

Ладно, для себя наметил такой план:

- вычитаем вектора скорости объектов, получаем вектор "относительной скорости"
- проецируем этот вектор на направление центр-центр, получаем вектор "приближения" одного объекта к другому

[OFF]Нытье: конечно это совсем просто, и даже "очевидно". Но (гребаный компот), почему теоретики НИКОГДА не сообщают о таких "мелких подробностях"? Ведь без них получится полная чушь. Ладно, уже давно привык [/OFF]

- без затей (по заданным пользователем параметрам) считаем силу отталкивания. но ПЛЮС к ней силу которая погасит "вектор приближения". Коэффициент гашения видимо тоже надо дать юзеру.

Это все. Что Вы об этом думаете?