Прямое интегрирование уравнений движения scad

Прямое численное интегрирование нелинейных уравнений движения

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

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

Прямое интегрирование уравнений движения scad

Необходимо определить узловые перемещения, скорости и ускорения, момент времени t+∆t, для которых также должно выполнятся равенство

Прямое интегрирование уравнений движения scad

Вычтя (2.75) из (2.76) и разложив полученное выражение в ряд Тейлора полу­чим уравнение движения в приращениях, полагая ∆tмалым и пренебрегая сла­гаемыми со степенями ∆ 2 и выше

Прямое интегрирование уравнений движения scad

По сути, выражение (2.79) представляет собой линеаризованное в момент времени t+∆tуравнение движения геометрически нелинейной системы (2.76). Благодаря аналогии с уравнением движения линейной системы, решение для приращений перемещений, скоростей и ускорений в (2.79) для момента t+∆t может быть получено с помощью методов прямого интегрирования, исполь­зуемых для интегрирования линейных систем. Так в работе [357] при числен­ном интегрировании нелинейных уравнений для аппроксимации ускорений и скоростей были использованы формулы линейного метода Ньюмарка (метода среднего ускорения).

Прямое интегрирование уравнений движения scad

где а и β- параметры метода Ньюмарка.

Согласно методу Ньюмарка векторы узловых скоростей и узловых ускоре­ний в момент времени t+Δ∕ определяются по формулам

Прямое интегрирование уравнений движения scad

Подставив (2.81) в уравнения движения (2.79) после преобразований получим

Прямое интегрирование уравнений движения scad

где эффективная матрица жесткости и вектор эффективной нагрузки имеют вид

Прямое интегрирование уравнений движения scad

Получив решение уравнения (2.82) можно вычислить узловые перемещения в момент времени /+Δ/

Прямое интегрирование уравнений движения scad

Полученное решение линеаризованного уравнения движения (2.79) при его подстановке в нелинейное уравнение (2.76) не будет обращать его в равенство. При этом появится вектор сил невязки ∆ уравнения (2.76) вида

Прямое интегрирование уравнений движения scad

Очевидно, что решением уравнения (2.76) будут те узловые перемещения, ско­рости и ускорения, при которых вектор сил невязки в (2.86) обращается в ноль. Для получения нужного решения с заданной погрешностью необходимо ис­пользовать итерационные методы. Наиболее эффективным с вычислительной точки зрения является модифицированный метод Ньютона-Рафсона [238,239].

Прямое численное интегрирование нелинейных уравнений движения пред­лагается производить неявным методом Ньюмарка в сочетании с итерационным модифицированным методом Ньютона-Рафсона [66, 238, 239]. Начальные при­ближения значений ускорений, скоростей и приращений на первой итерации 123

вычисляются из (2.82) и (2.81).

Приведем алгоритм методики прямого численного интегрирования уравне­ний движения геометрически нелинейной системы:

1) . Предполагаем, что для момента времени / известны начальные условия

Прямое интегрирование уравнений движения scadудовлетворяющие уравнению равновесия (2.75).

2) . Вычислим матрицу касательной жесткостиПрямое интегрирование уравнений движения scadи вектор

упругих сил системы Прямое интегрирование уравнений движения scad

3) . Используя аппроксимации метода Ньюмарка для момента времени /+Δ/ по формулам (2.83) и (2.84) вычислим эффективную матрицу жесткости Прямое интегрирование уравнений движения scad

и вектор эффективной нагрузкиПрямое интегрирование уравнений движения scad. Из решения уравнения (2.82) полу­чим начальное значение приращений перемещенийПрямое интегрирование уравнений движения scad(верхний индекс

обозначает номер итерации по методу Ньютона-Рафсона).

4) . Из (2.85) получим узловые перемещенияПрямое интегрирование уравнений движения scadИспользуя выражение

(2.81) получим узловые скоростиПрямое интегрирование уравнений движения scadи ускорения Прямое интегрирование уравнений движения scad

вектор невязки ∆* и если он удовлетворяет условию сходимости, то на­чинаем новый шаг во времениПрямое интегрирование уравнений движения scadи переходим к шагу № 2.

6) . Если условие сходимости не удовлетворено, то вычисляем корректирую­щую поправку приращений перемещений ∆ a по формуле

Прямое интегрирование уравнений движения scad

гдеПрямое интегрирование уравнений движения scad— эффективная матрица жесткости, вычисленная на шаге № 3. Ис­пользуя поправку, корректируем приращения перемещений по формуле

Прямое интегрирование уравнений движения scad

7) . Переходим к следующей итерации для момента времени /+Δ/ — шаг ал­горитма № 4.

