Simulación de Caracterización Voltamétrica para Medición de Resistencia en MATLAB

1. Configuración Inicial y Generación de Datos Sintéticos

La función de arranque establece los parámetros base del experimento simulado. Se define el barrido de tensión, los valores de resistencia preconfigurados y se inicializa la estructura de datos compartiods para la interfaz.

function inicializar_sistema(app, ~, ~, varargin)
% Definir barrido de tensión (0 a 12 V, pasos de 0.4 V)
app.barrido_V = 0:0.4:12;
% Valores de referencia para simulación
app.lista_R_ref = [82, 220, 1000, 4700];
app.R_activa = app.lista_R_ref(2); % Inicializar con 220 Ω
% Construir matriz de datos y refrescar interfaz
app = reconstruir_datos(app);
guidata(app.figure, app);
refrescar_grafica(app);
refrescar_datos_tabla(app);
end

function app = reconstruir_datos(app)
% Ley de Ohm ideal
I_ideal = app.barrido_V ./ app.R_activa;
% Inyección de ruido gaussiano (1.5% de magnitud)
nivel_perturbacion = 0.015;
perturbacion = nivel_perturbacion * I_ideal .* randn(size(I_ideal));
app.I_medido = I_ideal + perturbacion;
% Almacenar en formato [Tensión, Corriente]
app.matriz_datos = [app.barrido_V', app.I_medido'];
end

2. Lógica de Interacción y Procesamiento Numérico

Los componentes de la interfaz disparan funciones específicas que actualizan el estado interno del modelo y los controles visuales. Se ha sustituido la función polinómica por una solución matricial de mínimos cuadrados para mayor robustez y claridad algorítmica.

% --- Botón: Recalcular Parámetros ---
function cb_actualizar_parametros(app, ~)
idx_sel = app.selector_resistencia.Value;
app.R_activa = app.lista_R_ref(idx_sel);
app = reconstruir_datos(app);
guidata(app.figure, app);
refrescar_grafica(app);
refrescar_datos_tabla(app);
app.campo_resultados.String = 'Seleccione "Ajuste Lineal" para obtener R';
end

% --- Botón: Ajuste por Mínimos Cuadrados ---
function cb_ajustar_modelo(app, ~)
mat = app.matriz_datos;
V_medida = mat(:, 1);
I_medida = mat(:, 2);
% Construcción de matriz de diseño para regresión lineal (V = R*I + C)
Matriz_Diseño = [I_medida, ones(numel(I_medida), 1)];
% Solución directa por mínimos cuadrados (operador backslash)
Coeficientes = Matriz_Diseño \ V_medida;
R_calculada = Coeficientes(1);
Desviacion_Sistema = Coeficientes(2);
% Cálculo de bondad de ajuste (R-cuadrado)
V_predicha = Matriz_Diseño * Coeficientes;
Suma_Residuos = sum((V_medida - V_predicha).^2);
Suma_Total = sum((V_medida - mean(V_medida)).^2);
Indice_Bondad = 1 - (Suma_Residuos / Suma_Total);
% Actualizar interfaz
app.campo_resultados.String = sprintf('Resultados del modelo:\nR ≈ %.2f Ω\nDesv. Sist: %.4f V\nR² = %.4f', R_calculada, Desviacion_Sistema, Indice_Bondad);
% Superponer línea teórica
hold(app.eje_grafica, 'on');
x_raf = linspace(min(I_medida), max(I_medida), 50);
y_raf = polyval([R_calculada, Desviacion_Sistema], x_raf);
plot(app.eje_grafica, x_raf, y_raf, 'm-', 'LineWidth', 2.5, 'DisplayName', ['Modelo (R=', sprintf('%.0f', R_calculada), 'Ω)']);
legend(app.eje_grafica, 'Location', 'best');
hold(app.eje_grafica, 'off');
end

% --- Botón: Inyectar Ruido Adicional ---
function cb_inyectar_perturbacion(app, ~)
ruido_extra = 0.008 * app.I_medido .* randn(size(app.I_medido));
app.I_medido = app.I_medido + ruido_extra;
app.matriz_datos = [app.barrido_V', app.I_medido'];
guidata(app.figure, app);
refrescar_grafica(app);
refrescar_datos_tabla(app);
app.campo_resultados.String = 'Nivel de perturbación incrementado. Vuelva a ajustar.';
end

3. Funciones Auxiliares de Visualización

function refrescar_grafica(app)
cla(app.eje_grafica, 'reset');
plot(app.eje_grafica, app.matriz_datos(:,2), app.matriz_datos(:,1), 'ks', 'MarkerFaceColor', 'c', 'MarkerSize', 7, 'DisplayName', 'Muestras');
xlabel(app.eje_grafica, 'Corriente (A)');
ylabel(app.eje_grafica, 'Tensión (V)');
title(app.eje_grafica, 'Curva de Caracterización Eléctrica');
grid(app.eje_grafica, 'on');
legend(app.eje_grafica, 'Location', 'northwest');
end

function refrescar_datos_tabla(app)
app.tabla_medidas.Data = app.matriz_datos;
app.tabla_medidas.ColumnName = {'Eje X [A]', 'Eje Y [V]'};
end

Consideraciones de Implementación y Expansión

  • Integración en Entorno de Desarrollo: Verifique que los identificadores de componentes (app.eje\_grafica, app.selector\_resistencia, etc.) coincidan exactamente con los definidos en el archivo de diseño. La estructura de datos debe propagarse correctamente entre funciones mediante guidata o el objeto app.
  • Importación de Datos Reales: Implemente un selector de archivos utilizando uigetfile para cargar vectores de tensión y corriente desde archivos CSV o Excel, reemplazando la función de generación sintética por una lectura directa de disco.
  • Ampliación a Elementos No Lineales: Modifique la lógica de simulación en reconstruir\_datos para incluir modelos exponenciales (como diodos) o cuadráticos (fotodetectores), alterando la relación matemática base.
  • Corrección Sistemática: Agregue campos de entrada para compensar la resistencia interna de los instrumentos de medida, aplicando fórmulas de corrección antes del proceso de regresión.
  • Exoprtación de Resultados: Vincule un botón a exportgraphics(app.eje\_grafica, 'resultados.svg') o writetable para generar reportes automatizados en formatos de publicación.

Nota Técnica: En versiones recientes de MATLAB, se recomienda migrar la arquitectura hacia App Designer, aprovechando la programación orientada a objetos y la mayor flexibilidad en la disposición de componentes. El enfoque de ajuste donde la corriente actúa como vairable independiente y la tensión como dependiente (V = f(I)) minimiza errores de propagación y se alinea directamente con la definición física de resistencia ($R = \Delta V / \Delta I$).

Etiquetas: matlab app_designer ajuste_lineal ley_de_ohm voltammetria

Publicado el 9-15 10:41