particleFilter

Объект фильтра частиц для онлайновой оценки состояния

Описание

Фильтр частиц является рекурсивным, Байесовым средством оценки состояния, которое использует дискретные частицы, чтобы аппроксимировать апостериорное распределение предполагаемого состояния. Для онлайновой оценки состояния полезно, когда измерения и системная модель, которая связывает образцовые состояния с измерениями, доступны. Алгоритм фильтра частиц вычисляет оценки состояния рекурсивно и включает инициализацию, прогноз и шаги исправления.

particleFilter создает объект для онлайновой оценки состояния дискретного времени нелинейная система с помощью алгоритма фильтра частиц дискретного времени.

Считайте объект с состояниями x, входом u, выводом m, шум процесса w и измерение y. Примите, что можно представлять объект как нелинейную систему.

Алгоритм вычисляет оценки состояния x^ из нелинейной системы с помощью функций правдоподобия изменения состояния и измерения вы задаете.

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

Чтобы выполнить онлайновую оценку состояния, создайте нелинейную функцию изменения состояния и функцию правдоподобия измерения. Затем создайте объект particleFilter с помощью этих нелинейных функций. После того, как вы создаете объект:

  1. Инициализируйте частицы с помощью команды initialize.

  2. Предскажите оценки состояния на следующем шаге с помощью команды predict.

  3. Исправьте оценки состояния с помощью команды correct.

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

Создание

Синтаксис

pf = particleFilter(StateTransitionFcn,MeasurementLikelihoodFcn)

Описание объекта

пример

pf = particleFilter(StateTransitionFcn,MeasurementLikelihoodFcn) создает объект фильтра частиц для онлайновой оценки состояния дискретного времени нелинейная система. StateTransitionFcn является функцией, которая вычисляет частицы (гипотезы состояния) на следующем временном шаге, учитывая вектор состояния на временном шаге. MeasurementLikelihoodFcn является функцией, которая вычисляет вероятность каждой частицы на основе измерений датчика.

После создания объекта используйте команду initialize, чтобы инициализировать частицы с известным средним значением и ковариацией или равномерно распределенные частицы в заданных границах. Затем используйте correct и команды predict, чтобы обновить частицы (и следовательно оценка состояния) использование измерений датчика.

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

развернуть все

Функция изменения состояния, заданная как указатель на функцию, определяет переход частиц (гипотезы состояния) между временными шагами. Также свойство объекта particleFilter. Для получения дополнительной информации смотрите Свойства.

Функция правдоподобия измерения, заданная как указатель на функцию, используется, чтобы вычислить вероятность частиц (гипотезы состояния) от измерений датчика. Также свойство объекта particleFilter. Для получения дополнительной информации смотрите Свойства.

Свойства

развернуть все

Количество переменных состояния, заданных как скаляр. Это свойство только для чтения и установлено с помощью initialize. Количество состояний неявно на основе заданных матриц для начального среднего значения частиц или границ состояния.

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

Функция изменения состояния, заданная как указатель на функцию, определяет переход частиц (гипотезы состояния) между временными шагами. Эта функция вычисляет частицы на следующем временном шаге, включая шум процесса, учитывая частицы на временном шаге.

Напротив, функция изменения состояния для extendedKalmanFilter и unscentedKalmanFilter генерирует одну оценку состояния, в установленный срок продвигаются.

Вы пишете и сохраняете функцию изменения состояния для своей нелинейной системы и задаете его как указатель на функцию при построении объекта particleFilter. Например, если vdpParticleFilterStateFcn.m является функцией изменения состояния, задайте StateTransitionFcn как @vdpParticleFilterStateFcn. Можно также задать StateTransitionFcn как указатель на функцию к анонимной функции.

Функциональная подпись следующие:

function predictedParticles = myStateTransitionFcn(previousParticles,varargin)

Функция StateTransitionFcn принимает по крайней мере один входной параметр. Первый аргумент является набором частиц previousParticles, который представляет гипотезы состояния на предыдущем временном шаге. Дополнительное использование varargin в функции позволяет вам ввести любые дополнительные параметры, которые важны для предсказания следующего состояния, с помощью predict, можно следующим образом:

predict(pf,arg1,arg2)

Если StateOrientation является 'столбцом', то previousParticles является NumStateVariables-by-NumParticles массив. Если StateOrientation является 'строкой', то previousParticles является NumParticles-by-NumStateVariables массив.

StateTransitionFcn должен возвратить точно один выходной параметр, predictedParticles, который является набором предсказанных местоположений частицы для шага текущего времени (массив с теми же размерностями как previousParticles).

StateTransitionFcn должен включать шум вероятностного процесса (от любого распределения, подходящего для вашего приложения) в predictedParticles.

Чтобы видеть пример функции изменения состояния с набором свойств StateOrientation к 'столбцу', введите edit vdpParticleFilterStateFcn в командной строке.

Функция правдоподобия измерения, заданная как указатель на функцию, используется, чтобы вычислить вероятность частиц (гипотезы состояния) использование измерений датчика. Для каждой гипотезы состояния (частица) функция сначала вычисляет вектор гипотезы измерения N-элемента. Затем вероятность каждой гипотезы измерения вычисляется на основе измерения датчика и распределения вероятностей шума измерения.

Напротив, функция измерения для extendedKalmanFilter и unscentedKalmanFilter берет одну гипотезу состояния и возвращает одну оценку измерения.

Вы пишете и сохраняете функцию правдоподобия измерения на основе своей модели измерения и используете его, чтобы создать объект. Например, если vdpMeasurementLikelihoodFcn.m является функцией правдоподобия измерения, задайте MeasurementLikelihoodFcn как @vdpMeasurementLikelihoodFcn. Можно также задать MeasurementLikelihoodFcn как указатель на функцию к анонимной функции.

Функциональная подпись следующие:

function likelihood = myMeasurementLikelihoodFcn(predictedParticles,measurement,varargin)

Функция MeasurementLikelihoodFcn принимает по крайней мере два входных параметра. Первый аргумент является набором частиц predictedParticles, который представляет предсказанную гипотезу состояния. Если StateOrientation является 'столбцом', то predictedParticles является NumStateVariables-by-NumParticles массив. Если StateOrientation является 'строкой', то predictedParticles является NumParticles-by-NumStateVariables массив. Второй аргумент, measurement, является измерением датчика N-элемента на шаге текущего времени. Можно обеспечить дополнительные входные параметры с помощью varargin.

MeasurementLikelihoodFcn должен возвратить точно один выходной параметр, likelihood, вектор с длиной NumParticles, которая является вероятностью данного measurement для каждой частицы (гипотеза состояния).

Чтобы видеть пример функции правдоподобия измерения, введите edit vdpMeasurementLikelihoodFcn в командной строке.

Имеют ли переменные состояния круговое распределение, заданное как логический массив.

Это - свойство только для чтения и установлено с помощью initialize.

Проспект (или угловой) дистрибутивы использует функцию плотности вероятности с областью значений [-pi,pi]. IsStateVariableCircular является вектором - строкой с элементами NumStateVariables. Каждый векторный элемент указывает, является ли переменная ассоциированной страны круговой.

Настройки политики, которые определяют, когда инициировать передискретизацию, заданную как объект particleResamplingPolicy.

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

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

В этом уравнении N является количеством частиц, и w является нормированным весом каждой частицы. Эффективным отношением частицы является затем Neff / NumParticles. Поэтому эффективное отношение частицы является функцией весов всех частиц. После того, как веса частиц достигают достаточно низкого значения, они не способствуют оценке состояния. Эта низкая стоимость инициировала передискретизацию, таким образом, частицы ближе к оценке текущего состояния и имеют более высокие веса.

Следующие свойства объекта particleResamplingPolicy могут быть изменены, чтобы управлять, когда передискретизация инициирована:

СвойствоЗначениеВводОписание

TriggerMethod

'ratio' (значение по умолчанию)

'interval'

символьный вектор

Это - метод, чтобы определить, когда передискретизация происходит, на основе выбранного значения. Триггерная передискретизация значения 'interval' на шагах постоянного времени операции фильтра частиц. Триггерная передискретизация значения 'ratio' на основе отношения эффективных общих частиц.

