В этом примере показано, как использовать модель Simulink, чтобы сгенерировать отказ и здоровые данные. Отказ и здоровые данные используются, чтобы разработать алгоритм мониторинга состояния. Пример использует систему передачи и моделирует зубной отказ механизма, отказ дрейфа датчика и отказ износа вала.
Модель преобразования регистра передачи использует блоки Simscape Driveline, чтобы смоделировать простую систему передачи. Система передачи состоит из диска крутящего момента, карданного вала, муфты и высоких и низких механизмов, соединенных с выходным валом.
mdl = 'pdmTransmissionCasing';
open_system(mdl)
Система передачи включает датчик вибрации, который контролирует случающиеся колебания. Случающаяся модель переводит вал угловое смещение в линейное смещение на преобразовании регистра. Преобразование регистра моделируется как массовая пружинная система демпфера, и вибрация (заключающий ускорение в корпус) измеряется от преобразования регистра.
open_system([mdl '/Casing'])
Система передачи включает модели отказа для дрейфа датчика вибрации, зубного отказа механизма и износа вала. Отказ дрейфа датчика легко моделируется путем представления смещения в модели датчика. Смещением управляет переменная SDrift
модели, отметьте тот
SDrift=0
не подразумевает отказа датчика.
open_system([mdl '/Vibration sensor with drift'])
Отказ износа вала моделируется различной подсистемой. В этом случае варианты подсистемы изменяют затухание вала, но различная подсистема могла использоваться, чтобы полностью изменить реализацию модели вала. Выбранным вариантом управляет модель variable ShaftWear
, отметьте that ShaftWear=0
не подразумевает отказа вала.
open_system([mdl '/Shaft'])
open_system([mdl,'/Shaft/Output Shaft'])
Зубной отказ механизма моделируется путем введения крутящего момента воздействия в фиксированной позиции во вращении карданного вала. Положение вала измеряется в радианах и когда положение вала - в маленьком окне приблизительно 0, сила воздействия прикладывается к валу. Величиной воздействия управляет переменная ToothFaultGain
модели, отметьте тот
ToothFaultGain=0
не подразумевает зубного отказа механизма.
Модель передачи сконфигурирована с переменными, которые управляют присутствием и серьезностью трех различных типов отказа, дрейфа датчика, зуба механизма и износа вала. Путем варьирования переменных модели, SDrift
, ToothFaultGain
, и ShaftWear
, можно создать данные о вибрации для различных типов отказа. Используйте массив Simulink.SimulationInput
объекты задать много различных сценариев симуляции. Например, выберите массив значений для каждой из переменных модели и затем используйте ndgrid
функция, чтобы создать Simulink.SimulationInput
для каждой комбинации значений переменных модели.
toothFaultArray = -2:2/10:0; % Tooth fault gain values sensorDriftArray = -1:0.5:1; % Sensor drift offset values shaftWearArray = [0 -1]; % Variants available for drive shaft conditions % Create an n-dimensional array with combinations of all values [toothFaultValues,sensorDriftValues,shaftWearValues] = ... ndgrid(toothFaultArray,sensorDriftArray,shaftWearArray); for ct = numel(toothFaultValues):-1:1 % Create a Simulink.SimulationInput for each combination of values siminput = Simulink.SimulationInput(mdl); % Modify model parameters siminput = setVariable(siminput,'ToothFaultGain',toothFaultValues(ct)); siminput = setVariable(siminput,'SDrift',sensorDriftValues(ct)); siminput = setVariable(siminput,'ShaftWear',shaftWearValues(ct)); % Collect the simulation input in an array gridSimulationInput(ct) = siminput; end
Так же создайте комбинации случайных значений для каждой переменной модели. Убедитесь, что включали 0
значение так, чтобы были комбинации, где только подмножества трех типов отказа представлены.
rng('default'); % Reset random seed for reproducibility toothFaultArray = [0 -rand(1,6)]; % Tooth fault gain values sensorDriftArray = [0 randn(1,6)/8]; % Sensor drift offset values shaftWearArray = [0 -1]; % Variants available for drive shaft conditions %Create an n-dimensional array with combinations of all values [toothFaultValues,sensorDriftValues,shaftWearValues] = ... ndgrid(toothFaultArray,sensorDriftArray,shaftWearArray); for ct=numel(toothFaultValues):-1:1 % Create a Simulink.SimulationInput for each combination of values siminput = Simulink.SimulationInput(mdl); % Modify model parameters siminput = setVariable(siminput,'ToothFaultGain',toothFaultValues(ct)); siminput = setVariable(siminput,'SDrift',sensorDriftValues(ct)); siminput = setVariable(siminput,'ShaftWear',shaftWearValues(ct)); % Collect the simulation input in an array randomSimulationInput(ct) = siminput; end
С массивом Simulink.SimulationInput
объекты задали, используют generateSimulationEnsemble
функционируйте, чтобы запустить симуляции. generateSimulationEnsemble
функция конфигурирует модель, чтобы сохранить записанные данные в файл, использовать формат расписания в логгировании сигнала и сохранить Simulink.SimulationInput
объекты в сохраненном файле. generateSimulationEnsemble
функция возвращает флаг состояния, указывающий ли симуляция, завершенная успешно.
Код выше создал 110 входных параметров симуляции из значений переменных с координатной сеткой и 98
симуляция вводит от значений случайной переменной, дающих 208 общих симуляций. Выполнение этих 208 параллельных симуляций занимает приблизительно десять минут на стандартном рабочем столе и генерирует приблизительно 10 ГБ данных, возможность, чтобы только запустить первые 10 симуляций предоставляется для удобства.
% Run the simulations and create an ensemble to manage the simulation results if ~exist(fullfile(pwd,'Data'),'dir') mkdir(fullfile(pwd,'Data')) % Create directory to store results end runAll = true; if runAll [ok,e] = generateSimulationEnsemble([gridSimulationInput, randomSimulationInput], ... fullfile(pwd,'Data'),'UseParallel', true); else [ok,e] = generateSimulationEnsemble(gridSimulationInput(1:10), fullfile(pwd,'Data')); %#ok<*UNRCH> end
[28-Feb-2018 13:17:31] Checking for availability of parallel pool... [28-Feb-2018 13:17:37] Loading Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [28-Feb-2018 13:17:56] Configuring simulation cache folder on parallel workers... [28-Feb-2018 13:17:57] Running SetupFcn on parallel workers... [28-Feb-2018 13:18:01] Loading model on parallel workers... [28-Feb-2018 13:18:02] Transferring base workspace variables used in the model to parallel workers... [28-Feb-2018 13:18:07] Running simulations... [28-Feb-2018 13:18:29] Completed 1 of 208 simulation runs [28-Feb-2018 13:18:29] Completed 2 of 208 simulation runs [28-Feb-2018 13:18:30] Completed 3 of 208 simulation runs ... [28-Feb-2018 13:24:22] Completed 204 of 208 simulation runs [28-Feb-2018 13:24:28] Completed 205 of 208 simulation runs [28-Feb-2018 13:24:28] Completed 206 of 208 simulation runs [28-Feb-2018 13:24:28] Completed 207 of 208 simulation runs [28-Feb-2018 13:24:29] Completed 208 of 208 simulation runs [28-Feb-2018 13:24:33] Cleaning up parallel workers...
generateSimulationEnsemble
запустил и регистрировал результаты симуляции. Создайте ансамбль симуляции, чтобы обработать и анализировать результаты симуляции с помощью simulationEnsembleDatastore
команда.
ens = simulationEnsembleDatastore(fullfile(pwd,'Data'));
simulationEnsembleDatastore
команда создала объект ансамбля, который указывает на результаты симуляции. Используйте объект ансамбля подготовить и анализировать данные в каждом члене ансамбля. Списки объектов ансамбля переменные данных в ансамбле и по умолчанию всех переменных выбраны для чтения.
ens
ens = simulationEnsembleDatastore with properties: DataVariables: [6×1 string] IndependentVariables: [0×0 string] ConditionVariables: [0×0 string] SelectedVariables: [6×1 string] NumMembers: 208 LastMemberRead: [0×0 string]
ens.SelectedVariables
ans = 6×1 string array
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
"xFinal"
"xout"
Поскольку анализ только считал Vibration
и Tacho
сигналы и Simulink.SimulationInput
. Simulink.SimulationInput
использовали значения переменных модели в симуляции и используется, чтобы создать метки отказа для членов ансамбля. Используйте ансамбль read
команда, чтобы получить данные члена ансамбля.
ens.SelectedVariables = ["Vibration" "Tacho" "SimulationInput"]; data = read(ens)
data=1×3 table
Vibration Tacho SimulationInput
___________________ ___________________ ______________________________
[40272×1 timetable] [40272×1 timetable] [1×1 Simulink.SimulationInput]
Извлеките сигнал вибрации из возвращенных данных и постройте его.
vibration = data.Vibration{1}; plot(vibration.Time,vibration.Data) title('Vibration') ylabel('Acceleration')
Первые 10 секунд симуляции содержат данные, где система передачи запускает; поскольку анализ отбрасывает эти данные.
idx = vibration.Time >= seconds(10); vibration = vibration(idx,:); vibration.Time = vibration.Time - vibration.Time(1);
Tacho
сигнал содержит импульсы для вращений диска и валов загрузки, но анализ, и в частности время синхронное усреднение, требуют времен вращений вала. Следующий код отбрасывает первые 10 секунд Tacho
данные и находят времена вращения вала в tachoPulses
.
tacho = data.Tacho{1}; idx = tacho.Time >= seconds(10); tacho = tacho(idx,:); plot(tacho.Time,tacho.Data) title('Tacho pulses') legend('Drive shaft','Load shaft') % Load shaft rotates more slowly than drive shaft
idx = diff(tacho.Data(:,2)) > 0.5; tachoPulses = tacho.Time(find(idx)+1)-tacho.Time(1)
tachoPulses = 8×1 duration array
2.8543 sec
6.6508 sec
10.447 sec
14.244 sec
18.04 sec
21.837 sec
25.634 sec
29.43 sec
Simulink.SimulationInput.Variables
свойство содержит значения параметров отказа, используемых в симуляции, эти значения позволяют нам создавать метки отказа для каждого члена ансамбля.
vars = data.SimulationInput{1}.Variables; idx = strcmp({vars.Name},'SDrift'); if any(idx) sF = abs(vars(idx).Value) > 0.01; % Small drift values are not faults else sF = false; end idx = strcmp({vars.Name},'ShaftWear'); if any(idx) sV = vars(idx).Value < 0; else sV = false; end if any(idx) idx = strcmp({vars.Name},'ToothFaultGain'); sT = abs(vars(idx).Value) < 0.1; % Small tooth fault values are not faults else sT = false end faultCode = sF + 2*sV + 4*sT; % A fault code to capture different fault conditions
Обработанная вибрация и сигналы tacho и метки отказа добавляются к ансамблю, чтобы использоваться позже.
sdata = table({vibration},{tachoPulses},sF,sV,sT,faultCode, ... 'VariableNames',{'Vibration','TachoPulses','SensorDrift','ShaftWear','ToothFault','FaultCode'})
sdata=1×6 table
Vibration TachoPulses SensorDrift ShaftWear ToothFault FaultCode
___________________ ______________ ___________ _________ __________ _________
[30106×1 timetable] [8×1 duration] true false false 1
ens.DataVariables = [ens.DataVariables; "TachoPulses"];
Ансамбль ConditionVariables
свойство может использоваться, чтобы идентифицировать переменные в ансамбле, которые содержат условие или данные о метке отказа. Установите свойство содержать недавно созданные метки отказа.
ens.ConditionVariables = ["SensorDrift","ShaftWear","ToothFault","FaultCode"];
Код выше использовался, чтобы обработать один член ансамбля. Чтобы обработать все члены ансамбля, код выше был преобразован в функциональный prepareData
и использование ансамбля hasdata
управляйте, чтобы цикл использовался, чтобы применить prepareData
всем членам ансамбля. Члены ансамбля могут быть обработаны параллельно путем разделения ансамбля и обработки разделов ансамбля параллельно.
reset(ens) runLocal = false; if runLocal % Process each member in the ensemble while hasdata(ens) data = read(ens); addData = prepareData(data); writeToLastMemberRead(ens,addData) end else % Split the ensemble into partitions and process each partition in parallel n = numpartitions(ens,gcp); parfor ct = 1:n subens = partition(ens,n,ct); while hasdata(subens) data = read(subens); addData = prepareData(data); writeToLastMemberRead(subens,addData) end end end
Постройте сигнал вибрации каждого 10-го члена ансамбля, использующего hasdata
и read
команды, чтобы извлечь сигнал вибрации.
reset(ens) ens.SelectedVariables = "Vibration"; figure, ct = 1; while hasdata(ens) data = read(ens); if mod(ct,10) == 0 vibration = data.Vibration{1}; plot(vibration.Time,vibration.Data) hold on end ct = ct + 1; end hold off title('Vibration signals') ylabel('Acceleration')
Теперь, когда данные были убраны и предварительно обработали данные, готово к извлечению функций, чтобы определить функции, чтобы использовать, чтобы классифицировать различные типы отказов. Сначала сконфигурируйте ансамбль так, чтобы он только возвратил обработанные данные.
ens.SelectedVariables = ["Vibration","TachoPulses"];
Поскольку каждый член в ансамбле вычисляет много времен и основанных на спектре функций. Они включают статистику сигнала, такую как среднее значение сигнала, отклонение, пик к пиковым, нелинейным характеристикам сигнала, таким как аппроксимированная энтропия и экспонента Ляпунова и спектральные функции, такие как пиковая частота времени синхронное среднее значение сигнала вибрации и степень времени синхронный средний сигнал конверта. analyzeData
функция содержит полный список извлеченных функций. Как пример, считайте вычисление спектра времени синхронным усредненным сигналом вибрации.
reset(ens) data = read(ens)
data=1×2 table
Vibration TachoPulses
___________________ ______________
[30106×1 timetable] [8×1 duration]
vibration = data.Vibration{1}; % Interpolate the Vibration signal onto periodic time base suitable for fft analysis np = 2^floor(log(height(vibration))/log(2)); dt = vibration.Time(end)/(np-1); tv = 0:dt:vibration.Time(end); y = retime(vibration,tv,'linear'); % Compute the time synchronous average of the vibration signal tp = seconds(data.TachoPulses{1}); vibrationTSA = tsa(y,tp); figure plot(vibrationTSA.ttTime,vibrationTSA.tsa) title('Vibration time synchronous average') ylabel('Acceleration')
% Compute the spectrum of the time synchronous average np = numel(vibrationTSA); f = fft(vibrationTSA.tsa.*hamming(np))/np; frTSA = f(1:floor(np/2)+1); % TSA frequency response wTSA = (0:np/2)/np*(2*pi/seconds(dt)); % TSA spectrum frequencies mTSA = abs(frTSA); % TSA spectrum magnitudes figure semilogx(wTSA,20*log10(mTSA)) title('Vibration spectrum') xlabel('rad/s')
Частота, которая соответствует пиковой величине, могла оказаться функцией, которая полезна для классификации различных типов отказа. Код ниже вычисляет функции, упомянутые выше для всех членов ансамбля (запускающий этот анализ, делают, занимают приблизительно тридцать минут на стандартном настольном, дополнительном коде, чтобы запустить анализ в параллели с помощью ансамбля partition
команда обеспечивается). Имена функций добавляются к свойству переменных данных ансамбля прежде, чем вызвать writeToLastMemberRead, чтобы добавить вычисленные опции каждому члену ансамбля.
reset(ens) ens.DataVariables = [ens.DataVariables; ... "SigMean";"SigMedian";"SigRMS";"SigVar";"SigPeak";"SigPeak2Peak";"SigSkewness"; ... "SigKurtosis";"SigCrestFactor";"SigMAD";"SigRangeCumSum";"SigCorrDimension";"SigApproxEntropy"; ... "SigLyapExponent";"PeakFreq";"HighFreqPower";"EnvPower";"PeakSpecKurtosis"]; if runLocal while hasdata(ens) data = read(ens); addData = analyzeData(data); writeToLastMemberRead(ens,addData); end else % Split the ensemble into partitions and analyze each partition in parallel n = numpartitions(ens,gcp); parfor ct = 1:n subens = partition(ens,n,ct); while hasdata(subens) data = read(subens); addData = analyzeData(data); writeToLastMemberRead(subens,addData) end end end
Функции, вычисленные выше, используются, чтобы создать классификатор, чтобы классифицировать различные условия отказа. Сначала сконфигурируйте ансамбль к только для чтения выведенные функции и метки отказа.
featureVariables = analyzeData('GetFeatureNames');
ens.DataVariables = [ens.DataVariables; featureVariables];
ens.SelectedVariables = [featureVariables; ens.ConditionVariables];
reset(ens)
Соберите данные о функции для всех членов ансамбля в одну таблицу.
featureData = gather(tall(ens))
Evaluating tall expression using the Parallel Pool 'local': - Pass 1 of 1: Completed in 1.8 min Evaluation completed in 1.8167 min
featureData=208×22 table
SigMean SigMedian SigRMS SigVar SigPeak SigPeak2Peak SigSkewness SigKurtosis SigCrestFactor SigMAD SigRangeCumSum SigCorrDimension SigApproxEntropy SigLyapExponent PeakFreq HighFreqPower EnvPower PeakSpecKurtosis SensorDrift ShaftWear ToothFault FaultCode
________ _________ _______ _______ _______ ____________ ___________ ___________ ______________ _______ ______________ ________________ ________________ _______________ ________ _____________ __________ ________________ ___________ _________ __________ _________
-0.94876 -0.9722 1.3726 0.98387 0.81571 3.6314 -0.041525 2.2666 2.0514 0.8081 28562 1.1427 0.031601 79.531 0 6.7528e-06 3.2349e-07 162.13 true false false 1
-0.97537 -0.98958 1.3937 0.99105 0.81571 3.6314 -0.023777 2.2598 2.0203 0.81017 29418 1.1362 0.03786 70.339 0 5.0788e-08 9.1568e-08 226.12 true false false 1
1.0502 1.0267 1.4449 0.98491 2.8157 3.6314 -0.04162 2.2658 1.9487 0.80853 31710 1.1479 0.031586 125.18 0 6.7416e-06 3.1343e-07 162.13 true true false 3
1.0227 1.0045 1.4288 0.99553 2.8157 3.6314 -0.016356 2.2483 1.9707 0.81324 30984 1.1472 0.032109 112.52 0 4.9934e-06 2.5787e-07 162.13 true true false 3
1.0123 1.0024 1.4202 0.99233 2.8157 3.6314 -0.014701 2.2542 1.9826 0.81156 30661 1.147 0.032891 109.02 0 3.619e-06 2.2397e-07 230.39 true true false 3
1.0275 1.0102 1.4338 1.0001 2.8157 3.6314 -0.02659 2.2439 1.9638 0.81589 31102 1.0975 0.033449 64.499 0 2.5493e-06 1.9224e-07 230.39 true true false 3
1.0464 1.0275 1.4477 1.0011 2.8157 3.6314 -0.042849 2.2455 1.9449 0.81595 31665 1.1417 0.034182 98.759 0 1.7313e-06 1.6263e-07 230.39 true true false 3
1.0459 1.0257 1.4402 0.98047 2.8157 3.6314 -0.035405 2.2757 1.955 0.80583 31554 1.1345 0.035323 44.304 0 1.1115e-06 1.2807e-07 230.39 true true false 3
1.0263 1.0068 1.4271 0.98341 2.8157 3.6314 -0.0165 2.2726 1.973 0.80624 30951 1.1515 0.03592 125.28 0 6.5947e-07 1.208e-07 162.13 true true false 3
1.0103 1.0014 1.4183 0.99091 2.8157 3.6314 -0.011667 2.2614 1.9853 0.80987 30465 1.0619 0.036514 17.093 0 5.2297e-07 1.0704e-07 230.39 true true false 3
1.0129 1.0023 1.419 0.98764 2.8157 3.6314 -0.010969 2.266 1.9843 0.80866 30523 1.1371 0.037234 84.568 0 2.1605e-07 8.774e-08 230.39 true true false 3
1.0251 1.0104 1.4291 0.9917 2.8157 3.6314 -0.023609 2.2588 1.9702 0.81048 30896 1.1261 0.037836 98.463 0 5.0275e-08 9.0495e-08 230.39 true true false 3
-0.97301 -0.99243 1.3928 0.99326 0.81571 3.6314 -0.012569 2.2589 2.0216 0.81095 29351 1.1277 0.038507 42.887 0 1.1383e-11 8.3005e-08 230.39 true false true 5
1.0277 1.0084 1.4315 0.99314 2.8157 3.6314 -0.013542 2.2598 1.9669 0.81084 30963 1.1486 0.038524 99.426 0 1.1346e-11 8.353e-08 226.12 true true true 7
0.026994 0.0075709 0.99697 0.99326 1.8157 3.6314 -0.012569 2.2589 1.8212 0.81095 1083.8 1.1277 0.038507 44.448 9.998 4.9172e-12 8.3005e-08 230.39 false false true 4
0.026943 0.0084639 0.99297 0.98531 1.8157 3.6314 -0.018182 2.2686 1.8286 0.80732 1466.6 1.1368 0.035822 93.95 1.8618 6.8872e-07 1.2185e-07 230.39 false false false 0
⋮
Рассмотрите отказ дрейфа датчика. Используйте fscnca
команда со всеми функциями, вычисленными выше как предикторы и датчик, дрейфует метка отказа (истинное ложное значение) как ответ. fscnca
команда возвращает веса для каждой функции, и функции с более высокими весами имеют более высокую важность в предсказании ответа. Для отказа дрейфа датчика веса указывают, что двумя функциями являются значительные предикторы (область значений совокупной суммы сигнала и пиковая частота спектрального эксцесса), и остающиеся функции оказывают мало влияния.
idxResponse = strcmp(featureData.Properties.VariableNames,'SensorDrift'); idxLastFeature = find(idxResponse)-1; % Index of last feature to use as a potential predictor featureAnalysis = fscnca(featureData{:,1:idxLastFeature},featureData.SensorDrift); featureAnalysis.FeatureWeights
ans = 18×1
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
⋮
idxSelectedFeature = featureAnalysis.FeatureWeights > 0.1; classifySD = [featureData(:,idxSelectedFeature), featureData(:,idxResponse)]
classifySD=208×3 table
SigRangeCumSum PeakSpecKurtosis SensorDrift
______________ ________________ ___________
28562 162.13 true
29418 226.12 true
31710 162.13 true
30984 162.13 true
30661 230.39 true
31102 230.39 true
31665 230.39 true
31554 230.39 true
30951 162.13 true
30465 230.39 true
30523 230.39 true
30896 230.39 true
29351 230.39 true
30963 226.12 true
1083.8 230.39 false
1466.6 230.39 false
⋮
Сгруппированная гистограмма области значений совокупной суммы дает нам понимание, почему этой функцией является значительный предиктор для отказа дрейфа датчика.
figure histogram(classifySD.SigRangeCumSum(classifySD.SensorDrift),'BinWidth',5e3) xlabel('Signal cumulative sum range') ylabel('Count') hold on histogram(classifySD.SigRangeCumSum(~classifySD.SensorDrift),'BinWidth',5e3) hold off legend('Sensor drift fault','No sensor drift fault')
График гистограммы показывает, что область значений совокупной суммы сигнала является пользой, показанной для обнаружения отказов дрейфа датчика, хотя дополнительная функция, вероятно, необходима, когда могут быть ложные положительные стороны, когда область значений совокупной суммы сигнала ниже 0.5, если только область значений совокупной суммы сигнала используется, чтобы классифицировать дрейф датчика.
Рассмотрите отказ износа вала. В этом случае fscnca
функция указывает, что существует 3 функции, которые являются значительными предикторами для отказа (сигнал экспонента Ляпунова, пиковая частота, и пиковая частота в спектральном эксцессе), выбирают их, чтобы классифицировать отказ износа вала.
idxResponse = strcmp(featureData.Properties.VariableNames,'ShaftWear');
featureAnalysis = fscnca(featureData{:,1:idxLastFeature},featureData.ShaftWear);
featureAnalysis.FeatureWeights
ans = 18×1
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
⋮
idxSelectedFeature = featureAnalysis.FeatureWeights > 0.1; classifySW = [featureData(:,idxSelectedFeature), featureData(:,idxResponse)]
classifySW=208×4 table
SigLyapExponent PeakFreq PeakSpecKurtosis ShaftWear
_______________ ________ ________________ _________
79.531 0 162.13 false
70.339 0 226.12 false
125.18 0 162.13 true
112.52 0 162.13 true
109.02 0 230.39 true
64.499 0 230.39 true
98.759 0 230.39 true
44.304 0 230.39 true
125.28 0 162.13 true
17.093 0 230.39 true
84.568 0 230.39 true
98.463 0 230.39 true
42.887 0 230.39 false
99.426 0 226.12 true
44.448 9.998 230.39 false
93.95 1.8618 230.39 false
⋮
Сгруппированная гистограмма для сигнала, который показывает экспонента Ляпунова, почему одной только той функцией не является хороший предиктор.
figure histogram(classifySW.SigLyapExponent(classifySW.ShaftWear)) xlabel('Signal lyapunov exponent') ylabel('Count') hold on histogram(classifySW.SigLyapExponent(~classifySW.ShaftWear)) hold off legend('Shaft wear fault','No shaft wear fault')
Выбор признаков износа вала указывает, что несколько функций необходимы, чтобы классифицировать отказ износа вала, сгруппированная гистограмма подтверждает это, когда старшая значащая функция (в этом случае экспонента Ляпунова) имеет подобное распределение и для дефектного, и дайте сбой свободные сценарии, указывающие, что больше функций необходимо, чтобы правильно классифицировать этот отказ.
Наконец рассмотрите зубной отказ, fscnca
функция указывает, что существует 3 функции, первичные, которые являются значительными предикторами для отказа (область значений совокупной суммы сигнала, сигнал экспонента Ляпунова и пиковая частота в спектральном эксцессе). Выбирание тех 3 признаков, чтобы классифицировать зуб дает сбой результаты в классификаторе, который имеет низкую производительность. Вместо этого используйте 6 самых важных функций.
idxResponse = strcmp(featureData.Properties.VariableNames,'ToothFault');
featureAnalysis = fscnca(featureData{:,1:idxLastFeature},featureData.ToothFault);
[~,idxSelectedFeature] = sort(featureAnalysis.FeatureWeights);
classifyTF = [featureData(:,idxSelectedFeature(end-5:end)), featureData(:,idxResponse)]
classifyTF=208×7 table
PeakFreq SigPeak SigCorrDimension SigLyapExponent PeakSpecKurtosis SigRangeCumSum ToothFault
________ _______ ________________ _______________ ________________ ______________ __________
0 0.81571 1.1427 79.531 162.13 28562 false
0 0.81571 1.1362 70.339 226.12 29418 false
0 2.8157 1.1479 125.18 162.13 31710 false
0 2.8157 1.1472 112.52 162.13 30984 false
0 2.8157 1.147 109.02 230.39 30661 false
0 2.8157 1.0975 64.499 230.39 31102 false
0 2.8157 1.1417 98.759 230.39 31665 false
0 2.8157 1.1345 44.304 230.39 31554 false
0 2.8157 1.1515 125.28 162.13 30951 false
0 2.8157 1.0619 17.093 230.39 30465 false
0 2.8157 1.1371 84.568 230.39 30523 false
0 2.8157 1.1261 98.463 230.39 30896 false
0 0.81571 1.1277 42.887 230.39 29351 true
0 2.8157 1.1486 99.426 226.12 30963 true
9.998 1.8157 1.1277 44.448 230.39 1083.8 true
1.8618 1.8157 1.1368 93.95 230.39 1466.6 false
⋮
figure histogram(classifyTF.SigRangeCumSum(classifyTF.ToothFault)) xlabel('Signal cumulative sum range') ylabel('Count') hold on histogram(classifyTF.SigRangeCumSum(~classifyTF.ToothFault)) hold off legend('Gear tooth fault','No gear tooth fault')
Используя вышеупомянутые результаты полином svm, чтобы классифицировать зубные отказы механизма. Разделите таблицу функции в члены, которые используются в обучении и членах для тестирования и валидации. Используйте учебные члены, чтобы создать svm классификатор с помощью fitcsvm
команда.
rng('default') % For reproducibility cvp = cvpartition(size(classifyTF,1),'KFold',5); % Randomly partition the data for training and validation classifierTF = fitcsvm(... classifyTF(cvp.training(1),1:end-1), ... classifyTF(cvp.training(1),end), ... 'KernelFunction','polynomial', ... 'PolynomialOrder',2, ... 'KernelScale','auto', ... 'BoxConstraint',1, ... 'Standardize',true, ... 'ClassNames',[false; true]);
Используйте классификатор, чтобы классифицировать тестовые точки с помощью predict
команда и проверка производительность предсказаний с помощью матрицы беспорядка.
% Use the classifier on the test validation data to evaluate performance actualValue = classifyTF{cvp.test(1),end}; predictedValue = predict(classifierTF, classifyTF(cvp.test(1),1:end-1)); % Check performance by computing and plotting the confusion matrix confdata = confusionmat(actualValue,predictedValue); h = heatmap(confdata, ... 'YLabel', 'Actual gear tooth fault', ... 'YDisplayLabels', {'False','True'}, ... 'XLabel', 'Predicted gear tooth fault', ... 'XDisplayLabels', {'False','True'}, ... 'ColorbarVisible','off');
Матрица беспорядка указывает, что классификатор правильно классифицирует все условия неотказа, но неправильно классифицирует ожидаемое условие отказа того, как не являющееся отказом. Увеличение числа функций, использованных в классификаторе, может помочь улучшать производительность далее.
Этот пример, обойденный через рабочий процесс для генерации данных об отказе из Simulink, с помощью ансамбля симуляции, чтобы очистить данные моделирования и функции извлечения. Извлеченные функции были затем использованы, чтобы создать классификаторы для различных типов отказа.