exponenta event banner

Диагностика неисправностей центробежных насосов с использованием остаточного анализа

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

В качестве примера приведен анализ центробежных насосов, представленный в книге Rolf Isermann «Приложения диагностики неисправностей» [1]. Он использует функциональные возможности от System Identification Toolbox™, Statistics and Machine Learning Toolbox™, Control System Toolbox™ и Simulink™ и не требует Predictive Maintenance Toolbox™.

Многоступенчатые насосы - диагностика по остаточному анализу

Установившиеся уравнения напора насоса и крутящего момента не дают точных результатов, если насос работает с быстро изменяющейся или более широким диапазоном скоростей. Трение и другие потери могут стать значительными, и параметры модели будут зависеть от скорости. Широко применимым подходом в таких случаях является создание модели поведения «черного ящика». Параметры таких моделей не обязательно должны быть физически значимыми. Модель используется в качестве устройства для моделирования известных моделей поведения. Выходные сигналы модели вычитаются из соответствующих измеренных сигналов для вычисления остаточных значений. Свойства остатков, такие как их среднее значение, дисперсия и мощность, используются для различения нормальных и неисправных операций.

Используя статическое уравнение напора насоса и динамические уравнения насос-труба, можно вычислить 4 остатка, как показано на рисунке.

Модель состоит из следующих компонентов:

  • Модель статического насоса: Δpˆ (t) =

  • Динамическая модель трубы: (t) = start3 + θ4Δp (t) +θ5Qˆ (t-1)

  • Динамическая модель трубы насоса: Q ˆˆ (t) = θ3 +θ4Δp (t) ˆ + θ5Q ˆˆ (t-1)

  • Динамическая обратная модель насоса: Mˆmotor (t) = θ6 +θ7ω (t) + θ8ω (t-1) + θ9ω2 (t) + θ10Mˆmotor (t-1)

Модельные параметры start1,..., start10 показывают зависимость от скорости насоса. В этом примере вычисляется кусочно-линейное приближение для параметров. Разделить операционный регион на 3 режима :

  1. ω≤900RPM

  2. 900<ω≤1500RPM

  3. λ > 1500RPM

Нормальный насос работал в диапазоне эталонных скоростей от 0 до 3000 об/мин в замкнутом контуре с контроллером с замкнутым контуром. Опорный вход представляет собой модифицированный сигнал PRBS. Измерения крутящего момента двигателя, крутящего момента насоса, частоты вращения и давления были собраны при частоте выборки 10 Гц. Загрузите измеренные сигналы и постройте график опорной и фактической скоростей насоса (это большие наборы данных, ~ 20 МБ, которые загружаются с сайта файлов поддержки MathWorks).

url = 'https://www.mathworks.com/supportfiles/predmaint/fault-diagnosis-of-centrifugal-pumps-using-residual-analysis/DynamicOperationData.mat';
websave('DynamicOperationData.mat',url);
load DynamicOperationData
figure
plot(t, RefSpeed, t, w)
xlabel('Time (s)')
ylabel('Pump Speed (RPM)')
legend('Reference','Actual')

Определение режимов работы на основе диапазонов скоростей насоса.

I1 = w<=900;            % first operating regime
I2 = w>900 & w<=1500;   % second operating regime
I3 = w>1500;            % third operating regime

Идентификация модели

A. Идентификация модели статического насоса

В уравнении статического насоса, используя измеренные значения скорости (t) насоса и перепада давлений Δp (t) в качестве данных «вход-выход», оцените параметры См. функцию помощникаstaticPumpEst который выполняет эту оценку.

