Práctica 3: Sensores Inteligentes

Estimación de paramétros en línea

*Objetivo:* Introducir y motivar el uso del método de Mínimos Cuadrados Recursivos (RLS: recursive least-squares) para estimar en línea parámetros dinámicos de un sensor. Los parámetros estimados actúan como mecanismo de transducción (por ejemplo, ganancia o constante de tiempo) y permiten convertir la respuesta dinámica en información útil sobre la magnitud física.
*Motivación:* Los sensores inteligentes no sólo entregan una señal de salida: integran procesamiento embebido que estima, calibra y compensa. Cuando un parámetro físico del sensor (p. ej. la ganancia o la constante de tiempo) cambia con la variable que se mide o por condiciones ambientales, estimarlo en tiempo real permite:
El método RLS permite actualizar los parámetros de un modelo dinámico mientras se mide, sin necesidad de detener el sistema. El algortimo RLS es una alternativa a los mínimos cuadrados ordinarios para poder estimar los parámetros de un modelo lineal en tiempo real. Para mayor, información se refiere al lector a la referencia [1].
*Procedimiento:* La práctica está dividida en XX pasos. Lee detenidamente la descripción de cada paso, y en caso de que exista un fragmento de código, deberás transcribirlo en un archivo .mlx (LiveScript) de MATLAB, y responder las preguntas de cada sección.

Paso 1. Modelo del sensor

Consideramos un sensor capacitivo de humedad relativa (HR) como el mostrado en la Figura 1. La HR es la relación entre la masa de vapor de agua que tiene una determinada masa de aire y la que tendrá si estuviera saturada, a la misma temperatura.
Figura 1. Sensor capacitvo de humedad relativa.
Un sensor capacitivo de humedad relativa funciona midiendo los cambios en la capacitancia de un condensador cuya constante dieléctrica varía con el contenido de humedad del aire. El sensor está formado por dos placas conductoras separadas por un material dieléctrico (polímero o cerámica porosa) que absorbe moléculas de agua del ambiente. Cuando la humedad relativa (HR) del aire aumenta, más moléculas de agua se adsorben en el dieléctrico, incrementando su constante dieléctrica . Sin embargo, dado que el capacitor no es perfecto y presenta una componente de disipación, también existe una resistencia eléctrica asociada a él.
La Figura 2 muestra el circuito equivalente del sensor de HR, compuesto por un resistor y un capacitor. El sensor es excitado con un voltaje , y la respuesta del sensor o salida, corresponde al voltaje del capacitor amplificado por un factor de diez (10x).
Figura 2. Sensor capacitvo de humedad relativa.
Para obtener el modelo del sensor, es necesario realizar el análisis del circuito de la Figura 2. Para ello, sabemos que la corriente que fluye por el resistor y el capacitor es la mimsa, y podemos emplear la ley de voltaje de Kirchoff para analizar el circuito, tal que
donde es el voltaje del resistor y es el voltaje del capacitor. Por otro lado, la corriente a través del capacitor está dada por
Sustituyendo la expresión (2) en el voltaje del resistor, obtenemos que
Así, al insertar la ecuación (3) en (1), obtenemos la ecuación diferencial que gobierna la dinámica del sensor
El coeficiente de la primera derivada en (4) puede definirse como la constante de tiempo del circuito, . Asimismo, debemos recordar que el voltaje del capacitor se amplifica por un factor K, por lo que, la salida del sistema completo es . Con estas consdieraciones, el modelo dinámico puede escribirse finalmente en terminos del voltaje de salida como
Es importante observar que el sensor de humedad presenta la dinámica de un sistema de primer dada por la ecuación diferencial (5).
Preguntas de la sección:

Paso 2. Simulación del sensor

Para observar el comportamiento de la salida del sensor ante un cambio en el voltaje de entrada, transcribe el siguiente código en un LiveScript de MATLAB y ejecutalo.
clear; clc; close all;
 
%% Parámetros del circuito
R = 10e3; % Resistencia [ohms]
C = 100e-9; % Capacitancia [farads]
tau = R * C; % Constante de tiempo [s]
K = 10; %ganancia de la etapa de amplificación 10x
fprintf('Constante de tiempo τ = %.3e s\n', tau);
Constante de tiempo τ = 1.000e-03 s
 
%% Funciones de transferencia
s = tf('s');
 
