Детерминированное моделирование мира с помощью GEKKO

Мягкое руководство по решению дифференциально-алгебраических уравнений и применению динамической оптимизации

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

Детерминированное моделирование является противоположностью моделированию со случайностью. Это метод упрощения определенных аспектов процесса моделирования путем устранения беспорядка, привносимого реальным миром. Эти модели носят идеалистический характер, а это означает, что они представляют собой идеальное решение, основанное на конкретных предположениях. Эти предположения могут основываться на наборе самоуверенных, вероятностных или обобщенных правил и предполагают, что между входными и выходными данными существует четко определенная закономерность. Хотя это может показаться похожим на моделирование со стохастическими данными, основное отличие состоит в том, что модель теперь определяется этими предопределенными предположениями, а не обучающими данными. Теперь у вас может возникнуть вопрос: «ну, если я не обучаю модель на данных, откуда я беру эти предположения для модели?». Ответ на этот вопрос довольно прост, но иногда упускается из виду: знание предметной области. Знание предметной области – это набор правил и концепций, известных по определенной теме. Именно благодаря знанию предметной области выводятся предположения, служащие основой для детерминированного моделирования. На любом языке программирования эти детерминированные модели могут быть написаны с использованием пользовательского кода, но по мере того, как модели становятся более сложными, создаются библиотеки, специально предназначенные для решения этой задачи. В Python будет рассмотрена одна такая библиотека под названием GEKKO.

GEKKO — это библиотека Python, упрощающая выполнение расширенного монитора процессов языка моделирования (APMonitor). Он предлагает ряд возможностей и функций, адаптированных к потребностям детерминированного моделирования, облегчающих создание и анализ сложных моделей. Он может решать как смешанные целочисленные, так и дифференциальные алгебраические уравнения и сочетается с крупномасштабными решателями для линейного, квадратичного, нелинейного и смешанного целочисленного программирования. GEKKO имеет 9 типов задач, с помощью которых можно определить настройку детерминированной модели. Однако в этой статье будет рассматриваться только оценка с подвижным горизонтом (MHE), которая одновременно решает все уравнения. Режим MHE используется для оценки состояний динамической системы путем минимизации несоответствия между измеренными выходными данными и прогнозами модели, сформулированными задачей оптимизации с целью. Это делается путем применения рекурсивной оценки или оценки скользящего окна.

Вау! Это было довольно много жаргона, но вскоре все должно стать понятным на следующем практическом примере.

Космический полет — невероятное достижение человечества. Отправка в космос чего-то рукотворного — это чудо техники и изобретательности. Но отправить что-то в космос довольно дорого. Таким образом, создание ракет с уверенностью в их способности работать так, как ожидается, имеет решающее значение. Сбор данных о реальных запусках в реальном времени помогает улучшить характеристики будущей ракеты. Но до этого нужно было запустить ракету, чтобы получить данные, и в этом проблема. Нет стохастических данных, нет стохастической модели. Введите детерминированную модель и GEKKO. Предположения для детерминированной модели ракеты — это, как вы уже догадались, ракетостроение! То есть, даже не запуская ракету на расстоянии одного дюйма от земли, мы можем вместо этого использовать законы физики, чтобы определить, как конкретная ракетная установка будет работать в идеалистическом сценарии. Например, давайте воспроизведем установку ракеты SpaceX Falcon 1 Stage 1 с помощью GEKKO.

Для начала давайте воспользуемся общеизвестной информацией [1][2] для установки ракеты Falcon 1 Stage 1 и начнем с определения некоторых констант моделирования и известных значений.

Теперь мы действительно можем начать с интересных вещей в GEKKO. Поскольку мы работаем с временным моделированием, давайте сначала определим наши компоненты времени:

  • Время полета ракеты составит 200 секунд.
  • Время горения топлива известно 161,6 секунды.
  • И дополнительный компонент времени, который можно использовать позже

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

  • масса
  • Расстояние
  • Скорость
  • Сила, создаваемая тягой
  • Дополнительная фиктивная переменная времени для использования позже

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

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

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

Ух ты! Это базовая физика, скорость объекта — это просто изменение расстояния во времени. Далее давайте добавим силу сопротивления, которую будет испытывать ракета при движении по воздуху, P.S. это такое сопротивление.

Теперь мы можем установить другое соотношение между силой и скоростью. Помнить,

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

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

Последнее предположение заключается в том, что на самом деле происходит, когда топливо полностью израсходовано. Это довольно круто, потому что это логичное утверждение, и у GEKKO тоже есть что-то для этого.

Когда все это сделано, теперь мы можем собрать все части вместе и построить нашу детерминированную модель.

Обратите внимание, что в приведенном выше коде есть некоторые дополнительные вещи, которые не были упомянуты. Сначала было вызвано фиктивное уравнение времени, чтобы отслеживать время, когда заканчивается топливо. Далее использовалась цель оптимизации. Почему это было сделано? Что ж, MHE решает задачу, в данном случае попытаться достичь наибольшей высоты ракеты над землей на каждом временном шаге. Вы можете попробовать другие целевые функции в зависимости от того, для чего вы хотите оптимизировать (например, дайте m.fix_final(h, 50e3), а затем m.Obj(thrust*v), чтобы попытаться экономить ракетный сок). И последнее, что GEKKO распечатает, удалось ли симуляции найти оптимальное решение или нет. В этом моделировании вы увидите, что на самом деле у нас были отрицательные степени свободы. Это особенность использования m.if3, и обычно это может привести к тому, что симуляция не будет решена. Итак, если вы хотите попробовать что-то более сложное, возможно, вместо этого остановитесь на m.if2.

Наконец, пришло время увидеть плоды нашей симуляции. Чтобы получить хорошее и быстрое представление о том, что было решено с помощью симуляции, построение результатов — отличный способ визуализировать их.

Анализ характеристик ракеты позволяет сделать некоторые интересные выводы. Во-первых, он достиг максимальной высоты 73,83 км и максимальной скорости 802,15 м/с. Во-вторых, ракета имела среднюю тягу 322,68 кН при сжигании колоссальных 19,59 ГДж энергии во время полета.

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

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

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

[1] Двигательная установка Falcon-I(http://www.b14643.de/Spacerockets_2/United_States_2/Falcon-I/Propulsion/engines.htm)

[2] Сокол-1 (https://en.wikipedia.org/wiki/Falcon_1)