Этот пример демонстрирует использование Фильтра частиц блока в System Identification Toolbox™. Задача оценки параметра передаточной функции в дискретном времени переформулируется и рекурсивно решается как задача оценки состояния.
System Identification Toolbox имеет три блока Simulink для нелинейной оценки состояния:
Фильтр частиц: Реализует алгоритм фильтра частиц в дискретном времени.
Расширенный фильтр Калмана: Реализует алгоритм расширенного фильтра Калмана первого порядка в дискретном времени.
Сигма-точечный фильтр Калмана: Реализует дискретный алгоритм сигма-точечного фильтра Калмана.
Эти блоки поддерживают оценку состояния с помощью нескольких датчиков, работающих с различными скоростями дискретизации. Типичный рабочий процесс использования этих блоков следующий:
Моделируйте поведение своего объекта и датчика с помощью функций MATLAB или Simulink.
Сконфигурируйте параметры блока.
Симулируйте фильтр и анализируйте результаты, чтобы получить доверие в эффективности фильтра.
Разверните фильтр на своем оборудовании. Вы можете сгенерировать код для этих фильтров с помощью программного обеспечения Simulink Coder™.
Этот пример использует блок Фильтр частиц, чтобы продемонстрировать первые два шага этого рабочего процесса. Последние два шага кратко рассматриваются в разделе «Следующие шаги». Цель в этом примере состоит в том, чтобы рекурсивно оценить параметры передаточной функции в дискретном времени (модель выходной ошибки), где параметры модели обновляются на каждом временном шаге по мере поступления новой информации.
Если вы заинтересованы в Расширенном Фильтре Калмана, см. Пример «Оценка состояний нелинейной системы с несколькими, многосветными датчиками». Использование сигма-точечного фильтра Калмана следует тем же шагам, что и расширенный фильтр Калмана.
Добавьте папку файла примера в путь MATLAB.
addpath(fullfile(matlabroot,'examples','ident','main'));
Большинство алгоритмов оценки состояния основаны на модели объекта управления (функции перехода состояния), которая описывает эволюцию состояний объекта от одного временного шага к следующему. Эта функция обычно обозначается как то, где x - состояния, w - шум процесса, u - необязательные дополнительные входы, для образца входов или параметров системы. Блок фильтра частиц требует, чтобы вы предоставили эту функцию в несколько другом синтаксисе,. Ниже перечислены различия:
Фильтр частиц работает путем следования траекторий многих гипотез состояний (частиц), и блок передает все гипотезы состояний в вашу функцию сразу. Конкретно, если ваш вектор состояний имеет элементы, и вы выбираете частицы для использования, имеет размерности, где каждый столбец является гипотезой состояния.
Вы вычисляете влияние шума процесса на гипотезы состояния в вашей функции. Блок не делает никаких предположений о распределении вероятностей шума процесса и не нуждается в качестве входов.
Функция может быть функцией MATLAB, которая соответствует ограничениям MATLAB Coder™, или блоком Simulink Function. После создания вы задаете имя функции в блоке Particle Filter.
В этом примере вы переформулируете задачу оценки параметра передаточной функции в дискретном времени как задачу оценки состояния. Эта передаточная функция может представлять динамику процесса в дискретном времени или может представлять некоторую динамику в непрерывном времени, связанную с восстановителем сигнала, таким как удержание нулевого порядка. Предположим, что вы заинтересованы в оценке параметров передаточной функции в дискретном времени первого порядка:
Вот выход объекта управления, является входом объекта управления, является шумом измерения, является оператором задержки по времени, так что. Параметризируйте передаточную функцию как, где и являются параметрами, которые будут оценены. Передаточная функция и параметры могут быть представлены в необходимой форме пространства состояний несколькими способами, путем выбора вектора состояний. Один из вариантов состоит в том, где второе и третье состояния представляют оценки параметров. Тогда передаточная функция может быть эквивалентно записана как
Член шума измерения обрабатывается при моделировании датчика. В этом примере вы реализуете выражение выше в функции MATLAB, в векторизованной форме для вычислительной эффективности:
type pfBlockStateTransitionFcnExample
function xNext = pfBlockStateTransitionFcnExample(x,u) % pfBlockStateTransitionFcnExample State transition function for particle % filter, for estimating parameters of a % SISO, first order, discrete-time transfer % function model % % Inputs: % x - Particles, a NumberOfStates-by-NumberOfParticles matrix % u - System input, a scalar % % Outputs: % xNext - Predicted particles, with the same dimensions as input x % Implement the state-transition function % xNext = [x(1)*x(2) + x(3)*u; % x(2); % x(3)]; % in vectorized form (for all particles). xNext = x; xNext(1,:) = bsxfun(@times,x(1,:),-x(2,:)) + x(3,:)*u; % Add a small process noise (relative to expected size of each state), to % increase particle diversity xNext = xNext + bsxfun(@times,[1; 1e-2; 1e-1],randn(size(xNext))); end
Блок Фильтра Частиц требует, чтобы вы обеспечили функцию вероятности измерения, которая вычисляет вероятность (вероятность) каждой гипотезы о состоянии. Эта функция имеет вид. является вектором элемента, где - количество частиц, которые вы выбираете. элемент в - вероятность частицы (столбца) в. - измерение датчика. является необязательным входным аргументом, который может отличаться от входов функции перехода состояния.
Датчик измеряет первое состояние в этом примере. Этот пример принимает, что ошибки между фактическими и предсказанными измерениями распределены согласно Гауссову распределению, но любое произвольное распределение вероятностей или какой-либо другой метод может использоваться, чтобы вычислить вероятности. Вы создаете, и задаете имя функции в блоке Фильтр частиц.
type pfBlockMeasurementLikelihoodFcnExample;
function likelihood = pfBlockMeasurementLikelihoodFcnExample(particles, measurement) % pfBlockMeasurementLikelihoodFcnExample Measurement likelihood function for particle filter % % The measurement is the first state % % Inputs: % particles - A NumberOfStates-by-NumberOfParticles matrix % measurement - System output, a scalar % % Outputs: % likelihood - A vector with NumberOfParticles elements whose n-th % element is the likelihood of the n-th particle %#codegen % Predicted measurement yHat = particles(1,:); % Calculate likelihood of each particle based on the error between actual % and predicted measurement % % Assume error is distributed per multivariate normal distribution with % mean value of zero, variance 1. Evaluate the corresponding probability % density function e = bsxfun(@minus, yHat, measurement(:)'); % Error numberOfMeasurements = 1; mu = 0; % Mean Sigma = eye(numberOfMeasurements); % Variance measurementErrorProd = dot((e-mu), Sigma \ (e-mu), 1); c = 1/sqrt((2*pi)^numberOfMeasurements * det(Sigma)); likelihood = c * exp(-0.5 * measurementErrorProd); end
Сконфигурируйте блок Фильтра Частиц для оценки. Вы задаете имена функции вероятностей перехода и измерения, количество частиц и начальное распределение этих частиц.
На вкладке Системная модель диалогового окна блоков задайте следующие параметры:
Переход между состояниями
Задайте функцию перехода между состояниями, pfBlockStateTransitionFcnExample
, в Function. Когда вы вводите имя функции и нажимаете Применить, блок обнаруживает, что ваша функция имеет дополнительный вход, и создает входной порт StateTransitionFcnInputs. Вы соединяете свой системный вход с этим портом.
Инициализация
Задайте 10000
в количестве частиц. Большее количество частиц обычно соответствует лучшей оценке при повышенных вычислительных затратах.
Задайте Gaussian
в Distribution, чтобы получить начальный набор частиц из многомерного Гауссова распределения. Затем задайте [0; 0; 0]
В смысле, потому что у вас есть три состояния, и это ваше лучшее предположение. Задайте diag([10 5 100])
в Ковариации, чтобы указать большое отклонение (неопределенность) в вашем предположении для третьего состояния и меньшее отклонение для первых двух. Очень важно, чтобы этот начальный набор частиц был распространен достаточно широко (большое отклонение), чтобы покрыть потенциальное истинное состояние.
Измерение 1
Укажите имя функции правдоподобия измерения, pfBlockMeasurementLikelihoodFcnExample
, в Function.
Шаг расчета
В нижней части диалогового окна блока введите 1 во шаг расчета. Если у вас есть другой шаг расчета среди функций перехода и вероятности измерения, или если у вас есть несколько датчиков с различными шагами расчета, они могут быть сконфигурированы в выходах блоков, вкладка Multirate.
Фильтр частиц включает удаление частиц с низкими вероятностями и высевание новых частиц с использованием таковых с более высокими вероятностями. Этим управляют опции в группе Повторная дискретизация. Этот пример использует настройки по умолчанию.
По умолчанию блок выводит только среднее значение гипотез состояний, взвешенных по их вероятностям. Чтобы увидеть все частицы, веса или выбрать другой метод извлечения оценки состояния, проверьте опции в выходах блоков, вкладка Multirate.
Для простого теста истинная модель объекта моделируется с белыми шумовыми входами. Входы и шумные измерения от объекта подаются на блок Фильтра частиц. Следующая модель Simulink представляет эту настройку.
open_system('pfBlockExample')
Симулируйте систему и сравните предполагаемые и истинные параметры:
sim('pfBlockExample') open_system('pfBlockExample/Parameter Estimates')
График показывает истинные параметры числителя и знаменателя и их оценки фильтра частиц. Оценки приблизительно сходятся к истинным значениям после 10 временных шагов. Сходимость получается, хотя начальное состояние, по предположению, было далеко от истинных значений.
Здесь перечислены некоторые потенциальные проблемы реализации и идеи поиска и устранения проблем, в случае, если фильтр частиц не работает должным образом для вашего приложения.
Поиск и устранение проблем с фильтром частиц обычно выполняется путем просмотра набора частиц и их весов, которые могут быть получены путем выбора Вывода всех частиц и Вывода всех весов в выходах блоков, вкладке Multirate диалогового окна блоков.
Первая проверка работоспособности состоит в том, чтобы убедиться, что функции перехода и вероятности измерения достаточно хорошо захватывают поведение вашей системы. Если у вас есть симуляционная модель для вашей системы (и, следовательно, доступ к истинному состоянию в симуляции), можно попробовать инициализировать фильтр с истинным состоянием. Тогда можно подтвердить, вычисляет ли функция перехода во времени точное распространение истинного состояния, и вычисляет ли функция вероятности измерения высокую вероятность для этих частиц.
Начальный набор частиц важен. Убедитесь, что по крайней мере некоторые частицы имеют высокую вероятность в начале вашей симуляции. Если истинное состояние находится вне начального распространения гипотез о состоянии, оценки могут быть неточными или даже отличаться.
Если точность оценки состояния является хорошей первоначально, но ухудшается с течением времени, проблема может заключаться в дегенерации частиц или обнищании частиц [2]. Дегенерация частиц происходит, когда частицы распределены слишком широко, в то время как обнищание частиц происходит из-за скопления частиц вместе после повторной дискретизации. Дегенерация частиц приводит к обнищанию частиц в результате прямой повторной дискретизации. Сложение искусственного шума процесса в функцию перехода состояния, используемую в этом примере, является одним практическим подходом. Существует большой набор литературы по решению этих вопросов, и на основе вашего приложения могут быть доступны более систематические подходы. [1], [2] - две ссылки, которые могут быть полезными.
Проверьте оценку состояния: Как только фильтр работает, как ожидалось в симуляции, обычно эффективность дополнительно проверяется с помощью обширных симуляций Монте-Карло. Для получения дополнительной информации см. "Валидация оценки состояния в режиме онлайн" в Simulink ". Можно использовать опции в группе Случайность (Randomness) в диалоговом окне блока фильтра частиц (Particle Filter), чтобы облегчить эти симуляции.
Сгенерируйте код: Блок Фильтр частиц поддерживает генерацию C и Код С++ с помощью программного обеспечения Simulink Coder™. Функции, которые вы предоставляете этому блоку, должны соответствовать ограничениям программного обеспечения MATLAB Coder™ (если вы используете функции MATLAB для моделирования системы) и программного обеспечения Simulink Coder (если вы используете блоки Simulink Function для моделирования системы).
В этом примере показано, как использовать блок Фильтра частиц в System Identification Toolbox. Параметры передаточной функции в дискретном времени оцениваются рекурсивно, где параметры обновляются на каждом временном шаге по мере поступления новой информации.
close_system('pfBlockExample',0)
Удалите папку примера файла из пути MATLAB.
rmpath(fullfile(matlabroot,'examples','ident','main'));
[1] Симон, Дани. Оптимальная оценка состояния: Калман, бесконечность H и нелинейные подходы. John Wiley & Sons, 2006.
[2] Doucet, Arnaud, and Adam M. Johansen. «руководство по фильтрации и сглаживанию частиц: пятнадцать лет спустя». Справочник по нелинейной фильтрации 12.656-704 (2009): 3.
Extended Kalman Filter | Particle Filter | Unscented Kalman Filter