Итерации для момента времени /+Δ/ (шаги алгоритма с №№ 4 по 7) повто- 124

ряются до тех пор, пока условия сходимости не будут удовлетворены (шаг № 5). Подобная итерационная схема называется модифицированным методом Ньютона-Рафсона [238, 239], поскольку эффективная матрица жесткости в вы­ражении (2.87) вычисляется только один раз на начальной итерации и остается постоянной на всем временном шаге. Это приводит к снижению вычислитель­ных затрат (треугольное разложение матрицы также делается лишь один раз), но приводит к линейной скорости сходимости итерационной схемы, по сравне­нию с квадратичной скоростью сходимости полного метода Ньютона-Рафсона.

Аналогичная неявная методика численного интегрирования может быть по­лучена с использованием аппроксимирующих формул 0-метода Вилсона. Ос­новным отличием методики на основе 0-метода Вилсона является то, что в ней ищется решение, удовлетворяющее уравнениям равновесия не в момент време­ни t+∆t, а в момент времени ∕+θ∆t, где θ> 1 — параметр метода Вилсона.

Представленный выше алгоритм в случае методики на основе 0-метода Вилсона изменится следующим образом:

• Все индексы переменных, связанные с t+∆tменяются на t + θ∆t.

• Аппроксимирующие формулы (2.81) заменяются следующими

Прямое интегрирование уравнений движения scad

• Константы интегрирования а0. ,а& вычисляются по формулам

Прямое интегрирование уравнений движения scad

• Когда итерационный процесс сошелся к значениям приращений перемеще­нийПрямое интегрирование уравнений движения scad, удовлетворяющим

уравнения динамического равновесия в момент времениПрямое интегрирование уравнений движения scadс заданной

погрешностью (шаг №5), то после этого вычисляются те же вектора для момента времени t+∆tпри помощи следующих выражений

Прямое интегрирование уравнений движения scad

Было проведено исследование точности предлагаемой методики динамического 125

анализа в зависимости от параметров интегрирования, временного шага Δ/, степе­ни нелинейности, вида нелинейной упругой характеристики («жесткой», «мягкой») , величины и характера возмущающей силы. Полученные результаты указывают на хорошую точность и работоспособность исследуемых методик численного интег­рирования нелинейных уравнений движения, причем методика на основе метода Ньюмарка более точна и требует меньших вычислительных затрат, т.к. не требует дополнительного пересчета решения для момента времени t + Δ t.

Видео:О прямой нелинейной динамике Фиалко С.Ю.Скачать

О прямой нелинейной динамике Фиалко С.Ю.

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

Прямое интегрирование уравнений движения scad

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

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

Видео:Быстрое решение нелинейных статических задач в SCAD++Скачать

Быстрое решение нелинейных статических задач в SCAD++

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

Вы можете помнить из курса старшей школы или вуза, что сила равна произведению массы на ускорение.

Прямое интегрирование уравнений движения scad

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

Прямое интегрирование уравнений движения scad

Ускорение — это темп изменения скорости от времени:

Прямое интегрирование уравнений движения scad

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

Прямое интегрирование уравнений движения scad

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

Видео:Прямая и обратная задачи динамики. Интегрирование уравнений движения | ЛекториумСкачать

Прямая и обратная задачи динамики. Интегрирование уравнений движения | Лекториум

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

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

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

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

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

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

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

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

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

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

Вот каким будет результат:

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

Видео:ИНТЕГРИРОВАНИЕ УРАВНЕНИЙ ДВИЖЕНИЯ. 2- модульСкачать

ИНТЕГРИРОВАНИЕ УРАВНЕНИЙ ДВИЖЕНИЯ. 2- модуль

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

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

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

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

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

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

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

Через 10 секунд объект должен был переместиться на 500 метров, но явным метод Эйлера даёт нам результат 450. То есть погрешность в целых 50 метров всего за 10 секунд!

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

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

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

Видео:Новые возможности SCAD++Скачать

Новые возможности SCAD++

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

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

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

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

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

Вот пример гармонического осциллятора с затуханием. Это хорошо изученная задача, и для него существует аналитическое решение, которое можно использовать для проверки результата численного интегрирования.

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

Вот входные параметры системы масса-пружина:

  • Масса: 1 килограмм
  • Исходная позиция: 1000 метров от исходной точки
  • Коэффициент упругости по закону Гука: k = 15
  • Коэффициент затухания по закону Гука: b = 0.1

И вот график точного решения:

Прямое интегрирование уравнений движения scad

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

Прямое интегрирование уравнений движения scad

Вместо затухания и сближения с исходной точкой, система со временем набирает энергию!

