Modelos, Control y Sistema de Visión

Central     Modelos     Control     Visión     Aplicaciones     Mapa del sitio     Publicaciones     Sobre el autor      

Ejemplos de filtros lineales

 

Ejemplo I: Obtener la salida de un filtro lineal sin ganancia, conociendo sus parámetros

 

Se desea representar el siguiente filtro:

y = 0.5*x1-0.3*x2

En este ejemplo los parámetros son: w1= 0.5 y w2= -0.3.

Se desea determinar la salida equivalente al vector de entradas:

x =
[1 3
 2 4
 3 5
 4 6]

 

Solución:

% Se define la matriz de entradas x[n,K]=x[2,4]

>> x=x'
x =
1 2 3 4
3 4 5 6

% Se define el filtro lineal

>>interx1=[1 4]  % Intervalo [min, max] de x1

>>interx2=[3 6]  % Intervalo [min, max] de x2

>>numsal=1       % Número de salidas

>>net=newlin([interx1; interx2], numsal);

% Se definen los parámetros del filtro

>>net.IW{1,1}=[0.5 -0.3]

>>net.b{1}=0;  % La ganancia es cero

% Se verifican los parámetros del filtro

>> net.IW{1,1}
ans =
0.5000 -0.3000

>> net.b{1}
ans =
0

% Se obtiene la salida de la red

>>y=sim(net,x)

y =
-0.4000 -0.2000 0 0.2000

% Se comprueba

>> x'*net.IW{1,1}'
ans =
-0.4000
-0.2000
0
0.2000

 

Ejemplo II: Clasificar una función AND utilizando un filtro lineal sin ganancia

 

La función AND se define por la siguiente estructura de entrada-salida:

datos =
[0 0 0
 0 1 0
 1 0 0
 1 1 1]

 

Solución:

% Se define la matriz de entradas

>> x=datos(:,1:2)'
x =
0 0 1 1
0 1 0 1

% Se define el vector de salidas

>> y=datos(:,3)'
y =
0 0 0 1

% Se define el filtro lineal

>>interx1=[0 1]  % Intervalo [min, max] de x1

>>interx2=[0 1]  % Intervalo [min, max] de x2

>>numsal=1       % Número de salidas

% Se define la red denominada net

>>net=newlin([interx1; interx2], numsal);

% Se define ganancia cero

>> net.biasConnect(1)=0

% Se realiza procesamiento por lotes (train)

>>net.trainParam.epochs = 1000;   % Número de épocas

>>net.trainParam.goal = 0.01;        % Error deseado

>> net.trainFcn='traingd';              % Entrenamiento por gradiente descendente

>>net = train(net,x,y);                 

% Se verifica el resultado (se aplica al filtro la matriz de entradas)

>>y2=sim(net,x)

y2 =
0 0.3333 0.3333 0.6667 

% Si se toma como referencia 0.5, la salida ha sido clasificada: los tres primeros valores son menores a 0.5 (equivalente a 0) y la última es mayor a 0.5 (equivalente a 1)

% Se verifican los parámetros del filtro

>> net.b{1}
ans =
[]                   % w0=0 (ganancia), se comprueba más adelante
>> net.IW{1}
ans =
0.3333 0.3333  % valores de w1 y w2

% Se comprueba, verificando la aplicación previa de la red (sim)

>> x'*net.IW{1,1}'
ans =
0
0.3333
0.3333
0.6667

% Núcleo estimador (filtro lineal) identificado

y_est = 0.3333*x1 + 0.3333*x2

 

Ejemplo III: Predecir la serie caótica temporal de Mackey-Glass utilizando un filtro lineal con ganancia

 

% Estructura de entrada-salida:

% Se pretende crear un modelo de la forma

% y(t) = f[y(t-1), y(t-11), y(t-14), y(t-17)]

% Se obtiene los valores de la serie

>> y=y'

% Convierte vector concurrente a secuencial. Esto se realiza en modelos de series temporales, donde existe una única variable

>> y = con2seq(y);

% Se define la entrada igual a la salida

>> x=y;

% Se definen las unidades de retrasos de las entradas

% (argumento) [y(t-1), y(t-11), y(t-14), y(t-17)]

>> retrasos=[1 11 14 17];

% El factor de aprendizaje

>> fa=0.01

% Se define el filtro lineal

>> net=newlin(minmax(cat(2,x{:})), 1, retrasos, fa);

% Se entrena la red

>> [net, a, e]=adapt(net, x, y);

% Se visualiza valor real y estimado

>> plot(cat(2,y{:}));     % Salida deseada
>> hold on
>> plot(cat(2,a{:}),'g'); %Valores estimados

% Parámetros resultantes

>> net.IW{1}
ans =
0.5483 0.0904 0.0070 -0.0371
>> net.b{1}     % Ganancia
ans =
0.4025

% Núcleo estimador (filtro lineal) identificado

% y(t) = 0.54*y(t-1)+0.09*y(t-11)+0.007*y (t-14)

% -0.03*y(t-17)+0.40

 

Nota: Se puede solucionar el problema como vector concurrente, tal y como se refleja en el próximo ejemplo

   

 

 

 

 

Ejemplo IV: Obtener el modelo de Box y Jenkins

 

Obtener la matriz de entrada-salida datos=[u(t), y(t)]

% Ordenar matriz para la identificación

% Utilizar el programa ordena_datos

% para crear la estructura de entrada-salida:

% y(t) = f[y(t-1), u(t-3), u (t-4)]

>> ordena_datos
Cantidad de veces a retrasar la columna 1 = 5
Cantidad de veces a retrasar la columna 2 = 2

% Se crea matriz de la forma: 

% [y(t-1), u(t-3), u (t-4)], y(t)]

% a partir de xudx generada por ordena_datos

>> matriz=[xudx(:,6), xudx(:,2), xudx(:,1), xudx(:,7)];

% Se define la matriz de entradas

>> x=matriz(:,1:3)';

% Se define el vector de salidas

>> y=matriz(:,4)';

% Se define el filtro lineal y se adapta por LMS

% solucionando la ecuación: [W b]*[x; unos] = y

>>net=newlind(x,y);

% Se verifican los parámetros del filtro

>> net.IW{1}
ans =
0.9859 -0.6970 -0.3720

>> net.b{1}
ans =
0.0146

% Se comprueba (equivale a aplicar sim)

>> y3=x'*net.IW{1,1}'+net.b{1};

% Núcleo estimador (filtro lineal) identificado

%y(t) = 0.98*y(t-1)-0.69*u(t-3)-0.37*u (t-4)+0.0146