summaryrefslogtreecommitdiff
path: root/pe.sci
blob: 3a097a879c1b390e9ad103f24d681ee600cf5f2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
function varargout = pe(varargin)
    [lhs,rhs] = argn(0)
    
    
//------------------------------------------------------------------------------
    data = varargin(1)
    model = varargin(2)
    if rhs == 3 then
        kStep = varargin(3)
    elseif rhs == 2 then
        kStep = 1
    end
//------------------------------------------------------------------------------
// k step analysis
    if typeof(kStep) <> 'constant' || isnan(kStep)  then
        error(msprintf(gettext("%s:Prediction horizon(k) must be a non-negative integer number or inf.\n"),"pe"))
    end
// if given k step is infinity or []
    if isinf(kStep) || ~size(kStep,'*') then
        kStep = 1
    end
// checking the dimensions
    if size(kStep,'*') <> 1 || (ceil(kStep)-kStep) then
        error(msprintf(gettext("%s:Prediction horizon(k) must be a non-negative integer number or inf.\n"),"pe"))
    end
//------------------------------------------------------------------------------
// checking the plant model
    if typeof(model) ~= 'idpoly' then
        error(msprintf(gettext("%s:Plant model must be ""idpoly"" type.\n"),"pe"))
    end
    modelSampleTime = model.Ts
    modelTimeUnit = model.TimeUnit
//------------------------------------------------------------------------------
//checking the data type
    if typeof(data) <> 'iddata' && typeof(data) <> 'constant' then
        error(msprintf(gettext("%s:Sample data must be ""iddata"" type or ""n x 2"" matrix type.\n"),"pe"))
    end
// checking the plant data
    if typeof(data) == 'iddata' then
        if ~size(data.OutputData,'*') || ~size(data.InputData,'*') then
            error(msprintf(gettext("%s:Number of sample data in input and output must be equal.\n"),"pe"))
        end
        plantSampleTime = data.Ts
        plantTimeUnit = data.TimeUnit
        data = [data.OutputData data.InputData]
        //disp('iddata')
    elseif typeof(data) == 'constant' then
        if size(data,'c') ~= 2 then
            error(msprintf(gettext("%s:Number of sample data in input and output must be equal.\n"),"pe"))
        end
        plantSampleTime = model.Ts
        plantTimeUnit = model.TimeUnit
    end
//------------------------------------------------------------------------------
// comparing the sampling time
    if modelSampleTime-plantSampleTime <> 0 then
        error(msprintf(gettext("%s:The sample time of the model and plant data must be equal.\n"),"pe"))
    end
// Comparing the time units
    if ~strcmp(modelTimeUnit,plantTimeUnit)  then
    else
        error(msprintf(gettext("%s:Time unit of the model and plant data must be equal.\n"),"pe"))
    end
//------------------------------------------------------------------------------
    sampleLength = size(data,'r')
    // one step ahead prediction
    [y1 ,x0] = predict(data,model)
    errorData1 = data(:,1)-y1
    if kStep == 1 then
        eCapData = errorData1
    elseif kStep > 1 then
        aPoly = poly(model.a,'q','coeff');
        dPoly = poly(model.d,'q','coeff');
        adCoeff = coeff(aPoly*dPoly);adCoeff = adCoeff(length(adCoeff):-1:1);
        adPoly = poly(adCoeff,'q','coeff')
        cCoeff = model.c;cCoeff = cCoeff(length(cCoeff):-1:1);
        cPoly = poly(cCoeff,'q','coeff')
        hBar = clean((ldiv(cPoly,adPoly,kStep))',0.00001)
        hBar = hBar(length(hBar):-1:1)
        hBarLength = length(hBar)
        errorData1 = [zeros(hBarLength,1);errorData1]
        eCapData = []
        
        for ii = 1:sampleLength+1
            eCapData = [eCapData; hBar*errorData1(ii:ii+hBarLength-1)]
        end
    end
    
    timeData = (modelSampleTime:modelSampleTime:(sampleLength)*modelSampleTime)'
    pseudoData = size(eCapData,'r')
    eCapData = eCapData(abs(pseudoData-sampleLength)+1:$)
    //pause
    if lhs == 1 then
        clf()
        plot(timeData,eCapData)
        axisData = gca()
        
        tempTimeUnit = 'Time('+modelTimeUnit+')'
        xtitle('Predicted Response',tempTimeUnit,'y')
        xgrid
        //pause
        varargout(1) = 0
    
    elseif lhs == 2 then
        varargout(1) = eCapData
        varargout(2) = 0
    elseif lhs == 3 then
        varargout(1) = eCapData
        varargout(2) = timeData
        varargout(3) = 0
    end
endfunction