predict

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

Описание

predict команда предсказывает состояние и ковариацию ошибки расчета состояния extendedKalmanFilter, unscentedKalmanFilter или particleFilter объект на следующем временном шаге. Чтобы реализовать расширенные или неароматизированные алгоритмы фильтра Калмана, используйте predict и correct команды вместе. Если ток выходного измерения существует, можно использовать predict и correct. Если измерение отсутствует, можно использовать только predict. Для получения информации о порядке использования команд смотрите Использование предсказания и исправление команд.

пример

[PredictedState,PredictedStateCovariance] = predict(obj) предсказывает оценку состояния и ковариацию ошибки расчета состояния расширенного или сигма-точечного фильтра Калмана или объекта фильтра частиц obj на следующем временном шаге.

Вы создаете obj использование extendedKalmanFilter, unscentedKalmanFilter или particleFilter команды. Вы задаете функцию перехода состояния и функцию измерения вашей нелинейной системы в obj. Вы также задаете, являются ли условия шума процесса и измерения аддитивными или неаддитивными в этих функциях. The State свойство объекта сохраняет последнее расчетное значение состояния. Предположим, что во временной шаг k, obj.State является x^[k|k]. Это значение является оценкой состояния для времени k, оцененный с использованием измеренных выходов до времени k. Когда вы используете predict команда, программное обеспечение возвращается x^[k+1|k] в PredictedState выход. Где x^[k+1|k] - оценка состояния для времени k+1, рассчитывается с использованием измеренного выхода до времени k. Команда возвращает ковариацию ошибки расчета состояния x^[k+1|k] в PredictedStateCovariance выход. Программное обеспечение также обновляет State и StateCovariance свойства obj с этими скорректированными значениями.

Используйте этот синтаксис, если функция перехода к состоянию f, что вы указали в obj.StateTransitionFcn имеет одну из следующих форм:

  • x(k) = f(x(k-1)) - для аддитивного технологического шума.

  • x(k) = f(x(k-1),w(k-1)) - для неаддитивного технологического шума.

Где x и w являются состоянием и технологическим шумом системы. Единственными входами для f являются состояния и технологический шум.

пример

[PredictedState,PredictedStateCovariance] = predict(obj,Us1,...Usn) задает дополнительные входные аргументы, если функция перехода состояния системы требует этих входов. Можно задать несколько аргументов.

Используйте этот синтаксис, если ваша функция перехода f имеет одну из следующих форм:

  • x(k) = f(x(k-1),Us1,...Usn) - для аддитивного технологического шума.

  • x(k) = f(x(k-1),w(k-1),Us1,...Usn) - для неаддитивного технологического шума.

Примеры

свернуть все

Оцените состояния осциллятора Ван дер Поля с помощью алгоритма сигма-точечного фильтра Калмана и измеренных выходов данных. Генератор имеет два состояния и один выход.

Создайте объект сигма-точечного фильтра Калмана для генератора. Используйте ранее написанные и сохраненные функции перехода и измерения, vdpStateFcn.m и vdpMeasurementFcn.m. Эти функции описывают дискретное приближение к осциллятору Ван дер Поля с параметром нелинейности mu, равным 1. Функции предполагают аддитивный процесс и измерительный шум в системе. Задайте начальные значения для двух состояний как [1; 0]. Это предположение для значения состояния в начальный момент времени k, используя знание выходов системы до времени k-1, xˆ[k|k-1].

obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[1;0]);

Загрузите измеренные выходные данные, y, от генератора. В этом примере используйте моделируемые статические данные для рисунка. Данные хранятся в vdp_data.mat файл.

load vdp_data.mat y

Задайте технологические шумовые и измерительные шумовые ковариации генератора.

obj.ProcessNoise = 0.01;
obj.MeasurementNoise = 0.16;

Инициализируйте массивы, чтобы захватить результаты оценки.

residBuf = [];
xcorBuf = [];
xpredBuf = [];

Реализуйте алгоритм сигма-точечного фильтра Калмана, чтобы оценить состояния генератора с помощью correct и predict команды. Вы сначала исправите xˆ[k|k-1] использование измерений во времени k добираться xˆ[k|k]. Затем вы прогнозируете значение состояния на следующем временном шаге, xˆ[k+1|k], использование xˆ[k|k]оценка состояния на временном шаге k который оценивается с помощью измерений до k времени.

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

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

for k = 1:size(y)
    [Residual,ResidualCovariance] = residual(obj,y(k));
    [CorrectedState,CorrectedStateCovariance] = correct(obj,y(k));
    [PredictedState,PredictedStateCovariance] = predict(obj);
    
     residBuf(k,:) = Residual;
     xcorBuf(k,:) = CorrectedState';
     xpredBuf(k,:) = PredictedState';
end

Когда вы используете correct команда, obj.State и obj.StateCovariance обновляются с учетом скорректированного состояния и ошибки расчета состояния ковариации значений для временного шага k, CorrectedState и CorrectedStateCovariance. Когда вы используете predict команда, obj.State и obj.StateCovariance обновляются предсказанными значениями для временного шага k+1, PredictedState и PredictedStateCovariance.

