Документация Engee
Notebook

Оценка параметров

Если думать о создании моделей объекта управления с точки зрения данных, которые у нас есть о модели, то часто разделяют 3 подхода:
Модель белого ящика – это модель, в которой мы знаем всю основную динамику системы.
Напротив, модель черного ящика подразумевает то, что мы не знаем динамику вообще.
В этом примере разбирается промежуточный подход серого ящика, когда мы знаем структуру модели, но нам недостает некоторых параметров.
Недостающие параметры можно подобрать по экспериментальным данным. Это довольно сложный алгоритм, но благодаря совместной работе скриптов и моделей, в коде можно реализовать даже такую непростую задачу.

Для удобства переиспользования алгоритма в других проектах код скрыт Масками кодовых ячеек. Маски работают только в Редакторе кода, поэтому полный функционал не доступен в Сообществе. Поэтому ниже маскированный код заменен скриншотами из файла parameter_estimation.ngscript.

Загрузка данных из таблицы
In [ ]:
using DataFrames, CSV;
image.png
image.png
In [ ]:
df_in = DataFrame(time=exp_time_data, value=exp_in_data)
df_in = Float64.(df_in);
wa_in = WorkspaceArray(string(rand()), df_in)
Out[0]:
WorkspaceArray{Float64}("0.13840788610457466")

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

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

Сравнение экспериментальных данных и данных модели
image.png
Подключение библиотек для оценки
In [ ]:
using DataFrames
try
    using NLopt
catch
    Pkg.add(["NLopt"])
    using NLopt
end
try
    using Interpolations
catch
    Pkg.add(["Interpolations"])
    using Interpolations
end
Оценка.png
res.png

Результат:

За 30 итераций у нас подобрались следующие параметры:

Результаты оценки:
b = 0.024429360665833955
c = 1.4808238712308082

Результаты нас вполне устраивают.

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