th1 = zeros(3,1);  
th2 = zeros(3,1); 
dpest = nan(size(dp));  % estimated pressure difference
[th1(1), th2(1), dpest(I1)] = staticPumpEst(w, dp, I1);  % Theta1, Theta2 estimates for regime 1
[th1(2), th2(2), dpest(I2)] = staticPumpEst(w, dp, I2);  % Theta1, Theta2 estimates for regime 2
[th1(3), th2(3), dpest(I3)] = staticPumpEst(w, dp, I3);  % Theta1, Theta2 estimates for regime 3
plot(t, dp, t, dpest) % compare measured and predicted pressure differential
xlabel('Time (s)')
ylabel('\Delta P')
legend('Measured','Estimated','Location','best')
title('Static Pump Model Validation')

B. Идентификация динамических моделей труб

Оцените параметры θ3, θ4 и θ5 в уравнении потока выброса трубы Q ˆ (t) = θ3 +θ4Δp (t) + θ5Q ˆ (t-1), используя измеренные значения скорости потока жидкости Q (t) и перепад давления Δp (t) как данные ввода - вывода. См. функцию помощникаdynamicPipeEst который выполняет эту оценку.

th3 = zeros(3,1);  
th4 = zeros(3,1); 
th5 = zeros(3,1);
[th3(1), th4(1), th5(1)] = dynamicPipeEst(dp, Q, I1); % Theta3, Theta4, Theta5 estimates for regime 1
[th3(2), th4(2), th5(2)] = dynamicPipeEst(dp, Q, I2); % Theta3, Theta4, Theta5 estimates for regime 2
[th3(3), th4(3), th5(3)] = dynamicPipeEst(dp, Q, I3); % Theta3, Theta4, Theta5 estimates for regime 3

В отличие от случая модели статического насоса, динамическая модель трубы показывает динамическую зависимость от значений расхода. Для моделирования модели при различных режимах скорости в Simulink создается кусочно-линейная модель с помощью блока «Система LPV» панели инструментов системы управления. См. модель Simulink LPV_pump_pipe и вспомогательная функция simulatePumpPipeModel который выполняет моделирование.

% Check Control System Toolbox availability
ControlsToolboxAvailable = ~isempty(ver('control')) && license('test', 'Control_Toolbox');
if ControlsToolboxAvailable
    % Simulate the dynamic pipe model. Use measured value of pressure as input
    Ts = t(2)-t(1);
    Switch = ones(size(w));
    Switch(I2) = 2;
    Switch(I3) = 3;
    UseEstimatedP = 0;
    Qest_pipe = simulatePumpPipeModel(Ts,th3,th4,th5);
    plot(t,Q,t,Qest_pipe) % compare measured and predicted flow rates
else
    % Load pre-saved simulation results from the piecewise linear Simulink model
    load DynamicOperationData Qest_pipe
    Ts = t(2)-t(1);
    plot(t,Q,t,Qest_pipe)
end
xlabel('Time (s)')
ylabel('Flow rate (Q), m^3/s')
legend('Measured','Estimated','Location','best')
title('Dynamic Pipe Model Validation')

C. Идентификация модели трубопровода динамического насоса

В модели «Динамический насос-трубопровод» используются те же параметры, что и в предыдущей модели (start3, start4, start5), за исключением того, что для моделирования модели требуется использовать расчетный перепад давления, а не измеренный. Следовательно, новая идентификация не требуется. Проверьте, что расчетные значения, указанные в δ 3, start4, start5, дают хорошее воспроизведение динамики насоса-трубы.

if ControlsToolboxAvailable
    UseEstimatedP = 1;
    Qest_pump_pipe = simulatePumpPipeModel(Ts,th3,th4,th5);
    plot(t,Q,t,Qest_pump_pipe) % compare measured and predicted flow rates
else
    load DynamicOperationData Qest_pump_pipe 
    plot(t,Q,t,Qest_pump_pipe)
end

xlabel('Time (s)')
ylabel('Flow rate Q (m^3/s)')
legend('Measured','Estimated','location','best')
title('Dynamic Pump-Pipe Model Validation')

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

D. Идентификация модели динамического обратного насоса

