Russian Qt Forum
Ноябрь 26, 2024, 04:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Потенциал Леннард-Джонса  (Прочитано 16777 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Ноябрь 03, 2015, 11:09 »

Добрый день

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

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

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

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

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

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

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

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

Спасибо
    
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Ноябрь 03, 2015, 11:25 »

Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 03, 2015, 11:42 »

Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся)
Какие-то рекомендации.. ну откровенно беспринципные. Видать вся силенка в темплейты ушла Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Ноябрь 03, 2015, 11:59 »

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Ноябрь 03, 2015, 18:19 »

Цитировать
Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками?

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Ноябрь 04, 2015, 09:45 »

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

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

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

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Ноябрь 04, 2015, 12:25 »

Цитировать
Как же мне получить вектор силы если у Вас одни скаляры?
F = - grad U(r)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 05, 2015, 07:29 »

F = - grad U(r)
Ну вот, выдавили из себя строчку - и умчались опять играться с темплейтами Улыбающийся Кто же такой "grad"? Это теоретик не соизволил пояснить, единственное разумное что мне приходит в голову - это нормированный вектор центр-центр объектов. А Вы не находите что он может совсем не совпадать с векторами скоростей объектов?

Да, и на следующий такой "лаконичный огрызок" отвечать уже не буду  Улыбающийся 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Ноябрь 05, 2015, 11:18 »

grad - это градиент) Думал это не требует пояснений)
См. аттач ниже.


 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Ноябрь 06, 2015, 07:22 »

grad - это градиент) Думал это не требует пояснений)
Зачем надо было привлекать этот (весьма широкий) термин? Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)? Впрочем с любыми терминами Ваш пост ничего нового не вносит. Совершенно неважно какой "график" (модулятор) сил используется - хоть линейный, проблемы все те же.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #10 : Ноябрь 06, 2015, 10:00 »

Наверное, без интегрирования все же не обойдется.
Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком).
Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано.
Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Ноябрь 06, 2015, 10:26 »

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

Конечно советы людей с бОльшими познаниями в физике/математике совсем не помешали бы - но где ж там  Плачущий
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Ноябрь 06, 2015, 11:50 »

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #13 : Ноябрь 06, 2015, 12:24 »

Тут дело не в крутизне  Веселый
Заменяя бесконечно малые изменения 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, чтобы все выглядела достаточно прилично.
« Последнее редактирование: Ноябрь 06, 2015, 12:40 от ssoft » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Ноябрь 06, 2015, 12:33 »

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

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

А проблема Ваша из-за того, что на масштабе шага потенциал меняется достаточно значительно, что и ведёт к этим артефактам..  Играйтесь с параметрами потенциала (a1, a2, степени) или уменьшайте шаг, или (если есть возможность в движке) меняйте Эйлера на Рунге-Кутта.     Или, на худой конец, добавьте к силе диссипацию..
m_ax, я ж Вас в тему на аркане не тяну. Есть мысли которыми Вы бы хотели поделиться - пожалуйста, я внимательно слушаю. А нет - так чего порожняк гнать? Уже устал его слушать  Плачущий
« Последнее редактирование: Ноябрь 06, 2015, 12:35 от Igors » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.155 секунд. Запросов: 23.