Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Помогите найти аналитическое решение

Помогите найти аналитическое решение

Поделиться

Страницы: 1 2 3 Следующая

HolyDelПостоялецwww10 сен. 201710:44#0
Создается снаряд летящий со скоростью S.
каждый тик эта скорость гасится с некоторым коэффициентом, например k, например 0.99
снаряд живет n тиков, например 1000.

я могу найти эту дистанцию так:

double dist = 0;
for (int i = 0; i < lifetime; ++i)
{
    dist += speed;
    speed *= speedDemp;
}

но мне кажется, должно быть какое-то аналитическое решение, помогите мне его найти пожалуйста.

MrShoorУчастникwww10 сен. 201711:00#1
HolyDel
> но мне кажется, должно быть какое-то аналитическое решение, помогите мне его
> найти пожалуйста.
Гугли: "сумма N членов геометрической прогрессии"
HolyDelПостоялецwww10 сен. 201711:14#2
MrShoor
> Гугли: "сумма N членов геометрической прогрессии"
спасибо! работает!
SuslikМодераторwww10 сен. 201713:33#3
вот кто, блин, вообще придумал закрывать темы? особенно после таких "решений". сумма геометрической прогрессии — это не аналитическое решение, а результат численного решения, посчитанный без итераций. погрешности дискретизации из него никуда не денутся, да ещё и с шагом по времени будут траблы, потому что решение его никак не учитывает.

если есть закон изменения скорости:
[cht]\ddot{x}=-\alpha \dot{x}[/cht], то есть то самое, что обычно аппроксимируют формулой
[cht]\dot{x}(t+dt)=(1-\alpha \cdot dt)\dot{x}(t)[/cht]
(здесь [cht]1-\alpha \cdot dt[/cht] -- есть твой speedDemp, который на самом деле должен быть speedDamp, ибо damping, ну да ладно)
то аналитическим решением для скорости будет экспонента:
[cht]\dot{x}(t)=e^{-\alpha (t-t_0)}\dot{x}(t_0)[/cht]
и чтобы получить нормальное аналитическое решение для [cht]x(t)[/cht], его надо проинтегрировать:
[cht]x(t)=x(t_0)-\dot{x}(t_0)\frac{e^{-\alpha(t-t_0)}-1}{\alpha}[/cht]
теперь видно, что если [cht]\alpha[/cht] устремить к [cht]+\infty[/cht], получится константа, а если к нулю, то обычное равномерное движение вида [cht]x(t)=x(t_0)+\dot{x}(t_0)\cdot(t-t_0)[/cht]

Правка: 10 сен. 2017 17:25

Андрей5000Постоялецwww10 сен. 201717:04#4
суслик дело говорит.

но есть пара вопросиков
1) а с фига ли тут минус?
Изображение

2) зачем экспонента? почему не 2^x?
Изображение

Правка: 10 сен. 2017 17:15

SuslikМодераторwww10 сен. 201717:24#5
Андрей5000
> 1) а с фига ли тут минус?
потому что трение всегда тормозит, а не ускоряет объект

Андрей5000
> 2) зачем экспонента? почему не 2^x?
потому что при интегрировании получается экпонента. продифференцируй результат, чтобы проверить.

Андрей5000Постоялецwww10 сен. 201718:00#6
Suslik
продифференцировал, исходное Изображение никак не получается.
Производная от экспоненты это же и есть экспонента. А в исходном уравнении никаких экспонент нет.
FordPerfectПостоялецwww10 сен. 201718:00#7
Suslik
Иногда таки удобнее дискретное решение, например если задача всё равно сформулирована в терминах количества шагов, и не хочется off-by-one при применении непрерывной формулы (в непрерывном случае у off-by-one нет эквивалента, поэтому его возникновение может быть дополнительной неожиданностью).

Если код из #0 записать в виде:

double a=-std::expm1(-alpha * time_step)/alpha;
double b=std::exp(-alpha * time_step);
for(int i=0;i<lifetime;++i)
{
  dist += speed * a;
  speed *= b;
}
он будет давать то же, что и твоя формула (если не накосячил).
И тривиально переформулируется в сумму геометрической прогрессии.