Аналогичным образом могут быть идентифицированы параметры start6,..., start10 путем регрессии измеренных значений крутящего момента при предыдущих измерениях крутящего момента и скорости. Однако полное многоскоростное моделирование полученной кусочно-линейной модели не обеспечивает хорошего соответствия данным. Поэтому пробуют другой подход к моделированию черного ящика, который включает в себя идентификацию нелинейной модели ARX с рациональными регрессорами для соответствия данным.

% Use first 300 samples out of 550 for identification
N = 350;
sys3 = identifyNonlinearARXModel(Mmot,w,Q,Ts,N)
sys3 =
Nonlinear ARX model with 1 output and 2 inputs
 Inputs: u1, u2
 Outputs: y1
 Standard regressors corresponding to the orders:
   na = [2]
   nb = [2 1]
   nk = [0 1]
 Custom regressors:
   u1(t-2)^2
   u1(t)*u2(t-2)
   u2(t)^2
 Nonlinear regressors:
  none
 Model output is linear in regressors.
Sample time: 0.1 seconds

Status:                                          
Estimated using NLARX on time domain data.       
Fit to estimation data: 50.55% (simulation focus)
FPE: 1759, MSE: 3214
Mmot_est = sim(sys3,[w Q]);
plot(t,Mmot,t,Mmot_est) % compare measured and predicted motor torque
xlabel('Time (s)')
ylabel('Motor Torque (Nm)')
legend('Measured','Estimated','location','best')
title('Inverse pump model validation')

Образование остатков

Определите остаток модели как разность между измеренным сигналом и соответствующим выводом модели. Вычислите четыре остатка, соответствующие четырем компонентам модели.

r1 = dp - dpest;
r2 = Q - Qest_pipe;
r3 = Q - Qest_pump_pipe;

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

r4 = Mmot - movmean(Mmot_est,[1 5]);

Взгляд на учебные остатки:

figure
subplot(221)
plot(t,r1)
ylabel('Static pump - r1')
subplot(222)
plot(t,r2)
ylabel('Dynamic pipe - r2')
subplot(223)
plot(t,r3)
ylabel('Dynamic pump-pipe - r3')
xlabel('Time (s)')
subplot(224)
plot(t,r4)
ylabel('Dynamic inverse pump - r4')
xlabel('Time (s)')

Экстракция остаточных характеристик

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

Рассмотрим набор из 20 экспериментов по насосно-трубопроводной системе с использованием входных реализаций PRBS. Набор экспериментов повторяют для каждого из следующих режимов:

  1. Здоровый насос

  2. Отказ 1: Износ при зазоре

  3. Неисправность 2: Небольшие отложения на выходе из рабочего колеса

  4. Неисправность 3: отложения на входе в рабочее колесо

  5. Отказ 4: Абразивный износ на выходе из рабочего колеса

  6. Неисправность 5: Сломанное лезвие

  7. Неисправность 6: Кавитация

  8. Неисправность 7: Смещение датчика скорости

  9. Неисправность 8: Смещение расходомера

  10. Неисправность 9: Смещение датчика давления

Загрузить экспериментальные данные

url = 'https://www.mathworks.com/supportfiles/predmaint/fault-diagnosis-of-centrifugal-pumps-using-residual-analysis/MultiSpeedOperationData.mat';
websave('MultiSpeedOperationData.mat',url);
load MultiSpeedOperationData
% Generate operation mode labels
Labels = {'Healthy','ClearanceGapWear','ImpellerOutletDeposit',...
    'ImpellerInletDeposit','AbrasiveWear','BrokenBlade','Cavitation','SpeedSensorBias',...
    'FlowmeterBias','PressureSensorBias'};

Вычислить остатки для каждого ансамбля и каждого режима работы. Это занимает несколько минут. Следовательно, остаточные данные сохраняются в файле данных. Запустить helperComputeEnsembleResidues для генерации остатков, как в:

% HealthyR = helperComputeEnsembleResidues(HealthyEnsemble,Ts,sys3,th1,th2,th3,th4,th5); % Healthy data residuals
% Load pre-saved data from "helperComputeEnsembleResidues" run
url = 'https://www.mathworks.com/supportfiles/predmaint/fault-diagnosis-of-centrifugal-pumps-using-residual-analysis/Residuals.mat';
websave('Residuals.mat',url);
load Residuals

Особенность остатков, которые имели бы наибольшую степень различения режимов, априори не известна. Таким образом генерируют несколько признаков-кандидатов: средняя, максимальная амплитуда, дисперсия, куртоз и 1-норма для каждого остатка. Все функции масштабируются с использованием диапазона значений в здоровом ансамбле.

CandidateFeatures = {@mean, @(x)max(abs(x)), @kurtosis, @var, @(x)sum(abs(x))};
FeatureNames = {'Mean','Max','Kurtosis','Variance','OneNorm'};
% generate feature table from gathered residuals of each fault mode
[HealthyFeature, MinMax] = helperGenerateFeatureTable(HealthyR, CandidateFeatures, FeatureNames);
Fault1Feature  = helperGenerateFeatureTable(Fault1R,  CandidateFeatures, FeatureNames, MinMax);
Fault2Feature  = helperGenerateFeatureTable(Fault2R,  CandidateFeatures, FeatureNames, MinMax);
Fault3Feature  = helperGenerateFeatureTable(Fault3R,  CandidateFeatures, FeatureNames, MinMax);
Fault4Feature  = helperGenerateFeatureTable(Fault4R,  CandidateFeatures, FeatureNames, MinMax);
Fault5Feature  = helperGenerateFeatureTable(Fault5R,  CandidateFeatures, FeatureNames, MinMax);
Fault6Feature  = helperGenerateFeatureTable(Fault6R,  CandidateFeatures, FeatureNames, MinMax);
Fault7Feature  = helperGenerateFeatureTable(Fault7R,  CandidateFeatures, FeatureNames, MinMax);
Fault8Feature  = helperGenerateFeatureTable(Fault8R,  CandidateFeatures, FeatureNames, MinMax);
Fault9Feature  = helperGenerateFeatureTable(Fault9R,  CandidateFeatures, FeatureNames, MinMax);

В каждой таблице признаков имеется по 20 признаков (по 5 признаков для каждого сигнала остатка). Каждая таблица содержит 50 наблюдений (строк), по одному из каждого эксперимента.

N = 50; % number of experiments in each mode
FeatureTable = [...
   [HealthyFeature(1:N,:), repmat(Labels(1),[N,1])];...
   [Fault1Feature(1:N,:),  repmat(Labels(2),[N,1])];...
   [Fault2Feature(1:N,:),  repmat(Labels(3),[N,1])];...
   [Fault3Feature(1:N,:),  repmat(Labels(4),[N,1])];...
   [Fault4Feature(1:N,:),  repmat(Labels(5),[N,1])];...
   [Fault5Feature(1:N,:),  repmat(Labels(6),[N,1])];...
   [Fault6Feature(1:N,:),  repmat(Labels(7),[N,1])];...
   [Fault7Feature(1:N,:),  repmat(Labels(8),[N,1])];...
   [Fault8Feature(1:N,:),  repmat(Labels(9),[N,1])];...
   [Fault9Feature(1:N,:),  repmat(Labels(10),[N,1])]];
FeatureTable.Properties.VariableNames{end} = 'Condition';

