Что такое интеграл мгновенная скорость. Расстояние как интеграл

В разделе на вопрос никак не могу понять что такое интегралы заданный автором Простирнуть лучший ответ это Нарисуйте оси координат и какую-ндь кривую. Всё равно какую, лишь бы она представляла собой непрерывную и однозначную функцию (то есть рисовать синус по вертикали не надо). А потом отметьте на оси Х две точки и от них проведите вертикальные линии. Вот эти линии, сама ось Х и кривая образовали "четырёхугольник" (ну и что, что одна сторона у него кривая). Так вот площадь этого четырёхугольника - как раз интеграл от этой кривой.
Можно и физический пример привести. Есть такие приборы - акселерометры. Они позволяют очень точно измерять ускорение. Внимание, вопрос: как, пользуясь таким прибором, измерить пройденный путь? Ответ: проинтегрировать его показания по времени (два раза). Ведь скорость - это интеграл от ускорения, а пройденный путь - интеграл от скорости.
Ещё один пример, весьма для меня жизненный. Есть матрица ПЗС, и есть переменный световой поток. Опять же - вопрос: какой сигнал зарегистрирует матрица? Ответ: это будет интеграл от освещённости по времени (за время накопления одного кадра) .
Всё это я к чему: математика - чертовски практичная вещь...

Ответ от Невроз [гуру]
Грубо говоря определения площади не ровного тела. Которое нувозможно разделить на правильные формы.


Ответ от Kida [гуру]
Интеграл, это то, что было до нас.... а мы - его производные.. .
Толсьая многотомная книжко Фихтенгольца тебе в помощь.. . Познакомься с ботаником..


Ответ от Колосовые [активный]
Понятие интеграла довольно абстрактное и большое (интегралы, например, разных типов бывают) , и приложений у них куча. Так что это вопрос из серии: "А расскажите мне прямо тут, просто и доступно историю Руси при Иване Грозном".


Ответ от ScrAll [гуру]
Делить на Ноль - абсурдно, но на Оч-чень маленькую величину можно.. .
А сколько будет весить пучок таких ма-аленьких величин?
Интеграл поможет.

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

а что работа равна произведению силы на расстояние. Если все движение происходит с постоянной скоростью или расстояние преодолевается с приложением одной и той же силы, то все понятно, нужно их просто перемножить. Что такое интеграл от константы? вида y=kx+c.

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

Итак, понятно, для чего нужен интеграл. Определение его как суммы произведений значений функции на бесконечно малое приращение аргумента вполне описывает главный смысл этого понятия как площадь фигуры, ограниченной сверху линией функции, а по краям - границами определения.

Жан Гастон Дарбу, французский математик, во второй половине XIX века очень наглядно объяснил, что такое интеграл. Он сделал это настолько понятно, что в целом разобраться в этом вопросе не составит труда даже школьнику младших классов средней школы.

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

Функция оказалась «нарезанной» на маленькие кирпичики.

Каждому значению аргумента соответствует точка на оси ординат, на которой откладываются соответствующие значения функции. Но так как границ у выделенного участка две, то и значений функции тоже будет два, большее и меньшее.

Сумма произведений бо́льших значений на приращение Δ называется большой суммой Дарбу, и обозначается как S. Соответственно, меньшие на ограниченном участке значения, умноженные на Δ, все вместе образуют малую сумму Дарбу s. Сам участок напоминает прямоугольную трапецию, так как кривизной линии функции при бесконечно малом ее приращении можно пренебречь. Самый простой способ найти площадь такой геометрической фигуры - это сложить произведения большего и меньшего значения функции на Δ-приращение и поделить на два, то есть определить как среднее арифметическое.

Вот что такое интеграл по Дарбу:

s=Σf(x) Δ - малая сумма;

S= Σf(x+Δ)Δ - большая сумма.

Итак, что такое интеграл? Площадь, ограниченная линией функции и границами определения будет равна:

∫f(x)dx = {(S+s)/2} +c

То есть среднее арифметическое большой и малой сумм Дарбу.с - величина постоянная, обнуляемая при дифференцировании.

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

L = ∫f(x)dx на промежутке от t1 до t2,

f(x) - функция скорости, то есть формула, по которой она меняется во времени;

L - длина пути;

t1 - время начала пути;

t2 - время окончания пути.

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

  • Перевод

Симуляция физики делает небольшие предсказания на основании законов физики. Эти предсказания на самом деле достаточно просты, что-то вроде «если объект вот здесь и он движется с такой скоростью в этом направлении, то за краткий промежуток времени он окажется вот тут». Мы создаём такие предсказания с помощью математической техники под названием интегрирование.

Темой этой статьи как раз и будет реализация такого интегрирования.

Интегрирование уравнений движения

Вы можете помнить из курса старшей школы или вуза, что сила равна произведению массы на ускорение.
Преобразуем это уравнение и увидим, что ускорение равно силе, делённой на массу. Это соответствует нашим интуитивным ожиданиям, потому что тяжёлые объекты труднее бросать.
Ускорение - это темп изменения скорости от времени:

Аналогично, скорость - это темп изменения позиции от времени:


Это значит, что если мы знаем текущие позицию и скорость объекта, а также приложенные к нему силы, то сможем проинтегрировать, чтобы найти его позицию и скорость в определённый момент времени.

Численное интегрирование

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

Вот как работает численное интегрирование: во-первых, начнём с исходной позиции и скорости, затем сделаем небольшой шаг вперёд, чтобы найти скорость и позицию в будущем. Затем повторим это, двигаясь вперёд небольшими шагами, используя результат предыдущих вычислений как исходную точку следующих.

Но как нам найти изменение скорости и позиции на каждом шаге?

Ответ лежит в уравнениях движения .

Давайте назовём наше текущее время t , а шаг времени dt или «delta time».

Теперь мы можем представить уравнения движения в понятном всем виде:

Ускорение = сила / масса изменение позиции = скорость * dt изменение скорости = ускорение * dt
Интуитивно это понятно: если вы находитесь в автомобиле, движущемся со скоростью 60 км/ч, то за один час вы проедете 60 км. Аналогично, автомобиль, ускоряющийся на 10 км/ч в секунду, через 10 секунд будет двигаться на 100 км/ч быстрее.

Разумеется, эта логика сохраняется, только когда ускорение и скорость постоянны. Но даже если они меняются, то это для начала вполне неплохая аппроксимация.

Давайте представим это в коде. Начнём с стационарного объекта массой один килограмм и приложим к нему постоянную силу в 10 кН (килоньютонов) и сделаем шаг вперёд, принимая, что один временной шаг равен одной секунде:

Double t = 0.0; float dt = 1.0f; float velocity = 0.0f; float position = 0.0f; float force = 10.0f; float mass = 1.0f; while (t <= 10.0) { position = position + velocity * dt; velocity = velocity + (force / mass) * dt; t += dt; }
Вот каким будет результат:

T=0: position = 0 velocity = 0 t=1: position = 0 velocity = 10 t=2: position = 10 velocity = 20 t=3: position = 30 velocity = 30 t=4: position = 60 velocity = 40 t=5: position = 100 velocity = 50 t=6: position = 150 velocity = 60 t=7: position = 210 velocity = 70 t=8: position = 280 velocity = 80 t=9: position = 360 velocity = 90 t=10: position = 450 velocity = 100
Как вы видите, на каждом шаге мы знаем и позицию, и скорость объекта. Это и есть численное интегрирование.

Явный метод Эйлера

Вид интегрирования, который мы только что использовали, называется явным методом Эйлера .

Он назван в честь швейцарского математика Леонарда Эйлера , впервые открывшего эту технику.

Интегрирование Эйлера - это простейшая техника численного интегрирования. Она точна на 100% только когда темп изменений в течение шага времени постоянен.

Поскольку в примере выше ускорение постоянно, интегрирование скорости выполняется без ошибок. Однако мы ещё интегрируем и скорость для получения позиции, а скорость увеличивается из-за ускорения. Это значит, что в проинтегрированной позиции возникает ошибка.

Но насколько велика эта ошибка? Давайте выясним!

Существует аналитическое решение движения объекта при постоянном ускорении. Мы можем использовать его, чтобы сравнить численно интегрированную позицию с точным результатом:

S = ut + 0.5at^2 s = 0.0*t + 0.5at^2 s = 0.5(10)(10^2) s = 0.5(10)(100) s = 500 метров
Через 10 секунд объект должен был переместиться на 500 метров, но явным метод Эйлера даёт нам результат 450. То есть погрешность в целых 50 метров всего за 10 секунд!

Кажется, что это невероятно плохо, но в играх обычно для шага физики берётся не такой большой временной интервал. На самом деле, физика обычно вычисляется с частотой, примерно равной частоте кадров дисплея.

Если задать шаг dt = 1 ⁄ 100 , то мы получим гораздо лучший результат:

T=9.90: position = 489.552155 velocity = 98.999062 t=9.91: position = 490.542145 velocity = 99.099060 t=9.92: position = 491.533142 velocity = 99.199059 t=9.93: position = 492.525146 velocity = 99.299057 t=9.94: position = 493.518127 velocity = 99.399055 t=9.95: position = 494.512115 velocity = 99.499054 t=9.96: position = 495.507111 velocity = 99.599052 t=9.97: position = 496.503113 velocity = 99.699051 t=9.98: position = 497.500092 velocity = 99.799049 t=9.99: position = 498.498077 velocity = 99.899048 t=10.00: position = 499.497070 velocity = 99.999046
Как вы видите, это достаточно хороший результат, определённо вполне достаточный для игры.

