summaryrefslogtreecommitdiff
path: root/pe.sci
blob: 6de3135d07d61a0df7fdf247d2f2695bffed6e77 (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
function varargout = pe(varargin)

// K-steps ahead prediction error
// 
// Calling Sequence
// pe(plantData,sys)
// pe(plantData,sys,k)
// [yData,tData,fData] = pe(plantData,sys)
// [yData,tData,fData] = pe(plantData,sys,k)
// Parameters
// plantData : iddata type or nx2 matrix
// sys : idpoly type polynomial
// k : non-neagtive integer prediction step,default value is 1
// yData : k step ahead prediction error
// tData : time series data
// fData : initial state
// Description
// pe function estimate the differencr between k step ahead predicted and the actual output response. Initial conditions of the dynamic model is zero. 
// Examples
// a = [1 0.2];b = [0 0.2 0.3];
// sys = idpoly(a,b,'Ts',0.1)
// u = idinput(1024,'PRBS',[0 1/20],[-1 1])
// y = sim(u,sys)+rand(1024,1)
// plantData = iddata(y,u,0.1)
// pe(plantData,sys)
// figure();clf();
// k = 5
// pe(plantData,sys,k)
// Authors
// Ashutosh Kumar Bhargava  

    [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