% Preview some samples of training data
disp(FeatureTable([2 13 37 49 61 62 73 85 102 120],:))
     Mean1       Mean2      Mean3      Mean4      Max1        Max2        Max3        Max4       Kurtosis1    Kurtosis2    Kurtosis3    Kurtosis4     Variance1    Variance2    Variance3    Variance4    OneNorm1    OneNorm2    OneNorm3    OneNorm4            Condition        
    ________    _______    _______    _______    _______    ________    ________    _________    _________    _________    _________    __________    _________    _________    _________    _________    ________    ________    ________    ________    _________________________

     0.32049     0.6358     0.6358    0.74287    0.39187     0.53219     0.53219     0.041795      0.18957    0.089492     0.089489              0     0.45647       0.6263       0.6263      0.15642      0.56001    0.63541     0.63541      0.24258    {'Healthy'              }
     0.21975    0.19422    0.19422    0.83704          0     0.12761     0.12761      0.27644      0.18243     0.19644      0.19643        0.20856    0.033063      0.16772      0.16773     0.025119     0.057182    0.19344     0.19344     0.063167    {'Healthy'              }
      0.1847    0.25136    0.25136    0.87975    0.32545     0.13929      0.1393     0.084162      0.72346    0.091488     0.091485       0.052552    0.063757      0.18371      0.18371     0.023845      0.10671    0.25065     0.25065      0.04848    {'Healthy'              }
           1          1          1          0    0.78284     0.94535     0.94535       0.9287      0.41371     0.45927      0.45926        0.75934     0.92332            1            1      0.80689      0.99783          1           1       0.9574    {'Healthy'              }
     -2.6545    0.90555    0.90555    0.86324     1.3037      0.7492      0.7492      0.97823    -0.055035     0.57019      0.57018         1.4412      1.4411      0.73128      0.73128      0.80573       3.2084    0.90542     0.90542      0.49257    {'ClearanceGapWear'     }
    -0.89435    0.43384    0.43385     1.0744    0.82197     0.30254     0.30254    -0.022325      0.21411    0.098504       0.0985      -0.010587     0.55959      0.29554      0.29554     0.066693       1.0432    0.43326     0.43326      0.13785    {'ClearanceGapWear'     }
     -1.2149    0.53579    0.53579     1.0899    0.87439     0.47339     0.47339      0.29547     0.058946    0.048138     0.048137        0.17864     0.79648      0.48658      0.48658      0.25686       1.4066     0.5353      0.5353      0.26663    {'ClearanceGapWear'     }
     -1.0949    0.44616    0.44616      1.143    0.56693     0.19719     0.19719    -0.012055     -0.10819     0.32603      0.32603     -0.0033592     0.43341      0.12857      0.12857     0.038392       1.2238    0.44574     0.44574     0.093243    {'ClearanceGapWear'     }
     -0.1844    0.16651    0.16651    0.87747    0.25597    0.080265    0.080265      0.49715       0.5019     0.29939      0.29938         0.5338    0.072397     0.058024     0.058025       0.1453      0.20263    0.16566     0.16566      0.14216    {'ImpellerOutletDeposit'}
     -3.0312     0.9786     0.9786    0.75241      1.473     0.97839     0.97839       1.0343    0.0050647      0.4917       0.4917        0.89759      1.7529       0.9568       0.9568       0.8869       3.6536    0.97859     0.97859      0.62706    {'ImpellerOutletDeposit'}

Конструкция классификатора

A. Визуализация разделяемости режимов с использованием графика рассеяния

Начните анализ с визуального осмотра элементов. Для этого рассмотрим Отказ 1: Износ при зазоре. Чтобы просмотреть, какие функции наиболее подходят для обнаружения этой неисправности, создайте график рассеяния характеристик с метками «Healthy» и «HapeGapWear».

T = FeatureTable(:,1:20);
P = T.Variables;
R = FeatureTable.Condition;
I = strcmp(R,'Healthy') | strcmp(R,'ClearanceGapWear');
f = figure;
gplotmatrix(P(I,:),[],R(I))
f.Position(3:4) = f.Position(3:4)*1.5;

Хотя они не видны четко, особенности в колонках 1 и 17 обеспечивают наибольшее разделение. Более внимательно проанализируйте эти особенности.

