Совместное использование языков программирования высокого уровня и математических библиотек

Традиционный подход. Используются: 1) подходящий (любимый) язык программирования (Fortran, C, C++, Matlab, Python, ...), 2) библиотеки для численного интегрирования дифференциальных уравнений, систем линейных уравнений и т. п., и 3) средства визуализации результатов.

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

Системы символьного моделирования

Основное назначение систем символьного моделирования (или, как их еще называют, систем компьютерной алгебры) — преобразование формул. Работа с такими системами имеет ряд особенностей по сравнению с использованием средств, ориентированных на выполнение численных расчетов.

  • Применение систем символьного моделирования может начаться «раньше», чем станет возможным традиционное программирование, — на этапе записи уравнений движения и выражений основных сил и моментов в векторном виде. Причем записанные выражения можно использовать в дальнейших преобразованиях.
  • Вывод уравнений движения в матричном виде и приведение их к виду, удобному для численного интегрирования осуществляются не на бумаге, а с помощью процедур на языке конкретной системы символьного моделирования. Эти процедуры необходимо разработать самостоятельно. Однако затраченное на это время окупается при проведении многократных расчетов, требующих внесения изменений в модель.
  • При традиционном программировании, последовательность выполнения команд, реализующих математические выражения, диктуется логикой вычислений: чтобы получить численное значение выражения, необходимо вычислить значения всех входящих в него величин. В системе символьного моделирования можно реализовать другой подход, более близкий к работе исследователя «с карандашом и бумагой»: вначале записываются наиболее общие уравнения, затем входящие в них величины расписываются подробно, делаются оценки и упрощения, результаты которых подставляются в исходные уравнения. Можно сказать, что численные расчеты выполняются «от частного к общему», тогда как системы символьного моделирования позволяют выполнять расчеты «от общего к частному» (системы символьного моделирования позволяют кроме того выполнять и обычные численные расчеты).
  • Системы символьного моделирования позволяют конвертировать полученные с их помощью уравнения в программный код на языке программирования высокого уровня (C, Fortran, MATLAB). Таким образом, может оказаться удобным использовать системы символьного и численного моделирования совместно.

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

Пакеты физического моделирования

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

Среди пакетов физического моделирования есть те, которые специализируются на расчетах динамики систем твердых тел (например, «Универсальный механизм», MBDyn) и мультидоменные (принятый на сегодняшний день перевод англоязычного термина «multidomain»). Последние предназначены для моделирования систем, состоящие из элементов, относящихся к разным областям науки и техники. Это позволяет исследовать «целиком» такие системы как электродвигатель, состоящий из электрических и механических элементов (блоков).

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

На языке Modelica система, описываемая уравнением

{

$$\dot{x} =-cx$$

}

записывается так:

model FirstOrder
  parameter Real c=1 "Time constant";
  Real x "An unknown";
equation
  der(x) = -c*x "A first order differential equation";
end FirstOrder; 

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

  • Bodies and Frames (Тела и системы отсчета) — для моделирования систем отсчета, абсолютно твердых тел и гибких балок;
  • Forces and Moments (Силы и моменты) — имитируют кинематические пары, образованные телами рассматриваемой системы;
  • Joints and Motions (Связи и виды перемещений) — для имитации приложенных к системе внешних сил и моментов;
  • Sensors (Датчики) — для имитации измерительных устройств параметров движения;
  • Visualization (Визуализация) — имитируют внешний вид системы.

Наличие стандарта упрощает перенос схем между пакетами. Интересно, что графическое изображение систем (квадратик с картинкой) также стандартизировано, поэтому разобравшись с одним пакетом, использующим Modelica, другой можно освоить по аналогии.

Modelica, как стандартный язык программирования, свободна и создается некоммерческой организацией. Однако компиляторы программ на ней могут быть проприетарными (платными и распространятся с закрытым исходным кодом), как, например, Dymola или свободными, как OpenModelica.

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

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

Физические движки

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

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

Моделирование с помощью физического движка начинается с создания виртуального пространства — «мира», в который помещаются частицы и тела. Тела могут быть твердыми или «мягкими» (soft body), с заданными характеристиками движения и массой. Кроме того, каждому телу присваивается определенная форма (collision shape), которая потом используется при анализе столкновений.

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

По окончании расчетов выполняется «уборка мусора»: удаляются созданные связи, тела и др. объекты.

Шаг расчета по времени состоит из этапов обнаружения столкновений (collision detection) и учета их влияния на движение тел.

Обнаружение столкновений тел состоит из широкой и узкой фаз (broadphase и narrowphase). Во время широкой фазы алгоритм обнаружения столкновений находит пары потенциально взаимодействующих объектов. При этом используется упрощенная геометрия системы, например, тела заменяются выровненными по осям ограничивающими параллелепипедами (axis aligned bounding box). Далее наступает черед узкой фазы, во время которой движок должен определить реальные точки контакта тел, нормали и глубины проникновения. Узкая фаза обычно значительно «дороже» в вычислительном плане, чем широкая, поэтому от эффективности выполнения широкой фазы во многом зависит производительность движка при большом количестве тел.

Учетом обнаруженных столкновений (resolve collisions) занимается подсистема движка, называемая «решателем» (solver). В задачу решателя входит вычисление скоростей тел после столкновения, и коррекция их положений во избежание проникновения друг в друга.

На завершающем этапе происходит вычисление новых координат и скоростей тел. Для этого используются традиционные методы численного решения обыкновенных дифференциальных уравнений, в частности, методы Эйлера-Кромера, Верле и Рунге-Кутты. Следует отметить, что для большинства физических движков скорость выполнения расчетов важнее их точности. Поэтому, в частности, во многих движках используются методы численного интегрирования не выше 2-го порядка. Однако, для свободных движков этот недостаток легко исправить подключением дополнительных математических библиотек.



Комментарии

comments powered by Disqus