При интегрировании явным методом Эйлера и с dt= 1 ⁄100 такая система нестабильна.

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

Видео:Нелинейные расчеты на МРЗ в SCAD++Скачать

Нелинейные расчеты на МРЗ в SCAD++

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

Мы можем рассмотреть ещё один интегратор — симплектический метод Эйлера.

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

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

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

Прямое интегрирование уравнений движения scad

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

Видео:Расчет на прогрессирующее обрушение квазистатическим и динамическим методами в SCADСкачать

Расчет на прогрессирующее обрушение квазистатическим и динамическим методами в SCAD

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

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

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

Интегрирование Верле обеспечивает бо́льшую точность, чем неявный метод Эйлера, и требует меньше памяти при симуляции большого числа частиц. Это интегратор второй степени, который тоже является симплектическим.

Существует целое семейство интеграторов, называемое методами Рунге-Кутты. На самом деле, явный метод Эйлера считается частью этого семейства, но в него входят интеграторы и более высокого порядка, самым классическим из которых является метод Рунге-Кутты порядка 4 (Runge Kutta order 4) или просто RK4.

Это семейство интеграторов названо в честь открывших их немецких физиков: Карла Рунге и Мартина Кутты.

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

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

Видео:Опыт расчетов на прогрессирующее обрушение и на сейсмическое воздействие в SCAD++Скачать

Опыт расчетов на прогрессирующее обрушение и на сейсмическое воздействие в SCAD++

Реализация RK4

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

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

Также нам нужна структура для хранения производных значений состояний:

Теперь нам нужна функция для вычисления состояния физики из t в t+dt с помощью одного набора производных, а после этого для вычисления производных в новом состоянии:

Функция ускорения управляет всей симуляцией. Давайте используем её в системе пружинного амортизатора и вернём ускорение для единичной массы:

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

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

Интегратор RK4 делает выборку производной в четырёх точках, чтобы определить кривизну. Заметьте, как производная a используется при вычислении b, b используется при вычислении c, и c для d. Эта передача текущей производной в вычисление следующей и даёт интегратору RK4 его точность.

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

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

Видео:Реализация изменения № 1 к СП 14.13330.2018 в SCAD++. Выявленные проблемы и положительные изменения.Скачать

Реализация изменения № 1 к СП 14.13330.2018 в SCAD++. Выявленные проблемы и положительные изменения.

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

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

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

Прямое интегрирование уравнений движения scad

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

Прямое интегрирование уравнений движения scad

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

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

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

Прямое интегрирование уравнений движения scad

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

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

Прямое интегрирование уравнений движения scad

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

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

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

Прямое интегрирование уравнений движения scad

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

Прямое интегрирование уравнений движения scad

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

Видео:Расчеты на сейсмическое воздействие прямым динамическим методом в нелинейной постановкеСкачать

Расчеты на сейсмическое воздействие прямым динамическим методом в нелинейной постановке

Заключение

Мы реализовали три различных интегратора и сравнили результаты.

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

Так какой же интегратор стоит использовать в игре?

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

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

И наконец, если вы всё ещё пишете в игре такое:

То потратьте секунду и замените эти строки на:

🔍 Видео

Нелинейные расчеты на МРЗ в SCAD++Скачать

Нелинейные расчеты на МРЗ в SCAD++

Динамический расчет рамы в SCAD Office | Модальный анализСкачать

Динамический расчет рамы в SCAD Office | Модальный анализ

051120_Вебинар «Новые возможности SCAD++»Скачать

051120_Вебинар «Новые возможности SCAD++»

Видеоуроки по SCAD Office 11.5. 5-й Урок. Нагрузки в Scad. Как задавать?Скачать

Видеоуроки по SCAD Office 11.5. 5-й Урок. Нагрузки в Scad. Как задавать?

Вебинар «Ответы на типовые вопросы по результатам техподдержки пользователей SCAD Office. Эпизод 4»Скачать

Вебинар «Ответы на типовые вопросы по результатам техподдержки пользователей SCAD Office. Эпизод 4»

Видеоуроки по SCAD Office 11.5. 6-й Урок. Ветровая нагрузка. Как задавать?Скачать

Видеоуроки по SCAD Office 11.5. 6-й Урок. Ветровая нагрузка. Как задавать?

Новые возможности SCAD++ по расчетам на прогрессирующее обрушение прямым динамическим методомСкачать

Новые возможности SCAD++ по расчетам на прогрессирующее обрушение прямым динамическим методом

Нелинейные расчеты на МРЗ в SCAD++Скачать

Нелинейные расчеты на МРЗ в SCAD++
Поделиться или сохранить к себе: