В этом примере показано, как выполнить и диагностировать идентификацию системы SISO с помощью данных частотной характеристики (FRD). Методы, объясненные здесь, могут также быть применены к моделям MIMO и данным ввода - вывода частотного диапазона.
Когда вы используете tfest
команда, чтобы оценить модель передаточной функции SISO из данных частотной характеристики, алгоритм оценки минимизирует следующую потерю наименьших квадратов (стоимость) функция:
Здесь W
зависимый частотой вес, который вы задаете, G
передаточная функция, которая должна быть оценена, f
измеренные данные частотной характеристики, и частота. Nf
частоты номера, на которых данные доступны. ошибка частотной характеристики.
В этом примере вы сначала оцениваете модель, не предварительно обрабатывая данные или с помощью опций оценки, чтобы задать фильтр взвешивания. Вы затем применяете эти методы поиска и устранения неисправностей, чтобы улучшить оценку модели.
Загрузите измеренные данные о частотной характеристике непрерывного времени.
load troubleshooting_example_data Gfrd;
Gfrd
idfrd
объект, который хранит данные.
Оцените первоначальную модель передаточной функции с 11 полюсами и 10 нулями при помощи данных об оценке.
Gfit = tfest(Gfrd,11,10);
Постройте величину частотной характеристики предполагаемой модели и измеренных данных частотной характеристики.
bodemag(Gfrd,Gfit); ylim([-100 0]) legend('Measured','Estimated')
Предполагаемая модель содержит побочную динамику. Алгоритм оценки пропускает овраг на уровне 60 рад/с и резонирующий peaks после этого. Поэтому модель не является подходящим вариантом к данным.
Алгоритм минимизирует величину квадратичной невязки, , в функции потерь. Постройте это количество как функцию частоты. Эта диаграмма погрешностей обеспечивает представление, которого точки данных способствуют больше всего функции потерь, и так являются вероятными ограничивающими факторами во время оценки. График может помочь вам идентифицировать, почему существуют побочные или неполученные движущие силы.
Поскольку вы не задали зависимый частотой вес, 1.
w = Gfrd.Frequency; r1 = squeeze(freqresp(Gfit,w)); r2 = squeeze(freqresp(Gfrd,w)); fitError = r1-r2; semilogx(w,abs(fitError).^2) title('Weighted Estimation Error'); xlabel('Frequency (rad/s)'); ylabel('Magnitude (abs)')
Из данных, модели и диаграмм погрешностей вы видите что:
Самые большие подходящие ошибки ниже 10 рад/с.
Алгоритм фокусируется на подборе кривой шумным высоким точкам данных величины ниже 10 рад/с, которые имеют большой вклад в функцию потерь оптимизации. В результате алгоритм присваивает побочные полюса и нули в эту область данных. Чтобы решить эту проблему, можно предварительно обработать данные, чтобы улучшить отношение сигнал-шум в этой области. Можно также использовать зависимые частотой веса, чтобы заставить алгоритм поместить меньше особого внимания на эту область.
Ниже приблизительно 40 рад/с большинство изменений данных происходит из-за шума. Нет никаких значительных системных режимов (овраги или peaks) в данных. Чтобы решить эту проблему, можно использовать фильтр скользящего среднего значения по данным, чтобы сглаживать измеренный отклик.
Алгоритм игнорирует овраг приблизительно 60 рад/с и три слегка ослабленных резонирующих peaks, которые следуют за ним. Эти функции способствуют мало функции потерь, потому что подходящая ошибка мала на этих частотах. Чтобы решить эту проблему, можно задать зависимые частотой веса, чтобы заставить алгоритм уделить больше внимания этим частотам.
Чтобы улучшить предполагаемое качество модели, предварительно обработайте данные. Для этого вы обрезаете низкие фрагменты сигнала к шуму данных ниже 1 рад/с и выше 2e4 рад/с, которые не интересны. Затем вы используете фильтр скользящего среднего значения, чтобы сглаживать данные в низкочастотной области высокой величины ниже 40 рад/с. На этих частотах данные имеют низкое отношение сигнал-шум, но имеют динамику, что вы интересуетесь получением. Не применяйте фильтр на частотах выше 40 рад/с, чтобы не сглаживать данные, где вы видите овраг и три peaks, которые следуют за ним.
Сделайте копию исходного idfrd
объект данных.
GfrdProcessed = Gfrd;
Обрежьте данные ниже 1 рад/с и выше 2e4 рад/с.
GfrdProcessed = fselect(GfrdProcessed,1,2e4);
Примените фильтр скользящего среднего значения в центре с тремя точками, чтобы сгладить данные частотной характеристики ниже 40 рад/с, которые содержат побочную динамику. Данные об ответе хранятся в ResponseData
свойство объекта.
w = GfrdProcessed.Frequency; f = squeeze(GfrdProcessed.ResponseData); idx = w<40; f(idx) = movmean(f(idx),3);
Здесь f(idx)
данные частотной характеристики на частотах меньше чем 40 рад/с.
Поместите отфильтрованные данные назад в исходный объект данных.
GfrdProcessed.ResponseData = f;
Отобразите исходные и предварительно обработанные данные на графике.
bodemag(Gfrd,GfrdProcessed); ylim([-100 0]); legend('Original data','Preprocessed data');
График показывает, что все желаемые движущие силы неповреждены после предварительной обработки.
Используйте низкий вес для низкочастотной области менее чем 10 рад/с, где побочные движущие силы существуют. Этот низкий вес и сглаживание, примененное ранее к этим данным, уменьшают шанс побочного peaks в предполагаемом ответе модели в этой области.
Weight = ones(size(f)); idx = w<10; Weight(idx) = Weight(idx)/10;
Используйте высокий вес для данных в частотном диапазоне 40-6e3 rad/s, где вы хотите получить динамику, но величина данных об ответе является низкой.
idx = w>40 & w<6e3; Weight(idx) = Weight(idx)*30;
Задайте веса в WeightingFilter
опция опции оценки установлена.
tfestOpt = tfestOptions('WeightingFilter',Weight);
Обратите внимание на то, что Weight
пользовательский фильтр взвешивания. Можно также задать WeightingFilter
как 'inv'
или 'invsqrt'
для данных частотной характеристики. Эти опции задают вес как и , соответственно. Эти опции позволяют вам быстро протестировать эффект использования более высокого веса для низких областей величины данных. 'invsqrt'
обычно хороший начальный выбор. Если эти веса не приводят к хорошим результатам оценки, можно обеспечить пользовательские веса как показано в этом примере.
Оцените модель передаточной функции с 11 полюсами и 10 нулями с помощью предварительно обработанных данных и заданного фильтра взвешивания.
GfitNew = tfest(GfrdProcessed,11,10,tfestOpt);
Отобразите на графике исходные данные, начальный ответ модели и новый ответ модели.
bodemag(Gfrd,Gfit,GfitNew); ylim([-100 0]); legend('Original Data','Original Model','New Model');
Постройте ошибку расчета. Вычислите ошибку расчета включением фильтра взвешивания Weight
то, что вы использовали для оценки GfitNew
.
w = GfrdProcessed.Frequency; r1 = squeeze(freqresp(GfitNew,w)); r2 = squeeze(freqresp(GfrdProcessed,w)); fitErrorNew = Weight.*(r1-r2); semilogx(w,abs(fitErrorNew).^2) title('Weighted Estimation Error'); xlabel('Frequency (rad/s)'); ylabel('Magnitude (abs)');
Новая модель успешно получает всю системную динамику интереса.
Можно использовать взвешенную диаграмму погрешностей для дальнейшего поиска и устранения неисправностей, если начальный выбор весов не приводит к удовлетворительному результату.