В этом примере вы использовали correct перед predict потому что начальное значение состояния было xˆ[k|k-1], предположение для значения состояния в начальное время k использование системных выходов до временного k-1. Если ваше начальное значение состояния xˆ[k-1|k-1], значение в предыдущий момент времени k-1 использование измерения до k-1, затем используйте predict сначала команда. Для получения дополнительной информации о порядке использования predict и correct, см. Использование предсказания и исправление команд.

Постройте график предполагаемых состояний с помощью значений после посткоррекции.

plot(xcorBuf(:,1), xcorBuf(:,2))
title('Estimated States')

Figure contains an axes. The axes with title Estimated States contains an object of type line.

Постройте график фактического измерения, скорректированного оценочного измерения и невязки. Для функции измерения в vdpMeasurementFcn, измерение является первым состоянием.

M = [y,xcorBuf(:,1),residBuf];
plot(M)
grid on
title('Actual and Estimated Measurements, Residual')
legend('Measured','Estimated','Residual')

Figure contains an axes. The axes with title Actual and Estimated Measurements, Residual contains 3 objects of type line. These objects represent Measured, Estimated, Residual.

Оценка внимательно отслеживает измерение. После начального переходного процесса невязка остается относительно небольшим на протяжении всего запуска.

Загрузите данные Ван дер Поль и укажите шаг расчета.

vdpODEdata.mat содержит симуляцию Ван дер Поль с параметром нелинейности mu = 1, с использованием ode45, с начальными условиями [2;0]. Истинное состояние было извлечено со шаг расчета dt = 0.05.

addpath(fullfile(matlabroot,'examples','control','main')) % add example data

load ('vdpODEdata.mat','xTrue','dt')
tSpan = 0:dt:5;

Получите измерения. В данном примере датчик измеряет первое состояние Гауссовым шумом со стандартным отклонением 0.04.

sqrtR = 0.04;
yMeas = xTrue(:,1) + sqrtR*randn(numel(tSpan),1);

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

myPF = particleFilter(@vdpParticleFilterStateFcn,@vdpMeasurementLikelihoodFcn);

Инициализируйте фильтр частиц в состоянии [2; 0] с единичной ковариацией и использованием 1000 частицы.

initialize(myPF,1000,[2;0],eye(2));

Выберите mean оценка состояния и systematic методы повторной дискретизации.

myPF.StateEstimationMethod = 'mean';
myPF.ResamplingMethod = 'systematic';

Оцените состояния, используя correct и predict команды и сохраните предполагаемые состояния.

xEst = zeros(size(xTrue));
for k=1:size(xTrue,1)
    xEst(k,:) = correct(myPF,yMeas(k));
    predict(myPF);
end

Постройте график результатов и сравните предполагаемые и истинные состояния.

figure(1)
plot(xTrue(:,1),xTrue(:,2),'x',xEst(:,1),xEst(:,2),'ro')
legend('True','Estimated')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent True, Estimated.

rmpath(fullfile(matlabroot,'examples','control','main')) % remove example data

Рассмотрим нелинейную систему с входными u чье состояние x и измерительные y развиваться согласно следующим переходным и измерительным уравнениям:

x[k]=x[k-1]+u[k-1]+w[k-1]

y[k]=x[k]+2*u[k]+v[k]2

Шум процесса w системы является аддитивным, в то время как шум измерения v является неаддитивным.

Создайте функцию перехода состояния и функцию измерения для системы. Задайте функции с дополнительным входом u.

f = @(x,u)(sqrt(x+u));
h = @(x,v,u)(x+2*u+v^2);

f и h являются указателями на функцию анонимных функций, которые хранят функции перехода и измерения состояния, соответственно. В функции измерения, потому что шум измерения неаддитивен, v задается также как вход. Обратите внимание, что v задается как вход перед дополнительным входом u.

Создайте расширенный объект фильтра Калмана для оценки состояния нелинейной системы с помощью заданных функций. Задайте начальное значение состояния как 1, и шум измерения как неаддитивный.

obj = extendedKalmanFilter(f,h,1,'HasAdditiveMeasurementNoise',false);

Задайте ковариацию шума измерения.

obj.MeasurementNoise = 0.01;

Теперь можно оценить состояние системы с помощью predict и correct команды. Вы передаете значения u на predict и correct, которые в свою очередь передают их в функции переходов состояний и измерений, соответственно.

Исправьте оценку состояния с помощью y измерения[k] = 0.8 и входные u[k] = 0.2 в временной шаг k.

correct(obj,0.8,0.2)

Спрогнозируйте состояние на следующем временном шаге, задайте u[k] = 0.2.

predict(obj,0.2)

Найдите ошибку, или невязку, между предсказанием и измерением.

[Residual, ResidualCovariance] = residual(obj,0.8,0.2);

Входные параметры

свернуть все