Почему явный метод Эйлера не (всегда) так уж хорош

С достаточно малым шагом времени явный метод Эйлера при постоянном ускорении даёт вполне достойные результаты, но что будет, если ускорение не постоянно?

Хорошим примером переменного ускорения является система пружинного амортизатора .

В этой системе масса присоединена к пружине, и её движение гасится чем-то вроде трения. Существует сила, пропорциональная расстоянию до объекта, которая притягивает его к исходной точке, и сила, пропорциональная скорости объекта, но направленная в противоположном направлении, которая замедляет его.

Здесь ускорение в течение шага времени совершенно точно изменяется, но эта постоянно меняющаяся функция является сочетанием позиции и скорости, которые сами постоянно изменяются за шаг времени.

В большинстве коммерческих игровых физических движков используется этот интегратор.

Переход от явного к симплектическому методу Эйлера заключается только в замене:

Position += velocity * dt; velocity += acceleration * dt;
на:

Velocity += acceleration * dt; position += velocity * dt;
Использование симплектического интегратора Эйлера при dt = 1 ⁄ 100 для системы пружинного амортизатора даёт стабильный результат, очень близкий к точному решению:

Даже несмотря на то, что симплектический метод Эйлера имеет ту же степень точности, что и явный метод (степень 1), при интегрировании уравнений движения мы получаем намного лучший результат, потому что оно является симплектическим .

Существует множество других методов интегрирования

И теперь нечто совершенно другое.

RK4 - это интегратор четвёртого порядка, то есть накапливаемая ошибка имеет порядок четвёртой производной. Это делает метод очень точным, гораздо более точным, чем явный и неявный методы Эйлера, имеющие только первый порядок.

Но хотя он более точен, нельзя сказать, что RK4 автоматически становится «лучшим» интегратором, или даже что он лучше симплектического метода Эйлера. Всё гораздо сложнее. Тем не менее, это довольно интересный интегратор и его стоит изучить.

Реализация RK4

Существует уже много объяснений математики, используемой в RK4. Например: , и . Я настоятельно рекомендую изучить его выведение и понять, как и почему он работает на математическом уровне. Но я понимаю, что целевая аудитория этой статьи - программисты, а не математики, поэтому мы здесь будем рассматривать только реализацию. Так что давайте приступим.

Прежде чем приступить, давайте зададим состояние объекта как struct в C++, чтобы можно было удобно хранить позицию и скорость в одном месте:

