Contents

Ajuste RLC subamortiguado (Archivo: Ajuste_RLC_subam.m)

% Se requiere tener ademas el archivo RLCsub.m en el directorio de trabajo.

% Se reescalan las variables originales para mejorar la calidad del ajuste.
% Se reescalan nuevamente la variables ajustadas para volver las variables
%    originales, y luego se obtienen los valores de R, L y C

% Para mas informacion consultar:
%   a) La pagina web de la documentacion de Matlab: https://www.mathworks.com/help/matlab/
%   b) El archivo Ajuste_RLC_subam.pdf adjunto (contiene las ecuaciones vistas en clase)
%   c) La carpeta Ajuste_RLC_subam-html adjunta

% Cesar Moreno,
% Curso de verano de Laboratorio 3, 2020, DF-FCEN-UBA y CONICET

Borro todas variables y graficos previos. Tambien habilito la funcion "pause"

clear all           % Borro todas las variables peexistentes
close all hidden    % Hago lo mismo con los graficos previos, incluso con los ocultos

pause on            % Habilito la funcion "pause", por si la necesito durante la demostracion

Genero 400 datos de prueba y los grafico

global to Io t I     % Quiero poder usar estas variables en todo el programa,
                     % incluyendo subrutinas/funciones/modulos etc.

to = linspace(0 , 7e-3 , 400)';     % [s]

Vo  = 10;           % [V]
Lo   = 1;           % [H]
Co   = 0.1e-6;      % [F]
Ro   = 1000;        % [Ohm]

% Defino 3 variables auxiliares, y el periodo To porque es mas comodo que w
% (o Do), pues a To puedo verlo facilmente del grafico de I(t).

Bo  = Ro/2/Lo ;
Do  = sqrt(1/(Lo*Co) - Bo^2) ;
Ao  = Vo/Do/Lo ;

To  = 2*pi/Do;

Reescalo el problema: redefino (normalizo) la escala de tiempos, la func de ajuste ( I(t) ) y sus parametros (A, B y T)

to = 1000 * to;
Ao = 1000 * Ao;
Bo = Bo / 1000;

To = To * 1000;

Continuo

% Defino la corriente Io (ideal -- sin incerteza)
Io   = Ao * exp(-Bo * to) .* sin( (2*pi/To) .* to) ;


% Ahora defino la corriente I (real -- con incertezas agregadas)
In = awgn(Io,10,'measured');    % awgn => Add White Gaussian Noise

I   = In .* (1 + 0.03 .* random('unif',-1,1,size(Io)) ); % del Manual del Osc

% Le agrego incertezas tambien a la lista de tiempos
t   = to .* (1 + 50e-6 .* random('norm',0,1,size(to)) ); % del Manual del Osc

% Defino la envolvente ideal
Eo  = Ao * exp(-Bo * to);

% Grafico los "datos" ideales, los que tienen ruido y la envolvente ideal
figure(1)
plot(to,Io,'g:',t,I,'+b--',to,[Eo -Eo],'g-','LineWidth',1.75)
grid on
xlabel('{\it{t}} (ms)')
ylabel('{\it{I}} (mA)')
title('Datos RLC subamortiguado')
legend('Curva teorica','Datos experimentales', ...
    'Envolvente teorica','Location','northeast')

% disp('Colocar el cursor en la ventana de comandos y apretar cuaquier tecla')
% pause

Ajuste No Lineal por Cuadrados Minimos donde: "y = f(x)"

y = I;
x = t;

fit_Type    = fittype( 'RLCsub( x, A, B, T )' );

fit_Object_1 = fit( x, y, fit_Type, ...
    'StartPoint', [2*Ao, 2*Bo, 0.75*To], ...
    'MaxFunEvals',3000, 'MaxIter',2500, 'TolFun',1e-16, 'TolX',1e-16)

% disp('Colocar el cursor en la ventana de comandos y apretar cuaquier tecla')
% pause
fit_Object_1 = 

     General model:
     fit_Object_1(x) = RLCsub( x, A, B, T )
     Coefficients (with 95% confidence bounds):
       A =       3.206  (3.05, 3.362)
       B =      0.5185  (0.4829, 0.5542)
       T =       2.021  (2.005, 2.036)

Grafico el intervalo de confianza

Nivel_de_Confianza = 0.99;
Interv_Conf = predint(fit_Object_1,x,Nivel_de_Confianza,'observation','on');

interv_conf = confint(fit_Object_1,Nivel_de_Confianza)

figure(3)

plot(to,Io,'.g-',x,y,'b+--','LineWidth',1.75)
hold on
plot(fit_Object_1,'k-')
hold on
plot(x,Interv_Conf,'m--','LineWidth',1.5), xlim([0 7])
xlabel('{\it{t}} (ms)')
ylabel('{\it{I}} (mA)')
title(['Ajuste RLC Subamortiguado con Intervalo de Conf. del ' ...
    num2str(Nivel_de_Confianza*100) '%'])
