%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% File: opt_k_forno.m
% Calcolo della temperatura ottima dei segmenti di un forno
% che minimizza il costo quadratico. Calcolo al variare di n
x0=0; xf=1000;              % Stato iniziale e Stato finale
a=1/2; b=1/2;               % Coefficienti dell'equazione alle differenze
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1); clf; n_max=6;
costo=zeros(1,n_max);
for n=(2:n_max);            % Al variare del numero di segmenti
    Rn=[b zeros(1,n-1)];
    for ii=(2:n)
        Rn(ii)=a*Rn(ii-1);  % Matrice di raggiungibilita'
    end
    u=flipud(Rn'*inv(Rn*Rn')*(xf-a^n)); % Sequenza ottima degli ingressi
    xn=[x0 zeros(1,n)];
    for ii=(1:n)
        xn(ii+1)=a*xn(ii)+b*u(ii);      % Evoluzione dello stato
    end
    plot(xn,'*'); hold on               % Graficazione
    plot(xn,'-')
    text(n+1/2,0.95*xn(n+1),['n=' num2str(n)])
    costo(n)=norm(u);
end
title('Distribuzione ottima delle temperature al variare di n')
ylabel('Temperature u(i) dei vari segmenti')
xlabel('Numero n di segmenti che compongono il forno'); grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(2); clf
plot((2:n), costo(2:n),'*',(2:n), costo(2:n),'-'); % Graficazione costo
title('Andamento del costo ottimale |u| al variare di n')
ylabel('Costo ottimale |u|')
xlabel('Numero n di segmenti che compongono il forno'); grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