Struct State { float x; // позиция float v; // скорость };
Также нам нужна структура для хранения производных значений состояний:

Struct Derivative { float dx; // dx/dt = скорость float dv; // dv/dt = ускорение };
Теперь нам нужна функция для вычисления состояния физики из t в t+dt с помощью одного набора производных, а после этого для вычисления производных в новом состоянии:

Derivative evaluate(const State & initial, double t, float dt, const Derivative & d) { State state; state.x = initial.x + d.dx*dt; state.v = initial.v + d.dv*dt; Derivative output; output.dx = state.v; output.dv = acceleration(state, t+dt); return output; }
Функция ускорения управляет всей симуляцией. Давайте используем её в системе пружинного амортизатора и вернём ускорение для единичной массы:

Float acceleration(const State & state, double t) { const float k = 15.0f; const float b = 0.1f; return -k * state.x - b * state.v; }
То, что нужно здесь записать, разумеется, зависит от симуляции, но необходимо структурировать симуляцию таким образом, чтобы можно было вычислять ускорение внутри этого метода для заданных состояния и времени, в противном случае он не подойдёт для интегратора RK4.

Наконец, мы получаем саму процедуру интегрирования:

Void integrate(State & state, double t, float dt) { Derivative a,b,c,d; a = evaluate(state, t, 0.0f, Derivative()); b = evaluate(state, t, dt*0.5f, a); c = evaluate(state, t, dt*0.5f, b); d = evaluate(state, t, dt, c); float dxdt = 1.0f / 6.0f * (a.dx + 2.0f * (b.dx + c.dx) + d.dx); float dvdt = 1.0f / 6.0f * (a.dv + 2.0f * (b.dv + c.dv) + d.dv); state.x = state.x + dxdt * dt; state.v = state.v + dvdt * dt; }
Интегратор RK4 делает выборку производной в четырёх точках, чтобы определить кривизну. Заметьте, как производная a используется при вычислении b, b используется при вычислении c, и c для d. Эта передача текущей производной в вычисление следующей и даёт интегратору RK4 его точность.

Важно то, что каждая из этих производных a, b, c и d будет разной , когда темп изменения в этих величинах является функцией времени или функцией самого состояния. Например, в нашей системе пружинного амортизатора ускорение является функцией текущей позиции и скорости, которые меняются в шаге времени.

После вычисления четырёх производных наилучшая общая производная вычисляется как взвешенная сумма, полученная из разложения в ряд Тейлора . Эта комбинированная производная используется для перемещения позиции и скорости вперёд во времени, точно так же, как мы делали это в явном интеграторе Эйлера.

Сравнение симплектического метода Эйлера и RK4

Давайте подвергнем проверке интегратор RK4.

Очевидно, что поскольку он является интегратором более высокого порядка (четвёртый против первого) он наглядно будет более точен, чем симплектический метод Эйлера, правда?

Неправда . Оба интегратора так близки к точному результату, что при таком масштабе почти невозможно найти между ними разницу. Оба интегратора стабильны и очень хорошо повторяют точное решение при dt = 1 ⁄ 100 .

При увеличении видно, что RK4 действительно более точен, чем симплектический метод Эйлера, но стоит ли эта точность сложности и лишнего времени выполнения RK4? Трудно судить.

Давайте постараемся и посмотрим, сможем ли мы найти значительное различие между двумя интеграторами. К сожалению, мы не сможем долго наблюдать за этой системой, потому что она быстро затухает до нуля, поэтому давайте перейдём к простому гармоническому осциллятору , который колеблется бесконечно и без затуханий.

Вот точный результат, к которому мы будем стремиться:

Чтобы усложнить интеграторам задачу, давайте увеличим шаг времени до 0,1 секунды.

Теперь запустим интеграторы на 90 секунд и увеличим масштаб:

Через 90 секунд симплектический метод Эйлера (оранжевая кривая) сдвинулся по фазе относительно точного решения, потому что его частота немного отличалась, в то время как зелёная кривая RK4 соответствует частоте, но теряет энергию!

Мы чётко можем это заметить, увеличив шаг времени до 0,25 секунды.

RK4 сохраняет верную частоту, но теряет энергию:

А симплектический метод Эйлера в среднем намного лучше сохраняет энергию:

Но от сдвигается от фазы. Какой интересный результат! Как вы видите, если RK4 имеет более высокий порядок точности, то он не обязательно «лучше». В этом вопросе есть множество нюансов.

Заключение

Мы реализовали три различных интегратора и сравнили результаты.
  1. Явный метод Эйлера
  2. Симплектический метод Эйлера
  3. Метод Рунге-Кутты порядка 4 (RK4)
Так какой же интегратор стоит использовать в игре?

Если вам действительно нужна бОльшая точность, чем у симплектического метода Эйлера, я рекомендую посмотреть на симплектические интеграторы более высокого порядка, рассчитанные на

  • уравнения движения
  • Добавить метки

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

    Методы нахождения интегралов движения

    Существует несколько методов нахождения интегралов движения:

    • Наиболее простой, но и наименее строгий метод заключается в интуитивном подходе, часто основанном на экспериментальных данных и последующего математического доказательства сохранения величины.
    • Уравнение Гамильтона - Якоби предлагает строгий и прямой метод нахождения интегралов движения, особенно если гамильтониан принимает знакомую функциональную форму в ортогональных координатах .
    • Другой подход заключается в сопоставлении сохраняющейся величины и какой-либо симметрии Лагранжиана . Теорема Нётер даёт систематический способ вывода таких величин из симметрий. Например, закон сохранения энергии является результатом того, что лагранжиан не изменяется относительно сдвига по времени, закон сохранения импульса эквивалентен инвариантности лагранжиана относительно сдвига начала координат в пространстве (трансляционная симметрия ) и закон сохранения момента импульса следует из изотропности пространства (лагранжиан не меняется при поворотах системы координат). Обратное тоже верно: каждая симметрия лагранжиана соответствует интегралу движения.
    • Величина A сохраняется если она не зависит явным образом от времени и её скобки Пуассона с гамильтонианом системы равны нулю

    Другой полезный результат известен как теорема Пуассона , в которой утверждается, что если есть два интеграла движения A и B то скобки Пуассона {A ,B } этих двух величин тоже является интегралом движения.

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

    В квантовой механике

    Наблюдаемая величина Q сохраняется, если она коммутирует с гамильтонианом H , который не зависит явным образом от времени. Поэтому

    где используется коммутационное соотношение

    .

    Вывод

    Пусть имеется некоторая наблюдаемая Q , которая зависит от координаты, импульса и времени

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

    В итоге получим

    Отношение к квантовому хаосу и квантовой интегрируемости

    В классической механике имеется теорема Лиувилля , согласно которой система, в которой число интегралов движения в инволюции совпадает с числом степеней свободы n , может быть полностью проинтегрирована (решена) методом разделения переменных в уравнении Гамильтона-Якоби. Такая система является интегрируемой системой. Траектория такой системы в 2n -мерном фазовом пространстве может быть представлена в подходящих переменных (переменных действие-угол) как намотка на n -мерном торе. Системы, число интегралов в которой меньше числа степеней свободы, проявляет хаотическое поведение, то есть траектории в фазовом пространстве с близкими начальными условиями могут экспоненциально расходиться. При небольшой деформации интегрируемой системы в неинтегрируемую n -мерный тор в 2n -мерном фазовом пространстве разрушается («размывается»), превращаясь, например в странный аттрактор .

    Квантовый аналог теоремы Лиувилля неизвестен, однако и в квантовом случае системы можно разделить на интегрируемые и неинтегрируемые. Под интегрируемыми в этом случае подразумевают системы, которые допускают точное решение, в смысле возможности найти все собственные значения и собственные функции гамильтониана в разумном виде. Известен квантовый аналог метода разделения переменных, однако его применение не столь универсально в классических случаях. Изветсные примеры показывают, что в квантовых интегрируемых системах, также как и в классических, имеется n интегралов движения, коммутирующих между собой. Однако наличие n интегралов движения, по-видимому, ещё не гарантирует квантовой интегрируемости. Задача квантования интегрируемых систем представляет собой поиск такой квантовой системы, которая допускала бы точное решение и давала бы данную классическую систему в классическом пределе. Имеются также примеры интегрируемых квантовых систем, не имеющих интегрируемых классических аналогов. Это происходит в том случае, если система может быть решена при специальных значениях параметров квантового гамильтониана , либо когда система не допускает классического описания (как, например, система спинов).

    Все остальные квантовые системы проявляют в той или иной степени признаки квантового хаоса. Классические хаотические системы допускают квантование в том смысле, что может быть корректно определено их пространство состояний и гамильтониан, однако как и классические хаотические системы, так и квантовые, по-видимому, не допускают точного решения. Их можно исследовать приближёнными методами, такими как теория возмущений и вариационный метод, а также исследованы численно методами молекулярной динамики в классическом случае или численной диагонализации гамильтониана в квантовом случае.

    См. также

    Литература

    • Introduction to Quantum Mechanics (2nd ed.). - Prentice Hall, 2004. - ISBN ISBN 0-13-805326-X
    • Ландау, Л. Д. , Лифшиц, Е. М. Механика. - Издание 4-е, исправленное. - М .: Наука , 1988. - 215 с. - («Теоретическая физика» , том I). - ISBN 5-02-013850-9
    • Арнольд В. И. «Математические методы классической механики», из. 5-ое, М.:Едиториал УРСС, 2003, ISBN 5-354-00341-5

    Wikimedia Foundation . 2010 .

    Смотреть что такое "Интеграл движения" в других словарях:

      интеграл движения - judėjimo integralas statusas T sritis fizika atitikmenys: angl. integral of motion vok. Bewegungsintegral, n rus. интеграл движения, m pranc. intégrale de mouvement, f … Fizikos terminų žodynas

      Интеграл (см. также Первообразная, Численное интегрирование, Интегрирование по частям) математический оператор: Определённый интеграл Неопределённый интеграл различные определения интегралов: Интеграл расширение понятия суммы Интеграл Ито… … Википедия

      Интеграл Коши Лагранжа интеграл уравнений движения идеальной жидкости (уравнений Эйлера) в случае потенциальных течений. Содержание 1 Варианты названия 2 Историческая справка … Википедия

      Член в кинетическом уравнении Болъцмана, равный изменению ф ции распределения частиц (или квазичастиц) за единицу времени в элементе фазового объёма вследствие столкновений между ними; его наз. также оператором столкновений. И. с. равен (с… … Физическая энциклопедия

      Одно из центральных понятий математич. анализа и всей математики, возникновение к рого связано с двумя задачами: о восстановлении функции по ее производной (напр., с задачей об отыскании закона движения материальной точки вдоль прямой по… … Математическая энциклопедия

      Импульс (количество движения) аддитивный интеграл движения механической системы; соответствующий закон сохранения связан с фундаментальной симметрией однородностью пространства. Содержание 1 История появления термина 2 «Школьное» определение… … Википедия

      Формулировка через интеграл по траеториям квантовой механики это описание квантовой теории, которое обобщает принцип действия классической механики. Оно замещает классическое обозначение одиночной, уникальной траектории для системы суммой, или… … Википедия

      - (континуальный интеграл, интеграл по траекториям, фейнмановский интеграл по траекториям) запись или результат функционального интегрирования (интегрирования по траекториям). Находит наибольшее применение в квантовой физике (квантовой теории … Википедия

    • Перевод

    Симуляция физики делает небольшие предсказания на основании законов физики. Эти предсказания на самом деле достаточно просты, что-то вроде «если объект вот здесь и он движется с такой скоростью в этом направлении, то за краткий промежуток времени он окажется вот тут». Мы создаём такие предсказания с помощью математической техники под названием интегрирование.

    Темой этой статьи как раз и будет реализация такого интегрирования.

    Интегрирование уравнений движения

    Вы можете помнить из курса старшей школы или вуза, что сила равна произведению массы на ускорение.
    Преобразуем это уравнение и увидим, что ускорение равно силе, делённой на массу. Это соответствует нашим интуитивным ожиданиям, потому что тяжёлые объекты труднее бросать.
    Ускорение - это темп изменения скорости от времени:

    Аналогично, скорость - это темп изменения позиции от времени:


    Это значит, что если мы знаем текущие позицию и скорость объекта, а также приложенные к нему силы, то сможем проинтегрировать, чтобы найти его позицию и скорость в определённый момент времени.

    Численное интегрирование

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

    Вот как работает численное интегрирование: во-первых, начнём с исходной позиции и скорости, затем сделаем небольшой шаг вперёд, чтобы найти скорость и позицию в будущем. Затем повторим это, двигаясь вперёд небольшими шагами, используя результат предыдущих вычислений как исходную точку следующих.

    Но как нам найти изменение скорости и позиции на каждом шаге?

    Ответ лежит в уравнениях движения .

    Давайте назовём наше текущее время t , а шаг времени dt или «delta time».

    Теперь мы можем представить уравнения движения в понятном всем виде:

    Ускорение = сила / масса изменение позиции = скорость * dt изменение скорости = ускорение * dt
    Интуитивно это понятно: если вы находитесь в автомобиле, движущемся со скоростью 60 км/ч, то за один час вы проедете 60 км. Аналогично, автомобиль, ускоряющийся на 10 км/ч в секунду, через 10 секунд будет двигаться на 100 км/ч быстрее.

    Разумеется, эта логика сохраняется, только когда ускорение и скорость постоянны. Но даже если они меняются, то это для начала вполне неплохая аппроксимация.

    Давайте представим это в коде. Начнём с стационарного объекта массой один килограмм и приложим к нему постоянную силу в 10 кН (килоньютонов) и сделаем шаг вперёд, принимая, что один временной шаг равен одной секунде:

    Double t = 0.0; float dt = 1.0f; float velocity = 0.0f; float position = 0.0f; float force = 10.0f; float mass = 1.0f; while (t <= 10.0) { position = position + velocity * dt; velocity = velocity + (force / mass) * dt; t += dt; }
    Вот каким будет результат:

    T=0: position = 0 velocity = 0 t=1: position = 0 velocity = 10 t=2: position = 10 velocity = 20 t=3: position = 30 velocity = 30 t=4: position = 60 velocity = 40 t=5: position = 100 velocity = 50 t=6: position = 150 velocity = 60 t=7: position = 210 velocity = 70 t=8: position = 280 velocity = 80 t=9: position = 360 velocity = 90 t=10: position = 450 velocity = 100
    Как вы видите, на каждом шаге мы знаем и позицию, и скорость объекта. Это и есть численное интегрирование.

    Явный метод Эйлера

    Вид интегрирования, который мы только что использовали, называется явным методом Эйлера .

    Он назван в честь швейцарского математика Леонарда Эйлера , впервые открывшего эту технику.

    Интегрирование Эйлера - это простейшая техника численного интегрирования. Она точна на 100% только когда темп изменений в течение шага времени постоянен.

    Поскольку в примере выше ускорение постоянно, интегрирование скорости выполняется без ошибок. Однако мы ещё интегрируем и скорость для получения позиции, а скорость увеличивается из-за ускорения. Это значит, что в проинтегрированной позиции возникает ошибка.

    Но насколько велика эта ошибка? Давайте выясним!

    Существует аналитическое решение движения объекта при постоянном ускорении. Мы можем использовать его, чтобы сравнить численно интегрированную позицию с точным результатом:

    S = ut + 0.5at^2 s = 0.0*t + 0.5at^2 s = 0.5(10)(10^2) s = 0.5(10)(100) s = 500 метров
    Через 10 секунд объект должен был переместиться на 500 метров, но явным метод Эйлера даёт нам результат 450. То есть погрешность в целых 50 метров всего за 10 секунд!

    Кажется, что это невероятно плохо, но в играх обычно для шага физики берётся не такой большой временной интервал. На самом деле, физика обычно вычисляется с частотой, примерно равной частоте кадров дисплея.

    Если задать шаг dt = 1 ⁄ 100 , то мы получим гораздо лучший результат:

    T=9.90: position = 489.552155 velocity = 98.999062 t=9.91: position = 490.542145 velocity = 99.099060 t=9.92: position = 491.533142 velocity = 99.199059 t=9.93: position = 492.525146 velocity = 99.299057 t=9.94: position = 493.518127 velocity = 99.399055 t=9.95: position = 494.512115 velocity = 99.499054 t=9.96: position = 495.507111 velocity = 99.599052 t=9.97: position = 496.503113 velocity = 99.699051 t=9.98: position = 497.500092 velocity = 99.799049 t=9.99: position = 498.498077 velocity = 99.899048 t=10.00: position = 499.497070 velocity = 99.999046
    Как вы видите, это достаточно хороший результат, определённо вполне достаточный для игры.

    Почему явный метод Эйлера не (всегда) так уж хорош

    С достаточно малым шагом времени явный метод Эйлера при постоянном ускорении даёт вполне достойные результаты, но что будет, если ускорение не постоянно?

    Хорошим примером переменного ускорения является система пружинного амортизатора .

    В этой системе масса присоединена к пружине, и её движение гасится чем-то вроде трения. Существует сила, пропорциональная расстоянию до объекта, которая притягивает его к исходной точке, и сила, пропорциональная скорости объекта, но направленная в противоположном направлении, которая замедляет его.

    Здесь ускорение в течение шага времени совершенно точно изменяется, но эта постоянно меняющаяся функция является сочетанием позиции и скорости, которые сами постоянно изменяются за шаг времени.

    В большинстве коммерческих игровых физических движков используется этот интегратор.

    Переход от явного к симплектическому методу Эйлера заключается только в замене:

    Position += velocity * dt; velocity += acceleration * dt;
    на:

    Velocity += acceleration * dt; position += velocity * dt;
    Использование симплектического интегратора Эйлера при dt = 1 ⁄ 100 для системы пружинного амортизатора даёт стабильный результат, очень близкий к точному решению:

    Даже несмотря на то, что симплектический метод Эйлера имеет ту же степень точности, что и явный метод (степень 1), при интегрировании уравнений движения мы получаем намного лучший результат, потому что оно является симплектическим .

    Существует множество других методов интегрирования

    И теперь нечто совершенно другое.

    RK4 - это интегратор четвёртого порядка, то есть накапливаемая ошибка имеет порядок четвёртой производной. Это делает метод очень точным, гораздо более точным, чем явный и неявный методы Эйлера, имеющие только первый порядок.

    Но хотя он более точен, нельзя сказать, что RK4 автоматически становится «лучшим» интегратором, или даже что он лучше симплектического метода Эйлера. Всё гораздо сложнее. Тем не менее, это довольно интересный интегратор и его стоит изучить.

    Реализация RK4

    Существует уже много объяснений математики, используемой в RK4. Например: , и . Я настоятельно рекомендую изучить его выведение и понять, как и почему он работает на математическом уровне. Но я понимаю, что целевая аудитория этой статьи - программисты, а не математики, поэтому мы здесь будем рассматривать только реализацию. Так что давайте приступим.

    Прежде чем приступить, давайте зададим состояние объекта как struct в C++, чтобы можно было удобно хранить позицию и скорость в одном месте:

    Struct State { float x; // позиция float v; // скорость };
    Также нам нужна структура для хранения производных значений состояний:

    Struct Derivative { float dx; // dx/dt = скорость float dv; // dv/dt = ускорение };
    Теперь нам нужна функция для вычисления состояния физики из t в t+dt с помощью одного набора производных, а после этого для вычисления производных в новом состоянии:

    Derivative evaluate(const State & initial, double t, float dt, const Derivative & d) { State state; state.x = initial.x + d.dx*dt; state.v = initial.v + d.dv*dt; Derivative output; output.dx = state.v; output.dv = acceleration(state, t+dt); return output; }
    Функция ускорения управляет всей симуляцией. Давайте используем её в системе пружинного амортизатора и вернём ускорение для единичной массы:

    Float acceleration(const State & state, double t) { const float k = 15.0f; const float b = 0.1f; return -k * state.x - b * state.v; }
    То, что нужно здесь записать, разумеется, зависит от симуляции, но необходимо структурировать симуляцию таким образом, чтобы можно было вычислять ускорение внутри этого метода для заданных состояния и времени, в противном случае он не подойдёт для интегратора RK4.

    Наконец, мы получаем саму процедуру интегрирования:

    Void integrate(State & state, double t, float dt) { Derivative a,b,c,d; a = evaluate(state, t, 0.0f, Derivative()); b = evaluate(state, t, dt*0.5f, a); c = evaluate(state, t, dt*0.5f, b); d = evaluate(state, t, dt, c); float dxdt = 1.0f / 6.0f * (a.dx + 2.0f * (b.dx + c.dx) + d.dx); float dvdt = 1.0f / 6.0f * (a.dv + 2.0f * (b.dv + c.dv) + d.dv); state.x = state.x + dxdt * dt; state.v = state.v + dvdt * dt; }
    Интегратор RK4 делает выборку производной в четырёх точках, чтобы определить кривизну. Заметьте, как производная a используется при вычислении b, b используется при вычислении c, и c для d. Эта передача текущей производной в вычисление следующей и даёт интегратору RK4 его точность.

    Важно то, что каждая из этих производных a, b, c и d будет разной , когда темп изменения в этих величинах является функцией времени или функцией самого состояния. Например, в нашей системе пружинного амортизатора ускорение является функцией текущей позиции и скорости, которые меняются в шаге времени.

    После вычисления четырёх производных наилучшая общая производная вычисляется как взвешенная сумма, полученная из разложения в ряд Тейлора . Эта комбинированная производная используется для перемещения позиции и скорости вперёд во времени, точно так же, как мы делали это в явном интеграторе Эйлера.

    Сравнение симплектического метода Эйлера и RK4

    Давайте подвергнем проверке интегратор RK4.

    Очевидно, что поскольку он является интегратором более высокого порядка (четвёртый против первого) он наглядно будет более точен, чем симплектический метод Эйлера, правда?

    Неправда . Оба интегратора так близки к точному результату, что при таком масштабе почти невозможно найти между ними разницу. Оба интегратора стабильны и очень хорошо повторяют точное решение при dt = 1 ⁄ 100 .

    При увеличении видно, что RK4 действительно более точен, чем симплектический метод Эйлера, но стоит ли эта точность сложности и лишнего времени выполнения RK4? Трудно судить.

    Давайте постараемся и посмотрим, сможем ли мы найти значительное различие между двумя интеграторами. К сожалению, мы не сможем долго наблюдать за этой системой, потому что она быстро затухает до нуля, поэтому давайте перейдём к простому гармоническому осциллятору , который колеблется бесконечно и без затуханий.

    Вот точный результат, к которому мы будем стремиться:

    Чтобы усложнить интеграторам задачу, давайте увеличим шаг времени до 0,1 секунды.

    Теперь запустим интеграторы на 90 секунд и увеличим масштаб:

    Через 90 секунд симплектический метод Эйлера (оранжевая кривая) сдвинулся по фазе относительно точного решения, потому что его частота немного отличалась, в то время как зелёная кривая RK4 соответствует частоте, но теряет энергию!

    Мы чётко можем это заметить, увеличив шаг времени до 0,25 секунды.

    RK4 сохраняет верную частоту, но теряет энергию:

    А симплектический метод Эйлера в среднем намного лучше сохраняет энергию:

    Но от сдвигается от фазы. Какой интересный результат! Как вы видите, если RK4 имеет более высокий порядок точности, то он не обязательно «лучше». В этом вопросе есть множество нюансов.

    Заключение

    Мы реализовали три различных интегратора и сравнили результаты.
    1. Явный метод Эйлера
    2. Симплектический метод Эйлера
    3. Метод Рунге-Кутты порядка 4 (RK4)
    Так какой же интегратор стоит использовать в игре?

    Если вам действительно нужна бОльшая точность, чем у симплектического метода Эйлера, я рекомендую посмотреть на симплектические интеграторы более высокого порядка, рассчитанные на Добавить метки



    Последние материалы раздела:

    Изменение вида звездного неба в течение суток
    Изменение вида звездного неба в течение суток

    Тема урока «Изменение вида звездного неба в течение года». Цель урока: Изучить видимое годичное движение Солнца. Звёздное небо – великая книга...

    Развитие критического мышления: технологии и методики
    Развитие критического мышления: технологии и методики

    Критическое мышление – это система суждений, способствующая анализу информации, ее собственной интерпретации, а также обоснованности...

    Онлайн обучение профессии Программист 1С
    Онлайн обучение профессии Программист 1С

    В современном мире цифровых технологий профессия программиста остается одной из самых востребованных и перспективных. Особенно высок спрос на...