%% ========================================================================
% PRÁCTICA 4: CALIBRACIÓN DE UN APARATO DE MEDICIÓN ANALÓGICO
% Laboratorio de Mediciones Eléctricas
% Método: Comparación Directa
% Equipo A4
% ========================================================================
clear all; close all; clc;
%% ========================================================================
% SECCIÓN 1: DATOS DE ENTRADA
% ========================================================================
% --- Datos del Aparato Bajo Calibración (Voltmetro Analógico) ---
[Link] = 80; % Alcance en Volts [V]
[Link] = 1; % Clase de exactitud
[Link] = 80; % Divisiones totales de la escala
[Link] = 0.1; % Resolución mínima distinguible [V]
% --- Datos del Patrón de Trabajo (Multímetro Digital) ---
[Link] = 200; % Alcance utilizado [V]
PATRON.exactitud_pct = 0.03;% Exactitud en % de la lectura
PATRON.exactitud_dig = 1; % Exactitud en dígitos
PATRON.resolucion_dig = 0.01; % Valor de 1 dígito [V]
%Se debera automatizar el cambio de alcance una vez se pase de los 20V%
% --- Pasos de Calibración ---
% Valores nominales donde se fija el Voltmetro bajo calibración
pasos_calibracion = [5.0, 10.0, 15.0, 20.0, 25.0, 30.0]; % [V]
% --- Lecturas del Patrón (Lp) ---
% Cada fila = un paso de calibración
% Cada columna = una medición repetida (10 mediciones por paso)
% NOTA: Reemplazar estos datos con las lecturas reales de laboratorio
Lp_lecturas = [
% Paso 5.0 V (10 lecturas)
5.047, 5.046, 5.092, 5.063, 5.098, 5.049, 5.096, 5.065, 5.090, 5.098;
% Paso 10.0 V (10 lecturas)
10.34, 10.16, 10.32, 10.30, 10.18, 10.32, 10.18, 10.31, 10.19, 10.30;
% Paso 15.0 V (10 lecturas)
14.82, 14.86, 14.94, 14.83, 14.95, 14.88, 14.92, 14.90, 14.86, 14.88;
% Paso 20.0 V (10 lecturas)
19.94, 19.86, 19.88, 19.96, 19.86, 19.92, 19.90, 19.87, 19.93, 19.86;
% Paso 25.0 V (10 lecturas)
25.36, 25.28, 25.32, 25.33, 25.26, 25.34, 25.30, 25.29, 25.33, 25.8;
% Paso 30.0 V (10 lecturas)
30.12, 29.88, 30.13, 30.00, 29.86, 30.02, 30.15, 30.10, 29.88, 30.00
];
% --- Temperatura Ambiente ---
temperatura_media = 23.0; % [°C]
%% ========================================================================
% SECCIÓN 2: EVALUACIÓN TIPO A (REPETIBILIDAD DEL PATRÓN)
% ========================================================================
fprintf('========================================\n');
fprintf('EVALUACIÓN TIPO A - INCERTIDUMBRE\n');
fprintf('========================================\n\n');
n_mediciones = size(Lp_lecturas, 2); % Número de mediciones por paso
n_pasos = length(pasos_calibracion); % Número de pasos
% Inicializar vectores de resultados
Lp_media = zeros(n_pasos, 1);
Lp_varianza = zeros(n_pasos, 1);
Lp_desv_std = zeros(n_pasos, 1);
u_A = zeros(n_pasos, 1);
for i = 1:n_pasos
% Media aritmética
Lp_media(i) = mean(Lp_lecturas(i, :));
% Varianza experimental
Lp_varianza(i) = var(Lp_lecturas(i, :)); % Usar n-1 en denominador
% Desviación estándar
Lp_desv_std(i) = std(Lp_lecturas(i, :));
% Incertidumbre Tipo A (desviación estándar de la media)
u_A(i) = Lp_desv_std(i) / sqrt(n_mediciones);
fprintf('Paso %.1f V:\n', pasos_calibracion(i));
fprintf(' Media Lp = %.3f V\n', Lp_media(i));
fprintf(' Varianza = %.3e V²\n', Lp_varianza(i));
fprintf(' Desv. Std = %.3e V\n', Lp_desv_std(i));
fprintf(' u_A = %.4e V\n\n', u_A(i));
end
%% ========================================================================
% SECCIÓN 3: EVALUACIÓN TIPO B (RESOLUCIÓN Y ESPECIFICACIONES)
% ========================================================================
fprintf('========================================\n');
fprintf('EVALUACIÓN TIPO B - INCERTIDUMBRE\n');
fprintf('========================================\n\n');
% --- Tipo B del Voltmetro Bajo Calibración (Resolución) ---
% Distribución rectangular: u_B = (a/2) / sqrt(3)
% donde 'a' es el intervalo de resolución
u_B_voltmetro = ([Link] / 2) / sqrt(3);
fprintf('Voltmetro Bajo Calibración:\n');
fprintf(' Resolución = %.3f V\n', [Link]);
fprintf(' u_B(V) = %.4e V\n\n', u_B_voltmetro);
% --- Tipo B del Patrón (Especificación del Fabricante) ---
% u_E(P) = ±(% de lectura + dígitos)
% Distribución rectangular: u_B(P) = u_E(P) / sqrt(3)
u_E_patron = zeros(n_pasos, 1);
u_B_patron = zeros(n_pasos, 1);
fprintf('Patrón de Trabajo (Multímetro Digital):\n');
for i = 1:n_pasos
% Incertidumbre especificada
u_E_patron(i) = ((PATRON.exactitud_pct * Lp_media(i))/100) + ...
PATRON.exactitud_dig * PATRON.resolucion_dig;
% Incertidumbre Tipo B
u_B_patron(i) = u_E_patron(i) / sqrt(3);
fprintf(' Paso %.1f V: u_E = %.4e V, u_B = %.4e V\n', ...
pasos_calibracion(i), u_E_patron(i), u_B_patron(i));
end
fprintf('\n');
%% ========================================================================
% SECCIÓN 4: CÁLCULO DE ERRORES
% ========================================================================
fprintf('========================================\n');
fprintf('CÁLCULO DE ERRORES\n');
fprintf('========================================\n\n');
% Error: e = Lv - Lp
% donde Lv es la lectura del Voltmetro bajo calibración (paso nominal)
% y Lp es la media de las lecturas del patrón
errores = pasos_calibracion' - Lp_media;
fprintf('Paso [V] | Lv [V] | Lp_media [V] | Error e [V]\n');
fprintf('--------------------------------------------------------\n');
for i = 1:n_pasos
fprintf(' %.1f | %.1f | %.4f | %+.4f\n', ...
pasos_calibracion(i), pasos_calibracion(i), Lp_media(i), errores(i));
end
fprintf('\n');
%% ========================================================================
% SECCIÓN 5: INCERTIDUMBRE COMBINADA
% ========================================================================
fprintf('========================================\n');
fprintf('INCERTIDUMBRE COMBINADA\n');
fprintf('========================================\n\n');
% Varianzas combinadas
% u_c²(e) = u_c²(Lv) + u_c²(Lp) + u_c²(P)
% donde:
% u_c²(Lv) = u_B²(Voltmetro) - de la resolución
% u_c²(Lp) = u_A²(patrón) - de la repetibilidad
% u_c²(P) = u_B²(patrón) - de la especificación
u2_c_Lv = u_B_voltmetro^2 * ones(n_pasos, 1); % Constante para todos los pasos
u2_c_Lp = u_A.^2; % Variable por paso
u2_c_P = u_B_patron.^2; % Variable por paso
% Varianza combinada total
u2_c_total = u2_c_Lv + u2_c_Lp + u2_c_P;
% Incertidumbre combinada
u_c = sqrt(u2_c_total);
fprintf('Paso [V] | Error e [V] | u²_c(Lv) | u²_c(Lp) | u²_c(P) | u²_c(e)
| u_c(e)\n');
fprintf('--------------------------------------------------------------------------
\n');
for i = 1:n_pasos
fprintf(' %.1f | %.4f | %.4e | %.4e | %.4e | %.4e | %.4e\n', ...
pasos_calibracion(i), errores(i), u2_c_Lv(i), u2_c_Lp(i),
u2_c_P(i), ...
u2_c_total(i), u_c(i));
end
fprintf('\n');
%% ========================================================================
% SECCIÓN 6: INCERTIDUMBRE EXPANDIDA (95.45% confianza)
% ========================================================================
fprintf('========================================\n');
fprintf('INCERTIDUMBRE EXPANDIDA\n');
fprintf('========================================\n\n');
% Grados de libertad
v_Lp = n_mediciones - 1; % Para tipo A (9 con 10 mediciones)
v_B = 1 / (2 * 0.25^2); % Para tipo B (asumiendo 25% de confianza) ≈ 8
% Grados de libertad efectivos (Welch-Satterthwaite)
v_eff = zeros(n_pasos, 1);
for i = 1:n_pasos
numerador = u2_c_total(i)^2;
denominador = (u2_c_Lp(i)^2 / v_Lp) + ...
(u2_c_Lv(i)^2 / v_B) + ...
(u2_c_P(i)^2 / v_B);
v_eff(i) = numerador / denominador;
end
% Factor de cobertura t (distribución t-Student para 95.45% ≈ 2σ)
% Aproximación: usar tabla t o función de MATLAB
% Para simplificar, usamos valores típicos según v_eff
t_factor = zeros(n_pasos, 1);
for i = 1:n_pasos
v_round = round(v_eff(i));
if v_round <= 8
t_values = [12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31];
t_factor(i) = t_values(min(v_round, 8));
elseif v_round <= 15
t_factor(i) = 2.20 - (v_round - 9) * 0.02;
else
t_factor(i) = 2.00; % Para v > 30, aproxima a distribución normal
end
end
% Incertidumbre expandida
U_e = t_factor .* u_c;
fprintf('Paso [V] | v_eff | t_p(v) | U(e) [V]\n');
fprintf('-----------------------------------------------\n');
for i = 1:n_pasos
fprintf(' %.1f | %5.1f | %.2f | %.4e\n', ...
pasos_calibracion(i), v_eff(i), t_factor(i), U_e(i));
end
fprintf('\n');
%% ========================================================================
% SECCIÓN 7: EXPRESIÓN DEL RESULTADO
% ========================================================================
fprintf('========================================\n');
fprintf('EXPRESIÓN DEL RESULTADO (95.45%% confianza)\n');
fprintf('========================================\n\n');
fprintf('Paso [V] | e ± U(e) [V] | Intervalo [V]\n');
fprintf('--------------------------------------------------\n');
for i = 1:n_pasos
limite_inf = errores(i) - U_e(i);
limite_sup = errores(i) + U_e(i);
fprintf(' %.1f | %+.3f ± %.3f | [%+.3f, %+.3f]\n', ...
pasos_calibracion(i), errores(i), U_e(i), limite_inf, limite_sup);
end
fprintf('\n');
%% ========================================================================
% SECCIÓN 8: ERRORES MÁXIMOS TOLERADOS
% ========================================================================
fprintf('========================================\n');
fprintf('ERRORES MÁXIMOS TOLERADOS\n');
fprintf('========================================\n\n');
% Error máximo tolerado según clase de exactitud
% EMT = ± (Clase × Alcance) / 100
EMT = ([Link] * [Link]) / 100;
fprintf('Clase de Exactitud: %.1f\n', [Link]);
fprintf('Alcance: %.1f V\n', [Link]);
fprintf('Error Máximo Tolerado: ±%.3f V\n\n', EMT);
% Verificación de cumplimiento
fprintf('VERIFICACIÓN DE CUMPLIMIENTO:\n');
fprintf('-------------------------------\n');
cumple = true;
for i = 1:n_pasos
if abs(errores(i)) <= EMT
estado = 'CUMPLE';
else
estado = 'NO CUMPLE';
cumple = false;
end
fprintf('Paso %.1f V: Error = %+.3f V --> %s\n', ...
pasos_calibracion(i), errores(i), estado);
end
fprintf('\n');
if cumple
fprintf('*** CONCLUSIÓN: El instrumento CUMPLE con su clase de exactitud ***\n\
n');
else
fprintf('*** CONCLUSIÓN: El instrumento NO CUMPLE con su clase de exactitud
***\n\n');
end
%% ========================================================================
% SECCIÓN 9: GRÁFICAS
% ========================================================================
% --- Gráfica 1: Curva de Errores con Incertidumbre ---
figure('Name', 'Curva de Errores', 'NumberTitle', 'off');
hold on; grid on; box on;
% Zona de errores máximos tolerados
fill([0, [Link], [Link], 0], [EMT, EMT, -EMT, -EMT], ...
[0.9, 0.9, 0.9], 'EdgeColor', 'none', 'DisplayName', 'Zona Tolerada');
% Líneas de referencia
plot([0, [Link]], [EMT, EMT], 'r--', 'LineWidth', 1.5, ...
'DisplayName', 'Límite Superior EMT');
plot([0, [Link]], [-EMT, -EMT], 'r--', 'LineWidth', 1.5, ...
'DisplayName', 'Límite Inferior EMT');
plot([0, [Link]], [0, 0], 'k-', 'LineWidth', 1, ...
'DisplayName', 'Error Cero');
% Errores con barras de incertidumbre
errorbar(pasos_calibracion, errores, U_e, 'bo-', 'LineWidth', 2, ...
'MarkerSize', 8, 'MarkerFaceColor', 'b', ...
'DisplayName', 'Error ± U(e)');
xlabel('Indicación Voltmetro Bajo Calibración [V]', 'FontSize', 12);
ylabel('Error [V]', 'FontSize', 12);
title('Curva de Errores del Voltmetro Analógico', 'FontSize', 14, 'FontWeight',
'bold');
legend('Location', 'best');
xlim([0, [Link]]);
ylim([-EMT*1.5, EMT*1.5]);
hold off;
% --- Gráfica 2: Incertidumbres por Componente ---
figure('Name', 'Componentes de Incertidumbre', 'NumberTitle', 'off');
bar(pasos_calibracion, [sqrt(u2_c_Lv), sqrt(u2_c_Lp), sqrt(u2_c_P)], 'grouped');
xlabel('Paso de Calibración [V]', 'FontSize', 12);
ylabel('Incertidumbre [V]', 'FontSize', 12);
title('Componentes de Incertidumbre por Paso', 'FontSize', 14, 'FontWeight',
'bold');
legend('u_c(Lv) - Resolución', 'u_c(Lp) - Repetibilidad', 'u_c(P) -
Especificación', ...
'Location', 'best');
grid on;
% --- Gráfica 3: Comparación Lv vs Lp ---
figure('Name', 'Comparación Lecturas', 'NumberTitle', 'off');
hold on; grid on; box on;
% Línea ideal (Lv = Lp)
plot([0, [Link]], [0, [Link]], 'k--', 'LineWidth', 1.5, ...
'DisplayName', 'Ideal (Lv = Lp)');
% Lecturas reales
plot(pasos_calibracion, Lp_media, 'ro-', 'LineWidth', 2, ...
'MarkerSize', 8, 'MarkerFaceColor', 'r', ...
'DisplayName', 'Lp (Patrón)');
xlabel('Lv - Voltmetro Bajo Calibración [V]', 'FontSize', 12);
ylabel('Lp - Patrón [V]', 'FontSize', 12);
title('Comparación: Voltmetro vs Patrón', 'FontSize', 14, 'FontWeight', 'bold');
legend('Location', 'best');
axis equal;
xlim([0, [Link]]);
ylim([0, [Link]]);
hold off;
fprintf('\n*** SCRIPT FINALIZADO EXITOSAMENTE ***\n');