f = figure;
Names = FeatureTable.Properties.VariableNames;
J = [1 17];
fprintf('Selected features for clearance gap fault: %s\n',strjoin(Names(J),', '))
Selected features for clearance gap fault: Mean1, OneNorm1
gplotmatrix(P(I,[1 17]),[],R(I))

График теперь ясно показывает, что особенности Mean1 и OneNorm1 могут использоваться для отделения здорового режима от режима отказа зазора. Аналогичный анализ может быть выполнен для каждого режима отказа. Во всех случаях можно найти набор функций, различающих режимы отказов. Следовательно, обнаружение ошибочного поведения всегда возможно. Однако локализация отказов является более сложной задачей, поскольку на одни и те же функции влияет множество типов отказов. Например, характеристики Mean1 (среднее значение r1) и OneNorm1 (1-норма r1) показывают изменение для многих типов отказов. Тем не менее, некоторые неисправности, такие как смещения датчиков, легче изолировать там, где неисправность может быть отделена во многих характеристиках.

Для трех неисправностей смещения датчика выберите элементы из ручной проверки графика рассеяния.

figure;
I = strcmp(R,'Healthy') | strcmp(R,'PressureSensorBias') | strcmp(R,'SpeedSensorBias') | strcmp(R,'FlowmeterBias');
J = [1 4 6 16 20]; % selected feature indices
fprintf('Selected features for sensors'' bias: %s\n',strjoin(Names(J),', '))
Selected features for sensors' bias: Mean1, Mean4, Max2, Variance4, OneNorm4
gplotmatrix(P(I,J),[],R(I))

График рассеяния выбранных элементов показывает, что 4 режима можно различить на одной или нескольких парах элементов. Обучите 20-членный классификатор Tree Bagger для уменьшенного набора неисправностей (только смещения датчиков) с использованием уменьшенного набора функций.

rng default % for reproducibility
Mdl = TreeBagger(20, FeatureTable(I,[J 21]), 'Condition',...
   'OOBPrediction','on',...
   'OOBPredictorImportance','on');
figure
plot(oobError(Mdl))
xlabel('Number of trees')
ylabel('Misclassification probability')

Ошибка классификации меньше 3%. Таким образом, можно выбирать и работать с меньшим набором признаков для классификации определенного подмножества неисправностей.

B. Классификация по нескольким классам с использованием приложения Classification Learner

В предыдущем разделе основное внимание уделялось ручному контролю графиков рассеяния для уменьшения набора функций для определенных типов отказов. Этот подход может быть утомительным и может охватывать не все типы отказов. Можете ли вы разработать классификатор, который сможет обрабатывать все режимы отказов в более автоматизированном режиме? В окне «Статистика и инструментарий машинного обучения» имеется множество классификаторов. Быстрый способ попробовать многие из них и сравнить их показатели - использовать приложение Classification Learner.

  1. Запустите приложение Classification Learner и выберите элемент FeatureTable в рабочей области в качестве рабочих данных для новой сессии. Отложите 20% данных (10 выборок каждого режима) для проверки отсутствия.

  2. Выберите Все (All) в разделе Тип модели (Model Type) главной вкладки. Затем нажмите кнопку «Поезд».

  3. За короткое время обучается около 20 классификаторов. Их точность отображается рядом с их именами под панелью истории. Лучше всего работает линейный классификатор SVM, который обеспечивает 86% точность выборок. Этот классификатор имеет определенные трудности в идентификации «HapleGapWear», который он классифицирует как «ImpellerDepose» 40% времени.

  4. Чтобы получить графическое представление о производительности, откройте график «Матрица путаницы» в разделе PLOTS главной вкладки. На графике показана производительность выбранного классификатора (здесь - Линейный классификатор SVM).

Экспортируйте наиболее эффективный классификатор в рабочую область и используйте его для прогнозирования новых измерений.

Резюме

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

