Оптимальное управление в Mathematica

Рассмотрим решение некоторых примеров из книги А.В. Пантелеева — «Вариационное исчисление в примерах и задачах». В книге огромное количество решенных примеров, здесь я выложу блокноты Mathematica c решением примеров с 4.1 по 4.4. Оптимальное управление — программное (без обратной связи), определяется при помощи применения принципа максимума.

В целом, алгоритм применения принципа максимума можно найти на стр. 154 [1]. Решение задач в книге тоже происходит по пунктам алгоритма. Приведенные блокноты следует запускать в системе Mathematica (файл — открыть, Evaluation — Evaluate Notebook). Версия ПО у меня Home Edition, думаю, это не должно влиять на запускаемость в профессиональной.

Следует отметить некоторые особенности работы. Автоматизировать все шаги упомянутого алгоритма сложно. И я не уверен, что необходимо, поэтому такого нет. При переписывании кода блокнотов под свою задачу следует быть аккуратным.

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

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

Замечания по коду

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

1. Создание выражения eq1, если оно используется в дальнейшем. В данном случае, выражение eq1 будет содержать уравнение рассматриваемой системы.

eq1 := x'[t] == f[t, x[t], u[t]]

2. Выполнение замены строки в выражении eq1. Строка f[…] в выражении eq1 будет заменена на строку x[t] + u[t]. Оператор /. соответствует функции ReplaceAll (заменить все вхождения).

eq1 = eq1 /. f[t, x[t], u[t]] -> x[t] + u[t]

Результат замены — новое выражение eq1:

[x]'[t] == u[t] + x[t]

3. Функции решения зачастую выдают результат в виде правил замены (со стрелками). Чтобы формировать из решений дальнейшие уравнения, применяется доступ к части выражения:

Sln[[1]][[1]][[2]]

4. Немного про синтаксис Mathematica. Двойные скобки и стрелка это esc [[ esc и ->. Подробнее про синтаксис ввода здесь. Все символы в Mathematica можно вводить по полным именам, а можно по алиасам (между esc). Некоторые пишутся по автозамене.

5. И последнее замечание. Иногда я пишу имя выражения просто, чтобы оно напечаталось в выходной ячейке. Для контроля. Либо использую функцию Print[].

Файлы

CRC64: 70988DEF5E5E1B30

Литература

[1] — А.В. Пантелеев — Вариационное исчисление в примерах и задачах, М. Высшая школа, 2006.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.