Russian Qt Forum
Ноябрь 26, 2024, 04:16
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Алгоритмы
>
Потенциал Леннард-Джонса
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Потенциал Леннард-Джонса (Прочитано 16777 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Потенциал Леннард-Джонса
«
:
Ноябрь 03, 2015, 11:09 »
Добрый день
Об этом недавно упоминалось в плане дызайна, задача та же самая
Цитировать
Есть 2 объекта, для простоты 2 сферы. Пользователю нужна возможность задать силу их взаимодействия, правила:
- если объекты "достаточно близко" (друг от друга), то между ними возникает сила отталкивания. И чем они ближе тем эта отталкивающая сила больше
- если объекты "достаточно далеко" то наоборот, между ними возникает сила притяжения
- если объекты "совсем далеко" то никакой силы нет
Хорошо, задали силы, задали расстояния и... не работает, хоть с Леннардом, хоть с Джонсом (подозреваю что они здесь вообще ни при чем). Вернее работает очень плохо, совсем не так как хотелось бы. Подебажил, разобрался почему так происходит, и что собственно плохо.
Расчет сил производится 30 раз в секунду. Рассчитанная сила переводится в ускорение с учетом массы тел и шага по времени. Получившееся ускорение добавляется к текущей скорости объекта. Итак
Плохо 1. Если объект(ы) уже имеет какую-то скорость, то сила отталкивания может оказаться недостаточной чтобы предотвратить столкновение объектов.
Плохо 2. Пытаясь пресечь столкновения, пользователь начинает увеличивать силу отталкивания - но получается еще хуже. Пример: пусть никакой силы отталкивания еще нет, объект еще за границами ее действия. Но он имеет скорость, и на след шаге оказывается уже в зоне, и если скорость приличная - то глубоко внутри ее. И тогда сила отталкивания кааак въе.. - ну в общем получается мощнейшее ускорение - а оно интегрируется в скорость. Короче объект улетает хз куда, ну ничего себе "оттолкнулся".
Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками?
Нельзя ли это порешать "как программист", т.е. чисто практически, чтобы юзер был доволен и результаты "вполне". А насколько оно там соответствует теории (или нет) - совершенно не волнует.
Спасибо
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Потенциал Леннард-Джонса
«
Ответ #1 :
Ноябрь 03, 2015, 11:25 »
Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Потенциал Леннард-Джонса
«
Ответ #2 :
Ноябрь 03, 2015, 11:42 »
Цитата: m_ax от Ноябрь 03, 2015, 11:25
Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся)
Какие-то рекомендации.. ну откровенно беспринципные. Видать вся силенка в темплейты ушла
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Потенциал Леннард-Джонса
«
Ответ #3 :
Ноябрь 03, 2015, 11:59 »
Цитировать
Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками?
Используйте интегралы движения, например сохранение энергии:
mv^2/2 + U(
r
) = E
0
где U потенциал. Задаёте E
0
и вычисляете скорость. Никаких дифуров)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Потенциал Леннард-Джонса
«
Ответ #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
Сообщений: 11445
Re: Потенциал Леннард-Джонса
«
Ответ #5 :
Ноябрь 04, 2015, 09:45 »
Цитата: Racheengel от Ноябрь 03, 2015, 18:19
А шо, оно все в реальном времени моделируется? Внутреннее время никак низя ускорить?
Почему Ваша мысль немедленно начинает работать в направлении "как обойти проблему"? Может в ней ничего сложного-то и нет, проще ее решить? Ах, не оказалось готового решения в (несметной) кладовой Вашего опыта! Ну так это вполне нормально, в моей тоже не оказалось
Давайте думать и решать, а не бегать "по готовому".
Цитата: m_ax от Ноябрь 03, 2015, 11:59
Используйте интегралы движения, например сохранение энергии:
mv^2/2 + U(
r
) = E
0
где U потенциал. Задаёте E
0
и вычисляете скорость. Никаких дифуров)
Вы же знаете что трогать скорость (грязными руками) я не могу, это делает движок. По поводу приведенной формулы - ну как всегда, котлеты (теория) отдельно, мухи (реализация) отдельно. Как же мне получить
вектор
силы если у Вас одни скаляры?
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Потенциал Леннард-Джонса
«
Ответ #6 :
Ноябрь 04, 2015, 12:25 »
Цитировать
Как же мне получить вектор силы если у Вас одни скаляры?
F
= - grad U(
r
)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Потенциал Леннард-Джонса
«
Ответ #7 :
Ноябрь 05, 2015, 07:29 »
Цитата: m_ax от Ноябрь 04, 2015, 12:25
F
= - grad U(
r
)
Ну вот, выдавили из себя строчку - и умчались опять играться с темплейтами
Кто же такой "grad"? Это теоретик не соизволил пояснить, единственное разумное что мне приходит в голову - это нормированный вектор центр-центр объектов. А Вы не находите что он может совсем не совпадать с векторами скоростей объектов?
Да, и на следующий такой "лаконичный огрызок" отвечать уже не буду
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Потенциал Леннард-Джонса
«
Ответ #8 :
Ноябрь 05, 2015, 11:18 »
grad - это градиент) Думал это не требует пояснений)
См. аттач ниже.
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Потенциал Леннард-Джонса
«
Ответ #9 :
Ноябрь 06, 2015, 07:22 »
Цитата: m_ax от Ноябрь 05, 2015, 11:18
grad - это градиент) Думал это не требует пояснений)
Зачем надо было привлекать этот (весьма широкий) термин? Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (
r
/r)? Впрочем с любыми терминами Ваш пост ничего нового не вносит. Совершенно неважно какой "график" (модулятор) сил используется - хоть линейный, проблемы все те же.
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: Потенциал Леннард-Джонса
«
Ответ #10 :
Ноябрь 06, 2015, 10:00 »
Наверное, без интегрирования все же не обойдется.
Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком).
Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано.
Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Потенциал Леннард-Джонса
«
Ответ #11 :
Ноябрь 06, 2015, 10:26 »
Цитата: ssoft от Ноябрь 06, 2015, 10:00
Наверное, без интегрирования все же не обойдется.
Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком).
Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано.
Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются.
У меня сейчас немало задач такого плана (пошла струя
). По опыту уже решенных могу сказать - никакой особой "крутизны" не требуется. Ну взять хотя бы притяжение - ну посчитал вектор силы по заданному закону, отдал движку - и все дела. Шо тут интегрировать?
Да и с проблемами отталкивания (описанными здесь) идея-то понятна - нужно не просто "отталкивать", а еще и гасить вектор скорости, по аналогии с пружиной (соседняя тема).
Конечно советы людей с бОльшими познаниями в физике/математике совсем не помешали бы - но где ж там
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Потенциал Леннард-Джонса
«
Ответ #12 :
Ноябрь 06, 2015, 11:50 »
Цитировать
Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)?
Потому что это неправильно) Не знаю в какой книжке Вы это вычитали, но
Цитировать
Зачем надо было привлекать этот (весьма широкий) термин?
коль скоро мы говорим в контексте физической задачи, то будьте добры оперировать и на общепринятом языке - градиент всегда был и есть векторный дифференциальный оператор. И сила не сводится просто к умножению потенциала на единичный вектор (
r
/r).
А проблема Ваша из-за того, что на масштабе шага потенциал меняется достаточно значительно, что и ведёт к этим артефактам.. Играйтесь с параметрами потенциала (a1, a2, степени) или уменьшайте шаг, или (если есть возможность в движке) меняйте Эйлера на Рунге-Кутта. Или, на худой конец, добавьте к силе диссипацию..
«
Последнее редактирование: Ноябрь 06, 2015, 12:12 от m_ax
»
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
ssoft
Программист
Offline
Сообщений: 584
Re: Потенциал Леннард-Джонса
«
Ответ #13 :
Ноябрь 06, 2015, 12:24 »
Тут дело не в крутизне
Заменяя бесконечно малые изменения dt на конечные, мы получаем существенную погрешность.
Пусть скорость линейная функция
v = v
0
+ a
const
*t
v - скорость
a - ускорение
t - время от начального момента
дистанция рассчитывается через интеграл (надеюсь понятно в такой записи)
d(t) = integral( v(t)dt, t
0
, t);
если заменить расчет через delta_t, то получим
delta_t = t
i
-t
i-1
d += v(t
i
) * delta_t
реально же через интегралы
d += v(t
i
) * delta_t + ( a
const
* delta_t
2
) / 2
Чем больше delta_t тем больше ошибка.
Оба варианта являются конечной разностью интеграла полученной при разложении в ряд Тейлора функции дистанции по времени.
Первый соответствует постоянной скорости (ускорение 0), второй постоянному ускорению (сила воздействия не изменяется).
Ряд сходящийся, сумма остаточных членов ряда - погрешность вычислений.
В случае когда сила воздействия зависит от положения самого тела необходимо иметь градиент потенциала, дивергенцию скорости и ..., собственно решать диф. уравнения.
Простой подгон не даст решения на все случаи.
Для подгона могу предложить только определять силу воздействия не по мгновенному значению, а по формуле
F
0
= F(t
0
);
F
1
= F(t
1
);
F = ( F
0
* w
0
+ F
1
* w
1
) / ( w
0
+ w
1
);
и подбирать веса w, чтобы все выглядела достаточно прилично.
«
Последнее редактирование: Ноябрь 06, 2015, 12:40 от ssoft
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Потенциал Леннард-Джонса
«
Ответ #14 :
Ноябрь 06, 2015, 12:33 »
Цитата: m_ax от Ноябрь 06, 2015, 11:50
Цитировать
Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)?
Потому что это неправильно) Не знаю в какой книжке Вы это вычитали, но
Да в Вашем же скриншоте. Что такое
r
/r (вектор деленный на его длину)? Это нормированный вектор
Цитата: m_ax от Ноябрь 06, 2015, 11:50
коль скоро мы говорим в контексте физической задачи, то будьте добры оперировать и на общепринятом языке - градиент всегда был и есть векторный дифференциальный оператор. И сила не сводится просто к умножению потенциала на единичный вектор (
r
/r).
Напрасно Вы пытаетесь "наводить порядки" и запугать меня "векторным дифференциальным оператором"
Что ж это у Вас за градиент если никакого взятия производной и в помине не было? Это просто вектор центр-центр - и ничего более. И в том же скриншоте сила именно сводится к умножению, отсюда хапнули вектор, оттуда скаляр - и все дела.
Цитата: m_ax от Ноябрь 06, 2015, 11:50
А проблема Ваша из-за того, что на масштабе шага потенциал меняется достаточно значительно, что и ведёт к этим артефактам.. Играйтесь с параметрами потенциала (a1, a2, степени) или уменьшайте шаг, или (если есть возможность в движке) меняйте Эйлера на Рунге-Кутта. Или, на худой конец, добавьте к силе диссипацию..
m_ax
, я ж Вас в тему на аркане не тяну. Есть мысли которыми Вы бы хотели поделиться - пожалуйста, я внимательно слушаю. А нет - так чего порожняк гнать? Уже устал его слушать
«
Последнее редактирование: Ноябрь 06, 2015, 12:35 от Igors
»
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...