legend('Curva teorica','Datos Exp.', 'Ajuste', 'Int. de Conf.')
% text('hola','Location','southwest')
grid on
hold off


% disp('Colocar el cursor en la ventana de comandos y apretar cuaquier tecla')
% pause
interv_conf =

    3.0002    0.4717    2.0001
    3.4117    0.5654    2.0413

Obtengo los parametros de ajuste y sus intervalos de confianza (Continuan rescalados!)

% Resultado general
Resultado_general = fit_Object_1

% Extraigo los 3 parametros de ajuste juntos, en forma de lista
Parametros  = coeffvalues(fit_Object_1); % Lista de valores de A, B y T

% Extraigo cada parametro por separado
A = fit_Object_1.A;     % Valor ajustado de A (el re-escalado previamente)
B = fit_Object_1.B;      % Valor ajustado de B (el re-escalado previamente)
T = fit_Object_1.T;      % Valor ajustado de T (el re-escalado previamente)

% Tambien puedo preguntar por la funcion de ajuste
Funcion_de_Ajuste = formula(fit_Object_1)

% Extraigo los intervalos de confianza de A, B y T, en forma de tabla
Int_Conf_Param = confint(fit_Object_1)  % Int. de Conf. de A, B y T

% Extraigo los valores Min y Max de A, B y T por separado
A_Min   =  Int_Conf_Param(1,1);
A_Max   =  Int_Conf_Param(2,1);
B_Min   =  Int_Conf_Param(1,2);
B_Max   =  Int_Conf_Param(2,2);
T_Min   =  Int_Conf_Param(1,3);
T_Max   =  Int_Conf_Param(2,3);
Resultado_general = 

     General model:
     Resultado_general(x) = RLCsub( x, A, B, T )
     Coefficients (with 95% confidence bounds):
       A =       3.206  (3.05, 3.362)
       B =      0.5185  (0.4829, 0.5542)
       T =       2.021  (2.005, 2.036)

Funcion_de_Ajuste =

RLCsub( x, A, B, T )


Int_Conf_Param =

    3.0497    0.4829    2.0051
    3.3623    0.5542    2.0363

Obtengo los valores ajustados de R, L, y C (ahora hay que des-reescalar!!!)

% Des-reecalo
A_orig  = A / 1000;
T_orig  = T / 1000;
B_orig  = B * 1000;
w_orig  = 2*pi/T_orig;

L_ajustado = Vo/A_orig/w_orig;
R_ajustado = 2 * L_ajustado * B_orig;
C_ajustado = 1/(L_ajustado * ( (w_orig)^2 + (B_orig)^2) );

% Ajuste_LRC = [num2str(L_ajustado), '  ', num2str(R_ajustado) '  ', ...
%    num2str(C_ajustado)]

Ahora incluyo los Intervalos de Confianza de L, R y C

Primero des-reescalo los valores A_Min, A_Max, y los de B, T y w Min y Max

A_Min_orig   =  Int_Conf_Param(1,1) / 1000;
A_Max_orig   =  Int_Conf_Param(2,1) / 1000;
B_Min_orig   =  Int_Conf_Param(1,2) * 1000;
B_Max_orig   =  Int_Conf_Param(2,2) * 1000;
T_Min_orig   =  Int_Conf_Param(1,3) / 1000;
T_Max_orig   =  Int_Conf_Param(2,3) / 1000;
w_Min_orig   =  2*pi/T_Max_orig;
w_Max_orig   =  2*pi/T_Min_orig;

% Ahora calculo los valores de L_Min, L_Max y lo analogo para R y C
L_Min   = Vo/A_Max_orig/w_Max_orig;
L_Max   = Vo/A_Min_orig/w_Min_orig;
R_Min   = 2 * L_Min * B_Min_orig;
R_Max   = 2 * L_Max * B_Max_orig;
C_Min   = 1/(L_Max * ( (w_Max_orig)^2 + (B_Max_orig)^2) );
C_Max = 1/(L_Min * ( (w_Min_orig)^2 + (B_Min_orig)^2) );

Resultado completo del ajuste (L_Min L_ajustado L_Max. Y lo mismo para R y C)

Son 3 listas que contienen L_Min L L_Max R_Min R R_Max C_Min C C_Max

L_ajus_completo = [L_Min L_ajustado L_Max]
R_ajus_completo = [R_Min R_ajustado R_Max]
C_ajus_completo = [C_Min C_ajustado C_Max]

pause off

return
L_ajus_completo =

    0.9491    1.0031    1.0627


R_ajus_completo =

   1.0e+03 *

    0.9167    1.0403    1.1778


C_ajus_completo =

   1.0e-06 *

    0.0929    0.1003    0.1080

Salida mas avanzada

% Contiene detalles del proceso del ajuste

[fit_Object_2,gof,output] = fit( x, y, fit_Type, ...
    'StartPoint', [2*Ao, 5*Bo, 0.75*1.5], ...
    'MaxFunEvals',3000, 'MaxIter',2500, 'TolFun',1e-14, 'TolX',1e-14)