%% Mínimos cuadrados, pseudoinversa, ponderación, etc.: ejemplo "físico" para motivar su utilidad en control multivariable
% © 2025, Antonio Sala, Universitat Politècnica de València, España. Todos los derechos reservados.
% Objetivo: comprobar las diferentes opciones de control sobre un sistema con 2 entradas y 5 salidas (posibles variables controladas).
%
% Presentación en vídeo:
% https://personales.upv.es/asala/DocenciaOnline/Video/lsforn.html
%
% Tabla de Contenidos
% Modelo
% Problema 1: controlar "T" por mínimos cuadrados [no ponderados]
% Problema 2: Subconjunto de variables controladas
% Problema 3: Mínimos cuadrados ponderados
% Opción 4: control de la temperatura "media"
%%
%% Modelo

Gfull=[10 11 9 5 2;-5 -4 -3 -1 0;
    3 6 9 12 10;0 -1 -2 -3 -5]'

% *Ejemplo 1, sólo consideramos 2 actuadores:

G=Gfull(:,[1 3])

%% Problema 1: controlar "T" por mínimos cuadrados [no ponderados]
% IMPORTANTE: variables controladas deben tener las mismas unidades, si no, hay que "escalar".

K=pinv(G)
incTdeseado=[50 50 50 50 50]';
u=K*incTdeseado
salidaLS=G*u
error=incTdeseado-salidaLS
plot(salidaLS,LineWidth=2.5), hold on
plot(incTdeseado), hold off, grid on
legend("M.C.","ref")

%% Problema 2: Subconjunto de variables controladas

TrozoG=G([2 4],:)
%RGA=TrozoG.*inv(TrozoG')
u2=inv(TrozoG)*[50;50]
y2=G*u2
[salidaLS y2]
errs=incTdeseado-ans
[norm(errs(:,1)) norm(errs(:,2))]
plot(salidaLS,LineWidth=2.5), hold on
plot(incTdeseado), 
plot(y2,LineWidth=2.5)
hold off, grid on, legend("M.C.","ref", "subset")

%% Problema 3: Mínimos cuadrados ponderados

Pesos=[1 5 15 5 1];
%Pesos=[1 1e6 1 1e6 1];
Gesc=diag(Pesos)*G;
incTdeseadoESC=diag(Pesos)*incTdeseado;
u=pinv(Gesc)*incTdeseadoESC
yLSpond=G*u;
[yLSpond salidaLS]
plot(salidaLS,LineWidth=2.5), hold on
plot(incTdeseado), 
plot(y2,LineWidth=2.5)
plot(yLSpond,LineWidth=2.5)
hold off, grid on, legend("M.C.","ref", "subset","M.C.pond")

%% Opción 4: control de la temperatura "media"

Gmed=[1 1 1 1 1]*G/5

% Me sobran actuadores... Podría utilizar sólo un actuador:

u1=inv(Gmed(1))*50

% El perfil de temperaturas sería:

yprueba=G*[u1;0]
mean(yprueba)
mean(salidaLS)
plot(salidaLS,LineWidth=2.5), hold on
plot(incTdeseado), 
plot(yprueba,LineWidth=2.5), hold off, grid on
legend("M.C.","media con solo u_{LEFT}")

% Si quiero "repartir" el esfuerzo de control, puedo minimizar u_L^2+u_R^2 que consigan la temperatura "media" deseada. IMPORTANTE: actuadores deben tener las mismas unidades, si no, hay que "escalar".

u_LSbalancing=pinv(Gmed)*50

%

plot(salidaLS,LineWidth=2.5), hold on
plot(incTdeseado), 
plot(G*u_LSbalancing,LineWidth=2.5), hold off, grid on
legend("M.C.","control Tmedia equilibrado")

% *Todas las respuestas son "relativamente parecidas", pero cada selección de variables controladas/índice de coste hará que el sistema de control reaccione de forma diferente ante "perturbaciones" sobre todo si son marcadamete asimétricas.
% *Si el sistema estuviese "mal condicionado" (o el subconjunto de actuadores estuviese mal elegido) habría más diferencias entre las respuestas. Esto no es objetivo de este material.