Main Content

Fault Diagnosis of Centrifugal Pumps Using Residual Analysis

This example shows a model parity-equations based approach for detection and diagnosis of different types of faults that occur in a pumping system. This example extends the techniques presented in the Fault Diagnosis of Centrifugal Pumps Using Steady State Experiments to the situation where the pump operation spans multiple operating conditions.

The example follows the centrifugal pump analysis presented in the Fault Diagnosis Applications book by Rolf Isermann [1]. It uses functionality from System Identification Toolbox™, Statistics and Machine Learning Toolbox™, Control System Toolbox™ and Simulink® and does not require Predictive Maintenance Toolbox™.

Multi-Speed Pump Runs - Diagnosis by Residual Analysis

The steady-state pump head and torque equations do not produce accurate results if the pump is run at rapidly varying or a wider range of speeds. Friction and other losses could become significant and the model's parameters exhibit dependence on speed. A widely applicable approach in such cases is to create a black box model of the behavior. The parameters of such models need not be physically meaningful. The model is used as a device for simulation of known behaviors. The model's outputs are subtracted from the corresponding measured signals to compute residuals. The properties of residuals, such as their mean, variance and power are used to distinguish between normal and faulty operations.

Using the static pump head equation, and the dynamic pump-pipe equations, the 4 residuals as shown in the figure can be computed.

The model has of the following components:

  • Static pump model: Δpˆ(t)=θ1ω2(t)+θ2ω(t)

  • Dynamic pipe model: Qˆ(t)=θ3+θ4Δp(t)+θ5Qˆ(t-1)

  • Dynamic pump-pipe model: Qˆˆ(t)=θ3+θ4Δp(t)ˆ+θ5Qˆˆ(t-1)

  • Dynamic inverse pump model: Mˆmotor(t)=θ6+θ7ω(t)+θ8ω(t-1)+θ9ω2(t)+θ10Mˆmotor(t-1)

The model parameters θ1,...,θ10 show dependence on pump speed. In this example, a piecewise linear approximation for the parameters is computed. Divide the operating region into 3 regimes:

  1. ω900RPM

  2. 900<ω1500RPM

  3. ω>1500RPM

A healthy pump was run over a reference speed range of 0 - 3000 RPM in closed loop with a closed-loop controller. The reference input is a modified PRBS signal. The measurements for motor torque, pump torque, speed and pressure were collected at 10 Hz sampling frequency. Load the measured signals and plot the reference and actual pump speeds (these are large datasets, ~20MB, that are downloaded from the MathWorks® support files site).

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')

Figure contains an axes object. The axes object with xlabel Time (s), ylabel Pump Speed (RPM) contains 2 objects of type line. These objects represent Reference, Actual.

Define operating regimes based on pump speed ranges.

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

Model Identification

A. Static Pump Model Identification

Estimate the parameters θ1 and θ2 in the static pump equation using the measured values of pump speed ω(t)and pressure differential Δp(t) as input-output data. See the helper function staticPumpEst that performs this estimation.

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')

Figure contains an axes object. The axes object with title Static Pump Model Validation, xlabel Time (s), ylabel Delta blank P contains 2 objects of type line. These objects represent Measured, Estimated.

B. Dynamic Pipe Model Identification

Estimate the parameters θ3, θ4 and θ5 in the pipe discharge flow equation Qˆ(t)=θ3+θ4Δp(t)+θ5Qˆ(t-1), using the measured values of flow rate Q(t)and pressure differential Δp(t) as input-output data. See the helper function dynamicPipeEst that performs this estimation.

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

Unlike the static pump model case, the dynamic pipe model shows dynamic dependence on flow rate values. To simulate the model under varying speed regimes, a piecewise-linear model is created in Simulink using the "LPV System" block of Control System Toolbox. See the Simulink model LPV_pump_pipe and the helper function simulatePumpPipeModel that performs the simulation.

% 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')

Figure contains an axes object. The axes object with title Dynamic Pipe Model Validation, xlabel Time (s), ylabel Flow rate (Q), blank m Cubed baseline /s contains 2 objects of type line. These objects represent Measured, Estimated.

C. Dynamic Pump Pipe Model Identification

The Dynamic pump-pipe model uses the same parameters identified above (θ3,θ4,θ5) except that the model simulation requires the use of estimated pressure difference rather than the measured one. Hence no new identification is required. Check that the estimated values of θ3,θ4,θ5 give a good reproduction of the pump-pipe dynamics.

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')

Figure contains an axes object. The axes object with title Dynamic Pump-Pipe Model Validation, xlabel Time (s), ylabel Flow rate Q (m Cubed baseline /s) contains 2 objects of type line. These objects represent Measured, Estimated.

The fit is virtually identical to the one obtained using measured pressure values.

D. Dynamic Inverse Pump Model Identification

