Сообщество Engee

Рабочий процесс идентификации системы

Автор
avatar-svetlanasvetlana
Notebook

Рабочий процесс идентификации системы

Идентификация — это процесс построения математической модели динамического объекта на основе экспериментальных данных.

In [ ]:
Pkg.add(["DataFrames", "CSV", "ControlSystemIdentification"])
using DataFrames, CSV, ControlSystemIdentification;

Примерный рабочий процесс идентификации выглядит следующим образом:image.png

Сначала необходимо провести эксперимент для сбора данных системы. Затем выбирается структура модели, которую мы хотим подогнать под эти данные и алгоритм идентификации. Далее полученные данные «подгоняются» под выбранную структуру. Результат идентификации проверяется на валидационном наборе данных. Если результат идентификации оказывается неудовлетворительным, необходимо вернуться назад и изменить структуру модели или алгоритм идентификации.

Сбор данных эксперимента

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

In [ ]:
Import_data = "data.csv" 
table = CSV.read(Import_data, DataFrame);
inputdata = Float64.(table[:, 2]); 
outputdata = Float64.(table[:, 3]);

Данные для идентификации:

In [ ]:
Ts = 0.1;
identdata  = iddata(outputdata[1:Int32(end/2)], inputdata[1:Int32(end/2)], Ts);   
plot(identdata)     
Out[0]:

Данные для валидации:

In [ ]:
valdata  = iddata(outputdata[Int32(end/2):end], inputdata[Int32(end/2):end], Ts);   
plot(valdata)   
Out[0]:

Выбор структуры модели и идентификация

Будем идентифицировать линейную стационарную систему в пространстве состояний. Для начала выберем порядок системы равным 1.

In [ ]:
nx = 1; # порядок системы
res = subspaceid(identdata, nx; verbose=true)
Out[0]:
N4SIDStateSpace{ControlSystemsBase.StateSpace{ControlSystemsBase.Discrete{Float64}, Float64}, LinearAlgebra.Hermitian{Float64, Matrix{Float64}}, LinearAlgebra.Hermitian{Float64, Matrix{Float64}}, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, Vector{Float64}, LinearAlgebra.SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}, Float64}
A = 
 0.8129112616785744
B = 
 -0.38362425489543245
C = 
 -4.560011287091462
D = 
 0.02359847501341137

Sample Time: 0.1 (seconds)
Discrete-time state-space model

Валидация модели

In [ ]:
simplot(valdata, res) 
Out[0]:

Как мы видим, идентифицированная модель недостаточно воспроизводит динамику реальной системы.

Изменение структуры модели и идентификация

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

In [ ]:
nx = 2; # порядок системы
res = subspaceid(identdata, nx; verbose=true)
Out[0]:
N4SIDStateSpace{ControlSystemsBase.StateSpace{ControlSystemsBase.Discrete{Float64}, Float64}, LinearAlgebra.Hermitian{Float64, Matrix{Float64}}, LinearAlgebra.Hermitian{Float64, Matrix{Float64}}, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, Vector{Float64}, LinearAlgebra.SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}, Float64}
A = 
  0.8165117145544952  0.3939768143396654
 -0.3883413482702869  0.6670669737460359
B = 
 -0.45785009806936194
 -0.31617858798326837
C = 
 -4.42362835383083  3.228268638993534
D = 
 0.03893922777217982

Sample Time: 0.1 (seconds)
Discrete-time state-space model

Валидация модели

In [ ]:
simplot(valdata, res) 
Out[0]:

На этот раз точность идентификации нас устраивает.

Вывод

В этом примере мы познакомились с рабочим процессом идентификации системы на основе данных эксперимента, полученных из CSV таблицы.