% Salida = voltaje en el capacitor
G_C = K / (tau*s + 1);
 
 
%% Respuesta temporal a un escalón de 5 V
Ts = 0.0001; %Periodo de muestreo
t = 0:Ts:0.025; % tiempo de simulación [s]
N = length(t);
Vi = 0.5*sin(2*pi*100*t);%0.01*ones(size(t)); % entrada: escalón de 5 V
 
% Simulación del sistema
A = -1/tau;
B = K/tau;
Vo = zeros(size(t));
for k = 2:length(t)
Vo(k) = (Vo(k-1) + Ts*(A*Vo(k-1) + B*Vi(k-1)));
end
 
r = 1e-1*randn(1,N); %ruido de medición
 
Vo = Vo + r; % Voltaje de salida medido
 
 
figure('Color', 'w');
plot(t, Vi, 'b--', 'LineWidth', 2);
hold on;
plot(t, Vo, 'r', 'LineWidth', 2);
 
set(gca, 'Color', 'w', ...
'XColor', 'k', ...
'YColor', 'k', ...
'GridColor', 'k', ...
'GridAlpha', 0.2);
 
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('Voltaje [V]', 'Color', 'k');
title('Respuesta temporal del circuito RC', 'Color', 'k');
lgd = legend('Entrada V_{i}(t)', 'Voltaje en el capacitor V_o(t)', 'Location', 'southeast');
set(lgd, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on;
hold off;
 
Preguntas de la sección:

Paso 3. Problema de estimación

Una vez verificado que el sensor responde correctamente, es necesario plantear el problema de estimación de parámetros de su modelo. Lo anterior es útil cuando existe un cambio de humedad relativa, lo cual hace que cambie la capacitancia del sensor. Para medir a ésta, no es posible hacerlo directamente, y en cambio debemos realizar una medida indirecta empleando un algoritmo de estimación.
El modelo dinámico del sensor en el dominio de la frecuencia, está dado por la función de transferencia
donde y son los parámetros a estimar. La función de transferencia en (6) puede reescribirse en términos de la señal de salida como
lo cual corresponde a la transformada de Laplace de la ODE en (5). Comparando (5) y (7) es claro observar que el término corresponde a la derivada del voltaje de salida. Para obtener dicha señal, es necesario realizar la diferenciación numérica de ; sin embargo, en caso de emplear métodos numéricos convencionales, ésto conlleva a amplificar el ruido de medición, lo que resulta poco viable en la práctica.
Para obtener la derivada del voltaje, podemos emplear un filtro lineal de primer orden con frecuencia de corte , cuya función de transferencia es
Así, el filtro se aplica en las señales de entrada y salida, por lo que, el modelo en (7) se convierte en
donde , y , son las señales filtradas del voltaje de entrada, de salida y de la derivada del voltaje de salida, respectivamente. De forma interesante, el modelo en la ecuación (9) es lineal en los parámetros b y a. De esta forma, (9) puede escribirse en notación matricial como
donde se denomina regresor, y es el vector de parámetros a estimar (desconocido), con ⊤ la transpuesta del vector. Con ello, el problema de estimación de parámetros del circuito equivalente del sensor de HR, puede escribirse como un problema de regresión lineal de la forma
Finalmente, un estimador natural para el vector de parámetros θ es el estimador por mínimos cuadrados ordinarios (LS: least-squares).
El siguiente fragmento de código se encarga de obtener el regresor Φ, a través de aplicar el filtro lineal (8) con un polo en -2.5 rad/s, a las señales medidas. Transcribe el código en tu archivo LiveScript y realiza las observaciones pertinentes.
%% Filtrando las señales de entrada y salida
w_c = 2.5; % polo del filtro
 
 
Vof = zeros(size(t));
Vif = zeros(size(t));
Vof_dot = zeros(size(t));
 
% Se aplica el filtro muestra por muestra de ambas señales
% Esto es equivalente a filtrar en tiempo real
for k = 2:length(t)
Vof(k) = Vof(k-1) + Ts*(-w_c*Vof(k-1) + w_c*Vo(k));
Vif(k) = Vif(k-1) + Ts*(-w_c*Vif(k-1) + w_c*Vi(k));
 
% Aproximación de la derivada dVo/dt (medida) usando diferencias
% finitas
Vof_dot(k) = (Vof(k) - Vof(k-1))/Ts;
 
end
 
 
 
figure('Color', 'w');
subplot(3,1,1)
plot(t, Vof_dot, '-k', 'LineWidth', 1.2)
grid on
set(gca, 'Color', 'w', 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k');
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('Voltaje [V]', 'Color', 'k');
title('Derivada de la señal de salida filtrada', 'Color', 'k');
subplot(3,1,2)
plot(t, Vof, '--b', 'LineWidth', 1.2)
grid on
set(gca, 'Color', 'w', 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k');
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('Voltaje [V]', 'Color', 'k');
title('Señal de salida filtrada', 'Color', 'k');
subplot(3,1,3)
plot(t, Vif, '--r', 'LineWidth', 1.2)
grid on
set(gca, 'Color', 'w', 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k');
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('Voltaje [V]', 'Color', 'k');
title('Señal de entrada filtrada', 'Color', 'k');
 
% Construcción del regresor
Phi = [Vif' -Vof'];
 
%Solución del problema de regresion por mínimos cuadrados ordinarios
theta_LS = pinv(Phi'*Phi)*Phi'*Vof_dot';
fprintf('Parámetro b estimado = %.2f \n', theta_LS(1));
Parámetro b estimado = 9915.60
fprintf('Parámetro a estimado = %.2f \n', theta_LS(2));
Parámetro a estimado = 994.03
Preguntas de la sección:

Paso 3. Mínimos cuadrado recursivos

Una vez que obtuvimos la estimación de parámetros por mínimos cuadrados, pudimos verificar que éste funciona adecuadamente. Sin embargo, el costo computacional al resolver la ecuación normal crece exponencialmente con el número de muestras de las señales para construir el regresor. La alternativa ideal para subsanar este problema es el algoritmo de mínimos cuadrados recursivos (RLS). Por simplicidad, no desarrollaremos la teoría, y el lector debe referirse a [1] para mayor información.
El algoritmo RLS funciona tomando como base el mismo problema mostrado en (11), pero en vez de realizar operaciones con matrices para obtener su solución, ésta se calcula de forma recursiva.
El algorimto trabaja con la ésima muestra de las señales , y , una matriz de covarianza inicial , el vector de parámetros estimados inicial , y un hiperparámetro llamado factor de olvido. De esta forma el RLS está conformado por los siguientes seis pasos:
  1. Construir el regresor:
  2. Cálculo del término de corrección:
  3. Cálculo de la señal de salida estimada:
  4. Cálculo del error de estimación:
  5. Actualización de los parámetros:
  6. Actualización de la matriz de covarianza:
los cuales se realizan de forma iterative desde hasta N, donde Nes el número total de muestras de las señales , y .
El siguiente fragmento de código implementa los seis pasos del algoritmo RLS. Transcribe el código en tu archivo LiveScript y realiza las observaciones pertinentes.
% Algoritmo RLS
 
% Parámetros "verdaderos"
a_true = 1/tau;
b_true = K/tau;
 
 
% Inicialización
theta = [0; 0]; % Estimación inicial [b_hat; a_hat]
P = 1E6*eye(2); % Covarianza inicial
lambda = 0.95; % Factor de olvido
 
theta_hist = zeros(2, length(t));
 
 
for k = 2:N
 
phi = [Vif(k); -Vof(k)];
Kappa = P*phi/(lambda + phi'*P*phi);
Vo_hat = phi'*theta;
err = Vof_dot(k) - Vo_hat;
theta = theta + Kappa*err;
P = (P - Kappa*phi'*P)/lambda;
theta_hist(:,k) = theta; %almacena la evolución de los parámetros estimados
end
 
%% Grafica resultados
figure('Color', 'w');
subplot(2,1,1);
plot(t, theta_hist(1,:), 'r', 'LineWidth', 1.5); hold on;
yline(b_true, '--b', 'LineWidth', 1.5);
set(gca, 'Color', 'w', 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k');
title('Parámetro b estimado', 'Color', 'k');
lgd1 = legend('b_{est}', 'b_{true}');
set(lgd1, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
ylim([min(theta_hist(1,:))-1000, max(theta_hist(1,:)) + 1000])
 
grid on;
 
subplot(2,1,2);
plot(t, theta_hist(2,:), 'r', 'LineWidth', 1.5); hold on;
yline(a_true, '--b', 'LineWidth', 1.5);
set(gca, 'Color', 'w', 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k');
title('Parámetro a estimado', 'Color', 'k');
lgd2 = legend('a_{est}', 'a_{true}');
set(lgd2, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
ylim([min(theta_hist(2,:))-1000, max(theta_hist(2,:)) + 1000])
grid on;
El resultado del código anterior es la señal de evolución en el tiempo de los parámetros estimados del modelo y .
Preguntas de la sección:

Paso 4: Interpretación de los parámetros

Finalmente, para interpretar los resultados del paso anterior, es necesario recordar que el modelo del sensor de HR contempa dos parámetros
Lo anterior, corresponde a un sistema de dos ecuaciones con dos incógnitas, las cuales pueden ser obtenidas a partir de los parámetros estimados y . De esta forma se tiene que la constante de tiempo del sensor puede estimarse como
mientras que la ganancia estática estimada es
Preguntas de la sección:

Reflexión final

En esta práctica estudiamos como un sensor de humedad relativa puede modelarse a través de un circuito eléctrico equivalente de primer orden. Así, con ayuda del modelo podemos y sus parámetros es posible medir indirectamente, a través de un método de estimación, variables que físicamente no son accesibles.
Para fines de estudio, se mostró el algoritmo de mínimos cuadrados ordinarios y recursivos, enfatizando en este último por su capacidad de realizar la estimación de parámetros en línea. En conjunto, tanto los parámetros del modelo, como un algoritmo robusto de estimación, permiten desarrollar sensores inteligentes con capacidad de adaptación dinámica e incluso realizar tareas de predicción.

Ejercicio para el estudiante

Una vez estudiados los conceptos de estimación de parámetros por mínimos cuadrados recursivos es momento de poner a prueba tu aprendizaje. Para ello, considera el modelo del sensor de humedad relativa pero cuyos parámetros son variantes en el tiempo. Es decir,
donde el superíndice ⋆ hace referencia a que b y a no son constantes en todo el intervalo de tiempo. Físicamente, esto implicará que desde un inicio y hasta los 0.0125 segundos, los parámetros b y a dependerán de los valores ms y 10. A partir de 0.0126 segundos, la capacitancia cambió debido a un cambio en la HR, y la constante de tiempo debe ser ms, mientras que la ganancia también cambio a un tercio de su valor origina. El siguiente código te ayudara a definir dichos cambios en los parámetros del modelo.
% ****************************************************************
% 1. Simulación del sistema
% ****************************************************************
 
Vo = zeros(size(t));
for k = 2:length(t)
 
%Vo(k) = (Vo(k-1) + Ts*(A*Vo(k-1) + B*Vi(k-1)));
if k >round(N/2)
A = -1/(2*tau);
B = (K/3)/tau;
end
 
Vo(k) = (Vo(k-1) + Ts*(A*Vo(k-1) + B*Vi(k-1)));
end
 
r = 1e-1*randn(1,N); %ruido de medición
 
Vo = Vo + r; % Voltaje de salida medido
 
figure('Color', 'w');
plot(t, Vi, 'b--', 'LineWidth', 1.2);
hold on;
plot(t, Vo, 'r', 'LineWidth', 2);
set(gca, 'Color', 'w', ...
'XColor', 'k', ...
'YColor', 'k', ...
'GridColor', 'k', ...
'GridAlpha', 0.2);
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('Voltaje [V]', 'Color', 'k');
title('Respuesta temporal del circuito RC', 'Color', 'k');
lgd = legend('Entrada V_{i}(t)', 'Voltaje en el capacitor V_o(t)', 'Location', 'southeast');
set(lgd, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
 
grid on;
hold off;
 
% ****************************************************************
% 2. Se aplica el filtro muestra por muestra de ambas señales
 
% Aquí va el código para filtrar las señales
% ****************************************************************
 
 
% ****************************************************************
% Algoritmo RLS
 
% Aquí va el código del estimador RLS
 
% ****************************************************************

Actividad

  1. Compara los resultados del algoritmo RLS para lambda 0.1, 0.5 y 0.995. ¿Cuál es la diferencia entre los resultados obenitos?
  2. Cambia la señal de entrada por un escalón de amplitud 0.5 volts. ¿Qué sucedió con el desemepeño del algoritmo RLS?
  3. Investigue algunas aplicaciones del algoritmo RLS en áreas como procesamiento digital de señales y control automático.

Referencias

[1] Apuntes de Sensores Inteligentes — Daan Yael. Maldonado-Uriostigue, D. y Roberto G. Ramírez-Chavarría, Online, 2024. https://sitios.iingen.unam.mx/ApuntesSensoresInteligentes/landing.html
[2] Bhuyan, M. (2011). Intelligent Instrumentation: Principles and Applications. Boca Raton, FL: CRC Press. ISBN 978-1-4200-8953-0.
[3] Principles of System Identification: Theory and Practice — Arun K. Tangirala, CRC Press, 2015.
[4] System Identification Toolbox for Use with MATLAB: User's Guide — Lennart Ljung, MathWorks, 2004.