The parameters θ6,...,θ10 can be identified in a similar manner, by regressing the measured torque values on the previous torque and speed measurements. However, a complete multi-speed simulation of the resulting piecewise linear model does not provide a good fit to the data. Hence a different black box modeling approach is tried which involves identifying a Nonlinear ARX model with rational regressors to fit the data.

% 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

Regressors:
  1. Linear regressors in variables y1, u1, u2
  2. Custom regressor: u1(t-2)^2
  3. Custom regressor: u1(t)*u2(t-2)
  4. Custom regressor: u2(t)^2
  List of all regressors

Output function: Linear with offset
Sample time: 0.1 seconds

Status:                                          
Estimated using NLARX on time domain data.       
Fit to estimation data: 49.27% (simulation focus)
FPE: 1798, MSE: 3383                             

Model Properties
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')

Figure contains an axes object. The axes object with title Inverse pump model validation, xlabel Time (s), ylabel Motor Torque (Nm) contains 2 objects of type line. These objects represent Measured, Estimated.

Residue Generation

Define residue of a model as the difference between a measured signal and the corresponding model-produced output. Compute the four residuals corresponding to the four model components.

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

For computing the inverse pump model residue, apply a smoothing operation on the model output using a moving average filter since the original residues show large variance.

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

A view of training residues:

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)')

Figure contains 4 axes objects. Axes object 1 with ylabel Static pump - r1 contains an object of type line. Axes object 2 with ylabel Dynamic pipe - r2 contains an object of type line. Axes object 3 with xlabel Time (s), ylabel Dynamic pump-pipe - r3 contains an object of type line. Axes object 4 with xlabel Time (s), ylabel Dynamic inverse pump - r4 contains an object of type line.

Residue Feature Extraction

Residues are signals from which suitable features are extracted for fault isolation. Since no parametric information is available, consider features that are derived purely from signal properties such as maximum amplitude or variance of the signal.

Consider a set of 20 experiments on the pump-pipe system using PRBS input realizations. The experiment set is repeated for each of the following modes:

  1. Healthy pump

  2. Fault 1: Wear at clearance gap

  3. Fault 2: Small deposits at impeller outlet

  4. Fault 3: Deposits at impeller inlet

  5. Fault 4: Abrasive wear at impeller outlet

  6. Fault 5: Broken blade

  7. Fault 6: Cavitation

  8. Fault 7: Speed sensor bias

  9. Fault 8: Flowmeter bias

  10. Fault 9: Pressure sensor bias

Load the experimental data.

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'};

Compute residues for each ensemble and each mode of operation. This takes several minutes. Hence the residual data is saved in a data file. Run the helperComputeEnsembleResidues to generate the residuals, as in:

% 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

The feature of the residues that would have the most mode-discrimination power is not known a-priori. So generate several candidate features: mean, maximum amplitude, variance, kurtosis and 1-norm for each residual. All the features are scaled using the range of values in the healthy ensemble.

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);

There are 20 features in each feature table (5 features for each residue signal). Each table contains 50 observations (rows), one from each experiment.

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'}

Classifier Design

A. Visualizing mode separability using scatter plot

Begin the analysis by visual inspection of the features. For this, consider Fault 1: Wear at clearance gap. To view which features are most suitable to detect this fault, generate a scatter plot of features with labels 'Healthy' and 'ClearanceGapWear'.

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;