SamplingInterval

1 (значение по умолчанию)

скаляр

Фиксированный интервал между передискретизацией, заданной как скаляр. Этот интервал определяет, во время которых шагов исправления выполняется передискретизация. Например, значение 2 средних значений передискретизация выполняется каждый второй шаг исправления. Значение inf означает, что передискретизация никогда не выполняется.

Это свойство только применяется с TriggerMethod, установлен в 'interval'.

MinEffectiveParticleRatio

0.5 (значение по умолчанию)

скаляр

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

Если отношение эффективного количества частиц к общему количеству частиц, NumParticles падает ниже MinEffectiveParticleRatio, шаг передискретизации, инициировано.

Метод используется для передискретизации частицы, заданной как одно из следующего:

  • 'multinomial'

  • 'residual'

  • 'stratified'

  • 'systematic'

Метод, используемый для извлечения оценки состояния от частиц, заданных как одно из следующего:

  • среднее значение- Объектные выходные параметры взвешенное среднее частиц, в зависимости от свойств Weights и Particles, как оценка состояния.

  • 'maxweight' - Объектные выходные параметры частица с самым высоким весом как оценка состояния.

Массив значений частицы, заданных как массив на основе свойства StateOrientation:

  • Если StateOrientation является 'row' затем, Particles является NumParticles-by-NumStateVariables массив.

  • Если StateOrientation является 'column' затем, Particles является NumStateVariables-by-NumParticles массив.

Каждая строка или столбец соответствуют гипотезе состояния (одна частица).

Веса частицы, заданные как вектор на основе значения свойства StateOrientation:

  • Если StateOrientation является 'row' затем, Weights является NumParticles-by-1 вектор, где каждый вес сопоставлен с частицей в той же строке в свойстве Particles.

  • Если StateOrientation является 'column' затем, Weights является 1 NumParticles вектором, где каждый вес сопоставлен с частицей в том же столбце в свойстве Particles.

Оценка текущего состояния, заданная как вектор на основе значения свойства StateOrientation:

  • Если StateOrientation является 'row' затем, State является 1 NumStateVariables вектором

  • Если StateOrientation является 'column' затем, State является NumStateVariables-by-1 вектор

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

State наряду с StateCovariance может также быть определен с помощью getStateEstimate.

Текущая оценка ошибочной ковариации оценки состояния, заданной как NumStateVariables-by-NumStateVariables массив. StateCovariance является свойством только для чтения и вычисляется на основе StateEstimationMethod. Если вы задаете метод оценки состояния, который не поддерживает ковариацию, то функция возвращает StateCovariance как [].

StateCovariance и State могут быть определены вместе с помощью getStateEstimate.

Функции объекта

initializeИнициализируйте состояние фильтра частиц
predictПредскажите ошибочную ковариацию оценки состояния и оценки состояния при следующем расширенном использовании временного шага или сигма-точечный фильтр Калмана или фильтр частиц
correctПравильное ошибочное использование ковариации оценки состояния и оценки состояния расширено или сигма-точечный фильтр Калмана, или фильтр частиц и измерения
getStateEstimateИзвлечение лучше всего утверждает оценку и ковариацию от частиц
cloneСкопируйте онлайновый объект оценки состояния

Примеры

свернуть все

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

В этом примере функциональный vdpParticleFilterStateFcn описывает приближение дискретного времени к осциллятору Ван дер Поля с параметром нелинейности, mu, равный 1. Кроме того, это шум процесса моделей Gaussian. функция vdpMeasurementLikelihood вычисляет вероятность частиц от шумных измерений первого состояния, принимая Гауссово распределение шума измерения.

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

myPF = particleFilter(@vdpParticleFilterStateFcn,@vdpMeasurementLikelihoodFcn);

Чтобы инициализировать и оценить состояния и ошибочную ковариацию оценки состояния от созданного объекта, используйте initialize, predict и команды correct.

Загрузите данные об ОДУ Ван дер Поля и задайте шаг расчета.

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

addpath(fullfile(matlabroot,'examples','ident','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')

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

Расширенные возможности

Введенный в R2017b