clear;

// tu można zamieścić podstawienia i obliczenia pomocnicze:

// które pozwolą w efekcie wyznaczyć parametry modeli transmitancyjnych:
//k1 = 
//T1 = 
//k2 = 
//T2 = 

xdel(winsid());
clc;

LAB_FS = 3;
PLOT_STEP = 100;

d = fscanfMat('dane.txt');
t = d(1:PLOT_STEP:$, 1)/1000;
u = d(1:PLOT_STEP:$, 4);
y = d(1:PLOT_STEP:$, 2);

// przebieg zarejestrowany
subplot(2, 1, 1);
plot(t, y);
title('Wyjście - zarejestrowany przebieg', 'fontsize', 3);
a = min(y), b = max(y), r = b - a;
ax = gca();
ax.data_bounds = [0, a - 0.05 * r; max(t), b + 0.05 * r];
ax.tight_limits = 'on';
h = get('hdl');
h.children(1).thickness = 2;
xlabel('t [s] - skala 1:300', 'fontsize', LAB_FS);
ylabel('glukoza [mg/dL]', 'fontsize', LAB_FS);
xgrid;
subplot(2, 1, 2);
plot(t, u);
title('Sterowanie - zarejestrowany przebieg', 'fontsize', 3);
a = min(u), b = max(u), r = b - a;
ax = gca();
ax.data_bounds = [0, a - 0.05 * r; max(t), b + 0.05 * r];
ax.tight_limits = 'on';
h = get('hdl');
h.children(1).thickness = 2;
h.children(1).foreground = 5;
xlabel('t [s] - skala 1:300', 'fontsize', LAB_FS);
ylabel('insulina [%]', 'fontsize', LAB_FS);
xgrid;

ue = u($);
ii = find(u == ue);
t = t(ii);
t = t - t(1);
y = y(ii);
y = -y + y(1);
t = t';
y = y';
du = u($) - u(1);

scf();
plot(t, y);
title('Wydzielony i odwrĂłcony przebieg odpowiedzi skokowej', 'fontsize', 3);
h = get('hdl');
h.children(1).thickness = 2;
xlabel('t [s] - skala 1:300', 'fontsize', LAB_FS);
ylabel('glukoza [mg/dL]', 'fontsize', LAB_FS);
xgrid;

def = exists(['k1', 'T1', 'k2', 'T2'])
if sum(def) < 4 then
    error('Aby wykonać dalszą część skryptu, zdefiniuj zmienne: k1, T1, k2, T2');
end

// FUNKCJE DOPSAOWANIA
// inercja I-rzędu
function e = G1(p, z),
    y = z(1), t = z(2), k = p(1), T = p(2);
    ym = du*(k-k*%e^(-t/T));
    e = y - ym;
endfunction

// inercja II-rzędu, T1 = T2
function e = G2(p, z),
    y = z(1), t = z(2), k = p(1), T = p(2);
    ym = du*(-(k*t*%e^(-t/T))/T-k*%e^(-t/T)+k);
    e = y - ym;
endfunction

// inercja II-rzędu, T1 <> T2
function e = G3(p, z),
    y = z(1), t = z(2), k = p(1), T1 = p(2), T2 = p(3);
    ym = du*(-(T2*k*%e^(-t/T2))/(T2-T1)+(T1*k*%e^(-t/T1))/(T2-T1)+k);
    e = y - ym;
endfunction

// model 1
G1a =  syslin('c', k1 / (T1 * %s + 1));
y1a = du * csim('step', t, G1a);
er1a = sum((y - y1a).^2);
[p1, er1b] = datafit(G1, [y; t], [k1; T1]);
k1b = p1(1), T1b = p1(2);
G1b =  syslin('c', k1b / (T1b * %s + 1));
y1b = du * csim('step', t, G1b);
er1b = sum((y - y1b).^2);
scf();
plot(t, y, t, y1a, t, y1b);
h = get('hdl');
h.children(3).thickness = 2;
h = legend('eksperyment', ..
sprintf('model t10-t90 (k = %.2f, T = %.1f, er = %.1f)', k1, T1, er1a), ..
sprintf('model datafit (k = %.2f, T = %.1f, er = %.1f)', k1b, T1b, er1b), opt=4);
h.font_size=3;
xlabel('t [s] - skala 1:300', 'fontsize', LAB_FS);
ylabel('glukoza [mg/dL]', 'fontsize', LAB_FS);
title(['Dopasowanie do modelu inercyjnego I-rzędu:' ...
'$G(s)=\frac{k}{Ts+1}$'], 'fontsize', 3);
xgrid;

// model 2
G2a = syslin('c', k2 / (T2 * %s + 1)^2);
y2a = du * csim('step', t, G2a);
er2a = sum((y - y2a).^2);
[p2, er2b] = datafit(G2, [y; t], [k2; T2]);
k2b = p2(1), T2b = p2(2);
G2b =  syslin('c', k2b / (T2b * %s + 1)^2);
y2b = du * csim('step', t, G2b);
er2b = sum((y - y2b).^2);
scf();
plot(t, y, t, y2a, t, y2b);
h = get('hdl');
h.children(3).thickness = 2;
h = legend('eksperyment', ..
sprintf('model t10-t90 (k = %.2f, T = %.1f, er = %.1f)', k2, T2, er2a), ..
sprintf('model datafit (k = %.2f, T = %.1f, er = %.1f)', k2b, T2b, er2b), opt=4);
h.font_size=3;
xlabel('t [s] - skala 1:300', 'fontsize', LAB_FS);
ylabel('glukoza [mg/dL]', 'fontsize', LAB_FS);
title(['Dopasowanie do modelu inercyjnego II-rzędu' ...
'$G(s)=\frac{k}{(Ts+1)^2}$'], 'fontsize', 3);
xgrid;

// model 3
p = datafit(G3, [y; t], [k2; 0.9 * T2; 1.1 * T2]);
k3 = p(1), Ta3 = p(2), Tb3 = p(3);
G3 = syslin('c', k3, (Ta3 * %s + 1) * (Tb3 * %s + 1));
y3 = du * csim('step', t, G3);
er3 = sum((y - y3).^2);
scf();
plot(t, y , t, y3);
h = get('hdl');
h.children(2).thickness = 2;
h.children(1).foreground = 5;
h = legend('eksperyment', ..
sprintf('model datafit (k = %.2f, T1 = %.1f, T2 = %.1f, er = %.1f)', ..
k3, Ta3, Tb3, er3), opt=4);
h.font_size=3;
xlabel('t [s] - skala 1:300', 'fontsize', LAB_FS);
ylabel('glukoza [mg/dL]', 'fontsize', LAB_FS);
title(['Dopasowanie do modelu inercyjnego II-rzędu' ...
'$G(s)=\frac{k}{(T_1s+1)(T_2s+1)}$'], 'fontsize', 3);
xgrid;