Figure contains 420 axes objects. Axes object 1 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 2 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 3 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 4 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 5 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 6 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 7 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 8 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 9 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 10 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 11 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 12 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 13 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 14 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 15 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 16 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 17 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 18 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 19 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 20 contains 2 objects of type line. Axes object 21 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 22 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 23 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 24 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 25 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 26 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 27 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 28 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 29 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 30 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 31 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 32 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 33 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 34 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 35 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 36 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 37 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 38 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 39 contains 2 objects of type line. Axes object 40 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 41 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 42 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 43 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 44 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 45 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 46 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 47 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 48 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 49 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 50 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 51 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 52 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 53 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 54 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 55 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 56 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 57 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 58 contains 2 objects of type line. Axes object 59 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 60 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 61 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 62 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 63 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 64 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 65 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 66 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 67 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 68 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 69 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 70 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 71 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 72 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 73 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 74 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 75 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 76 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 77 contains 2 objects of type line. Axes object 78 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 79 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 80 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 81 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 82 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 83 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 84 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 85 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 86 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 87 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 88 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 89 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 90 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 91 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 92 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 93 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 94 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 95 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 96 contains 2 objects of type line. Axes object 97 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 98 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 99 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 100 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 101 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 102 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 103 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 104 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 105 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 106 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 107 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 108 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 109 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 110 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 111 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 112 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 113 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 114 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 115 contains 2 objects of type line. Axes object 116 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 117 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 118 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 119 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 120 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 121 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 122 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 123 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 124 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 125 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 126 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 127 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 128 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 129 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 130 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 131 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 132 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 133 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 134 contains 2 objects of type line. Axes object 135 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 136 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 137 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 138 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 139 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 140 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 141 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 142 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 143 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 144 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 145 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 146 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 147 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 148 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 149 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 150 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 151 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 152 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 153 contains 2 objects of type line. Axes object 154 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 155 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 156 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 157 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 158 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 159 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 160 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 161 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 162 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 163 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 164 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 165 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 166 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 167 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 168 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 169 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 170 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 171 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 172 contains 2 objects of type line. Axes object 173 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 174 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 175 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 176 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 177 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 178 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 179 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 180 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 181 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 182 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 183 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 184 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 185 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 186 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 187 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 188 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 189 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 190 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 191 contains 2 objects of type line. Axes object 192 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 193 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 194 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 195 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 196 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 197 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 198 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 199 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 200 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 201 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 202 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 203 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 204 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 205 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 206 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 207 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 208 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 209 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 210 contains 2 objects of type line. Axes object 211 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 212 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 213 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 214 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 215 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 216 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 217 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 218 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 219 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 220 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 221 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 222 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 223 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 224 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 225 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 226 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 227 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 228 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 229 contains 2 objects of type line. Axes object 230 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 231 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 232 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 233 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 234 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 235 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 236 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 237 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 238 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 239 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 240 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 241 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 242 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 243 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 244 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 245 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 246 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 247 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 248 contains 2 objects of type line. Axes object 249 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 250 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 251 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 252 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 253 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 254 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 255 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 256 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 257 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 258 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 259 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 260 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 261 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 262 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 263 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 264 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 265 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 266 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 267 contains 2 objects of type line. Axes object 268 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 269 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 270 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 271 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 272 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 273 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 274 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 275 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 276 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 277 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 278 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 279 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 280 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 281 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 282 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 283 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 284 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 285 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 286 contains 2 objects of type line. Axes object 287 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 288 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 289 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 290 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 291 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 292 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 293 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 294 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 295 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 296 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 297 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 298 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 299 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 300 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 301 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 302 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 303 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 304 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 305 contains 2 objects of type line. Axes object 306 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 307 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 308 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 309 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 310 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 311 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 312 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 313 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 314 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 315 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 316 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 317 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 318 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 319 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 320 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 321 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 322 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 323 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 324 contains 2 objects of type line. Axes object 325 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 326 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 327 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 328 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 329 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 330 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 331 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 332 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 333 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 334 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 335 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 336 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 337 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 338 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 339 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 340 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 341 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 342 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 343 contains 2 objects of type line. Axes object 344 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 345 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 346 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 347 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 348 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 349 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 350 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 351 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 352 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 353 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 354 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 355 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 356 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 357 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 358 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 359 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 360 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 361 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 362 contains 2 objects of type line. Axes object 363 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 364 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 365 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 366 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 367 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 368 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 369 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 370 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 371 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 372 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 373 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 374 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 375 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 376 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 377 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 378 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 379 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 380 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 381 contains 2 objects of type line. Axes object 382 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 383 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 384 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 385 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 386 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 387 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 388 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 389 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 390 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 391 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 392 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 393 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 394 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 395 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 396 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 397 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 398 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 399 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 400 contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Healthy, ClearanceGapWear. Hidden axes object 401 contains 2 objects of type histogram. Hidden axes object 402 contains 2 objects of type histogram. Hidden axes object 403 contains 2 objects of type histogram. Hidden axes object 404 contains 2 objects of type histogram. Hidden axes object 405 contains 2 objects of type histogram. Hidden axes object 406 contains 2 objects of type histogram. Hidden axes object 407 contains 2 objects of type histogram. Hidden axes object 408 contains 2 objects of type histogram. Hidden axes object 409 contains 2 objects of type histogram. Hidden axes object 410 contains 2 objects of type histogram. Hidden axes object 411 contains 2 objects of type histogram. Hidden axes object 412 contains 2 objects of type histogram. Hidden axes object 413 contains 2 objects of type histogram. Hidden axes object 414 contains 2 objects of type histogram. Hidden axes object 415 contains 2 objects of type histogram. Hidden axes object 416 contains 2 objects of type histogram. Hidden axes object 417 contains 2 objects of type histogram. Hidden axes object 418 contains 2 objects of type histogram. Hidden axes object 419 contains 2 objects of type histogram. Hidden axes object 420 contains 2 objects of type histogram.

Although not clearly visible, features in columns 1 and 17 provide the most separation. Analyze these features more closely.

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))

Figure contains 6 axes objects. Axes object 1 contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 2 contains 2 objects of type line. Axes object 3 contains 2 objects of type line. Axes object 4 contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Healthy, ClearanceGapWear. Hidden axes object 5 contains 2 objects of type histogram. Hidden axes object 6 contains 2 objects of type histogram.