Подход к диагностике отказов на остаточной основе включает в себя следующие шаги:

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

  2. Вычисляют остатки как разность между измеренными и модельными полученными сигналами. Остатки могут нуждаться в дополнительной фильтрации для улучшения возможности устранения неисправности.

  3. Извлекайте из каждого остаточного сигнала такие характеристики, как пиковая амплитуда, мощность, куртоз и т.д.

  4. Используйте функции обнаружения и классификации отказов с использованием методов обнаружения и классификации аномалий.

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

Ссылки

  1. Изерманн, Рольф, приложения для диагностики неисправностей. Мониторинг состояния на основе модели: исполнительные механизмы, приводы, машины, установки, датчики и отказоустойчивая система, издание 1, Springer-Verlag Berlin Heidelberg, 2011.

Вспомогательные функции

Оценка параметров статического уравнения насоса

function [x1, x2, dpest] = staticPumpEst(w, dp, I)
%staticPumpEst Static pump parameter estimation in a varying speed setting
% I: sample indices for the selected operating region.

w1 = [0; w(I)];
dp1 = [0; dp(I)];
R1 = [w1.^2 w1];
x = pinv(R1)*dp1;
x1 = x(1);  
x2 = x(2);  

dpest = R1(2:end,:)*x;
end

Динамическая оценка параметров трубы

function [x3, x4, x5, Qest] = dynamicPipeEst(dp, Q, I)
%dynamicPipeEst Dynamic pipe parameter estimation in a varying speed setting
% I: sample indices for the selected operating region.

Q = Q(I);
dp = dp(I);
R1 = [0; Q(1:end-1)];
R2 = dp; R2(R2<0) = 0; R2 = sqrt(R2);
R = [ones(size(R2)), R2, R1];

% Remove out-of-regime samples
ii = find(I);
j = find(diff(ii)~=1);
R = R(2:end,:); R(j,:) = [];
y = Q(2:end); y(j) = [];
x = R\y;

x3 = x(1);
x4 = x(2);
x5 = x(3);

Qest = R*x;
end

Динамическое многорежимное моделирование насосно-трубной модели с использованием блока Система ННД.

function Qest = simulatePumpPipeModel(Ts,th3,th4,th5)
%simulatePumpPipeModel Piecewise linear modeling of dynamic pipe system.
% Ts: sample time
% w: Pump rotational speed
% th1, th2, th3 are estimated model parameters for the 3 regimes.
% This function requires Control System Toolbox.

ss1 = ss(th5(1),th4(1),th5(1),th4(1),Ts);
ss2 = ss(th5(2),th4(2),th5(2),th4(2),Ts);
ss3 = ss(th5(3),th4(3),th5(3),th4(3),Ts);
offset = permute([th3(1),th3(2),th3(3)]',[3 2 1]);
OP = struct('Region',[1 2 3]');
sys = cat(3,ss1,ss2,ss3);
sys.SamplingGrid = OP;

assignin('base','sys',sys)
assignin('base','offset',offset)
mdl = 'LPV_pump_pipe';
sim(mdl);
Qest = logsout.get('Qest');
Qest = Qest.Values;
Qest = Qest.Data;
end

Определение динамической модели для обратной динамики насоса.

function syse = identifyNonlinearARXModel(Mmot,w,Q,Ts,N)
%identifyNonlinearARXModel Identify a nonlinear ARX model for 2-input (w, Q), 1-output (Mmot) data.
% Inputs:
%  w: rotational speed
%  Q: Flow rate
%  Mmot: motor torque
%  N: number of data samples to use
% Outputs:
%  syse: Identified model
%
% This function uses NLARX estimator from System Identification Toolbox.

sys = idnlarx([2 2 1 0 1],'','CustomRegressors',{'u1(t-2)^2','u1(t)*u2(t-2)','u2(t)^2'});
data = iddata(Mmot,[w Q],Ts);
opt = nlarxOptions;
opt.Focus = 'simulation';
opt.SearchOptions.MaxIterations = 500;
syse = nlarx(data(1:N),sys,opt);
end

Связанные темы