summaryrefslogtreecommitdiff
path: root/compare.sci
blob: 472313051166bfea6cfff11b6413545311ab9f85 (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
143
144
145
function varargout = compare(varargin)
    [lhs,rhs] = argn(0)
//------------------------------------------------------------------------------
// checking the number of inputs
    if rhs < 2 || rhs > 3 then
        error(msprintf(gettext("%s:Wrong number of input arguments.\n"),"compare"))
    end
//------------------------------------------------------------------------------
    data = varargin(1)
    model = varargin(2)
    if rhs == 3 then
        kStep = varargin(3)
    elseif rhs == 2 then
        kStep = %inf
    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"),"compare"))
    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"),"predict"))
//    end
//------------------------------------------------------------------------------
// checking the plant model
    if typeof(model) ~= 'idpoly' then
        error(msprintf(gettext("%s:Plant model must be ""idpoly"" type.\n"),"compare"))
    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"),"compare"))
    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"),"compare"))
        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"),"compare"))
        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"),"compare"))
    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"),"compare"))
    end
//------------------------------------------------------------------------------
// ckecking the k step size. if it greater than number of sample size then the 
// k step will become 1 
//    if kStep >= size(data,'r') then
//        kStep = 1
//    end
//------------------------------------------------------------------------------
    //storing the plant data
    //           B(z)               C(z)
    // y(n) = ---------- u(n) + ---------- e(n)
    //         A(z)*F(z)         A(z)*D(z)
    aPoly = poly(model.a,'q','coeff');
    bPoly = poly(model.b,'q','coeff');
    cPoly = poly(model.c,'q','coeff');
    dPoly = poly(model.d,'q','coeff');
    fPoly = poly(model.f,'q','coeff');
    Gq = bPoly/(aPoly*fPoly)
    Hq = cPoly/(aPoly*dPoly)
    //disp(kStep)
    if kStep == %inf then
        //disp('in inf')
        outData = sim(data(:,2),model)
    else
        if kStep == 1 then
            Wkq = Hq^-1
        elseif kStep > 1 then
            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)
            hBarPoly = poly(hBar,'q','coeff')
            Wkq = hBarPoly*Hq^-1//*bPoly/(dPoly*fPoly)
        end
    //    pause
        WkqGq = Wkq * Gq
        tempWkqGq = coeff(WkqGq.den)
        if tempWkqGq(1) <> 1 then
            WkqGq.num = WkqGq.num/tempWkqGq(1)
            WkqGq.den = WkqGq.den/tempWkqGq(1)
        end
        Wkq1 = 1-Wkq
        tempWkq1 = coeff(Wkq1.den)
        if tempWkq1(1) == 1 then
            Wkq1.num = Wkq1.num/tempWkq1(1)
            Wkq1.den = Wkq1.den/tempWkq1(1)
        end
        z = poly(0,'z');
        WkqGqNum = horner(WkqGq.num,1/z);WkqGqDen = horner(WkqGq.den,1/z);
        uPoly = WkqGqNum/WkqGqDen;
        uPoly = syslin('d',uPoly);uData = flts(data(:,2)',uPoly);
        
        Wkq1Num = horner(Wkq1.num,1/z);Wkq1Den = horner(Wkq1.den,1/z);
        yPoly = Wkq1Num/Wkq1Den;
        yPoly = syslin('d',yPoly);yData = flts(data(:,1)',yPoly);
        outData = (uData+yData)'
    end

    tData = (1:size(data,'r'))'*plantSampleTime
    fitData = fitValue(data(:,1),outData)
    if lhs == 1 then
        varargout(1) = []
        plot(tData,data(:,1),'m')
        plot(tData,outData,'b')
        legend('Plant Data','Model Data : '+string(fitData)+'%')
        xtitle('Comparison of Time Response','Time ('+ plantTimeUnit+')','Amplitude')
        xgrid()
    elseif lhs == 2 then
        varargout(1) = fitData
        varargout(2) = outData
    elseif lhs == 3 then
        varargout(1) = outData
        varargout(2) = tData
        varargout(3) = fitData
    end
    
endfunction