The plot now clearly shows that features Mean1 and OneNorm1 can be used to separate healthy mode from clearance gap fault mode. A similar analysis can be performed for each fault mode. In all cases, it is possible to find a set of features that distinguish the fault modes. Hence detection of a faulty behavior is always possible. However, fault isolation is more difficult since the same features are affected by multiple fault types. For example, the features Mean1 (Mean of r1) and OneNorm1 (1-norm of r1) show a change for many fault types. Still some faults such as sensor biases are more easily isolable where the fault is separable in many features.

For the three sensor bias faults, pick features from a manual inspection of the scatter plot.

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))

Figure contains 30 axes objects. Axes object 1 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 2 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 3 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 4 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 5 contains 4 objects of type line. Axes object 6 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 7 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 8 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 9 contains 4 objects of type line. Axes object 10 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 11 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 12 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 13 contains 4 objects of type line. Axes object 14 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 15 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 16 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 17 contains 4 objects of type line. Axes object 18 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 19 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 20 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 21 contains 4 objects of type line. Axes object 22 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 23 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 24 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 25 contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Healthy, SpeedSensorBias, FlowmeterBias, PressureSensorBias. Hidden axes object 26 contains 4 objects of type histogram. Hidden axes object 27 contains 4 objects of type histogram. Hidden axes object 28 contains 4 objects of type histogram. Hidden axes object 29 contains 4 objects of type histogram. Hidden axes object 30 contains 4 objects of type histogram.

The scatter plot of selected features shows that the 4 modes can be distinguished on one or more pairs of features. Train a 20 member Tree Bagger classifier for the reduced set of faults (sensor biases only) using a reduced set of features.

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')

Figure contains an axes object. The axes object with xlabel Number of trees, ylabel Misclassification probability contains an object of type line.

The misclassification error is less than 3%. Thus it is possible to pick and work with a smaller set of features for classifying a certain subset of faults.

B. Multi-class Classification using Classification Learner App

The previous section focused on manual inspection of scatter plots to reduce the feature set for particular fault types. This approach can get tedious and may not cover all fault types. Can you design a classifier that can handle all fault modes in a more automated fashion? There are many classifiers available in Statistics and Machine Learning Toolbox. A quick way to try many of them and compare their performances is to use the Classification Learner App.

  1. Launch the Classification Learner App and select FeatureTable from workspace as working data for a new session. Set aside 20% of data (10 samples of each mode) for holdout validation.

  2. Select All under Model Type section of the main tab. Then press the Train button.

  3. In a short time, about 20 classifiers are trained. Their accuracies are displayed next to their names under the history panel. A linear SVM classifier performs the best, producing 86% accuracy on the hold out samples. This classifier has some difficulty in identifying "ClearanceGapWear" which it classifies as "ImpellerOutletDeposit" 40% of the time.

  4. To get a graphical view of the performance, open a Confusion Matrix plot from the PLOTS section of the main tab. The plot shows the performance of the selected classifier (the Linear SVM classifier here).

Export the best performing classifier to the workspace and use it for prediction on new measurements.

Summary

A well designed fault diagnosis strategy can save operating costs by minimizing service downtime and component replacement costs. The strategy benefits from a good knowledge about the operating machine's dynamics which is used in combination with sensor measurements to detect and isolate different kinds of faults. This example described a residual based approach for fault diagnosis of centrifugal pumps. This approach is a good alternative to parameter estimation and tracking based approaches when the modeling task is complex and model parameters show dependence on operating conditions.

A residual based fault diagnosis approach involves the following steps:

  1. Model the dynamics between the measurable inputs and outputs of the system using physical considerations or black box system identification techniques.

  2. Compute residues as difference between measured and model produced signals. The residues may need to be further filtered to improve fault isolability.

  3. Extract features such as peak amplitude, power, kurtosis etc from each residual signal.

  4. Use features for fault detection and classification using anomaly detection and classification techniques.

  5. Not all residues and derived features are sensitive to every fault. A view of feature histograms and scatter plots can reveal which features are suitable for detecting a certain fault type. This process of picking features and assessing their performance for fault isolation can be an iterative procedure.

References

  1. Isermann, Rolf, Fault-Diagnosis Applications. Model-Based Condition Monitoring: Actuators, Drives, Machinery, Plants, Sensors, and Fault-tolerant System, Edition 1, Springer-Verlag Berlin Heidelberg, 2011.

Supporting Functions

Static pump equation parameter estimation

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

Dynamic pipe parameter estimation

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

Dynamic, multi-operating mode simulation of pump-pipe model using LPV System block.

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

Identify a dynamic model for inverse pump dynamics.

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

See Also

Topics