Расширенный или сигма-точечный фильтр Калмана, или объект фильтра частиц для онлайн-оценки состояния, созданный с помощью одной из следующих команд:

  • extendedKalmanFilter - Использует расширенный алгоритм фильтра Калмана.

  • unscentedKalmanFilter - Использует неароматизированный алгоритм фильтра Калмана.

  • particleFilter - Использует алгоритм фильтра частиц.

Дополнительные входные параметры в функцию перехода состояния, заданные как входные параметры любого типа. Функция перехода к состоянию, f, задана в StateTransitionFcn свойство объекта. Если функция требует входных параметров в дополнение к значениям состояний и процессов шума, вы задаете эти входы в predict синтаксис команды.

Например, предположим, что ваша функция перехода состояния вычисляет предсказанное состояние x в временной шаг k использование системных входов u(k-1) и временные k-1, в сложение к состоянию x(k-1):

x(k) = f(x(k-1),u(k-1),k-1)

Затем, когда вы выполняете онлайн-оценку состояния в временной шаг k, задайте эти дополнительные входы в predict синтаксис команды:

[PredictedState,PredictedStateCovariance] = predict(obj,u(k-1),k-1);

Выходные аргументы

свернуть все

Предсказанная оценка состояния, возвращенная как вектор размера M, где M - количество состояний системы. Если вы задаете начальные состояния obj как векторы-столбцы затем M возвращается как вектор-столбец, в противном случае M возвращается как вектор-строка.

Для получения информации о том, как задать начальные состояния объекта, смотрите extendedKalmanFilter, unscentedKalmanFilter и particleFilter страницы с описанием.

Предсказанная ковариация ошибки расчета состояния, возвращенная как M -by - M матрица, где M - количество состояний системы.

Подробнее о

свернуть все

Используя predict и correct Команды

После того, как вы создали расширенный или сигма-точечный фильтр Калмана, или объект фильтра частиц, obj, для реализации алгоритмов оценки, используйте correct и predict команды вместе.

Во временной шаг k, correct команда возвращает исправленное значение состояний и ковариацию ошибки расчета состояния с помощью измеренных системных выходов y[k] в том же временном шаге. Если ваша функция измерения имеет дополнительные входные параметры Um, вы задаете их как входы для correct команда. Команда передает эти значения в функцию измерения.

[CorrectedState,CorrectedCovariance] = correct(obj,y,Um)

correct команда обновляет State и StateCovariance свойства объекта с предполагаемыми значениями, CorrectedState и CorrectedCovariance.

predict команда возвращает предсказание состояния и ковариации ошибки расчета состояния на следующем временном шаге. Если ваша функция перехода состояния имеет дополнительные входные параметры Us, вы задаете их как входы для predict команда. Команда передает эти значения в функцию перехода состояния.

[PredictedState,PredictedCovariance] = predict(obj,Us)

predict команда обновляет State и StateCovariance свойства объекта с предсказанными значениями, PredictedState и PredictedCovariance.

Если токовое выходное измерение существует в установленный временной шаг, можно использовать correct и predict. Если измерение отсутствует, можно использовать только predict. Для получения дополнительной информации о том, как эти команды реализуют алгоритмы, смотрите Расширенные и Несканированные Алгоритмы Фильтра Калмана для оценки состояния в режиме онлайн.

Порядок реализации команд зависит от доступности измеренных данных y, Us, и Um для вашей системы:

  • correct тогда predict - Предположим, что во временной шаг k, значение obj.State является x^[k|k1]. Это значение является состоянием системы в момент времени k, оцененный с использованием измеренных выходов до времени k-1. У вас также есть измеренный выход y[k] и входы Us[k] и Um[k] в том же временном шаге.

    Затем вы сначала выполните correct команда с измеренными данными о системе y[k] и дополнительные входы Um[k]. Команда обновляет значение obj.State быть x^[k|k]оценка состояния для временного k, оцененный с использованием измеренных выходов до временного k. Когда вы затем выполняете predict команда со входными Us[k], obj.State теперь магазины x^[k+1|k]. Алгоритм использует это значение состояния как вход в correct команда на следующем временном шаге.

  • predict тогда correct - Предположим, что во временной шаг k, значение obj.State является x^[k1|k1]. У вас также есть измеренный выход y[k] и входные Um[k] в то же временной шаг, но вы Us[k-1] с предыдущего временного шага.

    Затем вы сначала выполните predict команда со входными Us[k-1]. Команда обновляет значение obj.State кому x^[k|k1]. Когда вы затем выполняете correct команда с входными параметрами y[k] и Um[k], obj.State обновляется с помощью x^[k|k]. Алгоритм использует это значение состояния как вход в predict команда на следующем временном шаге.

Таким образом, в то время как в обоих случаях состояние оценивает для времени k, x^[k|k] то же самое, если в это время k у вас нет доступа к входным параметрам функции перехода к текущему состоянию Us[k], и вместо этого имеют Us[k-1], затем используйте predict сначала и затем correct.

Для примера оценки состояний используя predict и correct команды, см. Оценка состояний в режиме онлайн с использованием сигма-точечного фильтра Калмана или оценка состояний в режиме онлайн с использованием фильтра частиц.

Введенный в R2016b