Оригинальный же код аппроксимирован: a==1.0 (кстати, не time_step, но это тупо масштабный коэффициент на speed).

FordPerfectПостоялецwww10 сен. 201718:05#8
Я не пропагандирую дискретную формулировку, если что.
Тупо указываю, что она существует, о ней можно помнить.
MrShoorУчастникwww10 сен. 201719:37#9
Suslik
+ > вот кто, блин, вообще придумал закрывать темы?

> особенно после таких "решений". сумма геометрической прогрессии — это не
> аналитическое решение, а результат численного решения, посчитанный без
> итераций.
Для ТС это как раз таки аналитическое решение, ибо у него входные данные - целые положительные числа, и время измеряется в тиках.

> погрешности дискретизации из него никуда не денутся, да ещё и с шагом по
> времени будут траблы, потому что решение его никак не учитывает.
Какой блин шаг времени? У него Dampling - дискретная модель, т.к. он гасит скорость раз в тик. Там нету пол тика, или полтора.

FordPerfectПостоялецwww10 сен. 201720:04#10
MrShoor
>целые положительные числа, и время измеряется в тиках.
Из 3-x входных данных (speed, speedDemp, lifetime) - только lifetime - целое (неотрицательное).

Ну и вообще из формулировки ТС не совсем понятно, что надо.
Если перемещение всё-равно считается теми итерациями, и нужно заранее сказать, сколько получится - тогда они сводятся к геометрической прогрессии.

Андрей5000Постоялецwww10 сен. 201720:06#11
Мы же можем в формуле суммы прогрессии использовать вещественный n а не целочисленный. Разве какие то погрешности будут?
К чему тут эти интегралы суслика?

Правка: 10 сен. 2017 20:07

MrShoorУчастникwww10 сен. 201720:27#12
FordPerfect
> Из 3-x входных данных (speed, speedDemp, lifetime) - только lifetime - целое
> (неотрицательное).
Ты прав, я не так выразился. Аргумент функции у нас целое положительное.

Андрей5000
> Разве какие то погрешности будут?
Ну вон суслик говорит, что будут. Я не проверял, мне лень, но вполне возможно что он заблуждается. Сумма N членов геометрической прогрессии вполне себе гладкая непрерывная функция. Какие погрешности будут - можно посмотреть подставив например 2.5, но для этого мне нужно сначала проверить, что суслик вообще правильное уравнение движения вывел. Мое же решение проверять не надо, оно 100% работающее (в условиях применимости заданных топикстартером).

> К чему тут эти интегралы суслика?
Это наверное только суслик сможет ответить. Его так бомбануло, что он закрытую тему заново открыл. Возможно причина оооооочень веская.

Правка: 10 сен. 2017 20:28

HolyDelПостоялецwww10 сен. 201720:39#13
Suslik
> сумма геометрической прогрессии — это не аналитическое решение, а результат
> численного решения, посчитанный без итераций.
я просто неправильно выразился. мне лишь нужно было избавиться от цикла.

Андрей5000
> К чему тут эти интегралы суслика?
они по разному работают. их результат мало отличается на больших значениях lifetime, но если lifetime мал, то результат заметно отличается. ведь у меня гашение скорости происходит дискретно, а в решении Суслика - непрерывно.

MrShoor
что загуглить если у меня прогрессия смешанная, типа такой:

double dist = 0;
for (int i = 0; i < lifetime; ++i)
{
    dist += speed;
    speed += acc;
    speed *= speedDemp;

}
FordPerfectПостоялецwww10 сен. 201720:46#14
MrShoor
Формулы HolyDel и Suslik считают разные вещи. Естественно, результаты будут отличаться.
Нужна ли ТС именно его формула - я хз.

С т. з. уравнений движения - в #0 есть погрешность (ну или очень своеобразное определение понятия "скорость").

Страницы: 1 2 3 Следующая

/ Форум / Программирование игр / Физика

2001—2017 © GameDev.ru — Разработка игр