Ajuste de Observaciones por Mínimos Cuadrados en MATLAB

Enviado por Chuletator online y clasificado en Matemáticas

Escrito el en español con un tamaño de 4,23 KB

Resolución de Ajuste de Observaciones mediante Mínimos Cuadrados

A continuación se presenta el script desarrollado en MATLAB para la resolución de un ejercicio de ajuste de observaciones, centrado en el cálculo de coordenadas y la determinación de elipses de error.

1. Configuración y Datos Iniciales

En esta sección se definen los puntos de control, las distancias observadas y sus respectivas precisiones (sigmas).


% RESOLUCIÓN EJERCICIO 1 - AJUSTE DE OBSERVACIONES (MÍNIMOS CUADRADOS)
clear; clc;

% 1. Datos iniciales
% Coordenadas de los puntos conocidos
P_fijos = [30, 150; 
           10, 120; 
           50, 50];

% Distancias observadas (L) y sus precisiones (sigmas)
D_obs = [125.0; 133.5; 98.6];
sigmas = [0.5; 0.2; 0.2];

% Coordenadas aproximadas del punto P
X0 = [140; 90]; 

% Matriz de pesos (P)
% Se asume varianza de referencia a priori = 1
W = diag(1 ./ (sigmas.^2));

2. Proceso Iterativo de Cálculo

Se implementa un bucle para refinar las coordenadas mediante el Jacobiano de las derivadas parciales y las ecuaciones normales.


% 2. Proceso iterativo
iteraciones = 5;
X = X0;
fprintf('--- PROCESO DE ITERACIÓN ---\n');

for i = 1:iteraciones
    % Distancias calculadas desde las coordenadas actuales a los puntos fijos
    dX = X(1) - P_fijos(:,1);
    dY = X(2) - P_fijos(:,2);
    D_cal = sqrt(dX.^2 + dY.^2);

    % Matriz de diseño A (Jacobiano de las derivadas parciales)
    A = [dX./D_cal, dY./D_cal]; 

    % Vector de términos independientes (Observado - Calculado)
    L = D_obs - D_cal;

    % Ecuaciones normales
    N = A' * W * A;
    U = A' * W * L;

    % Vector de correcciones
    delta = N \ U;

    % Actualización de las coordenadas
    X = X + delta; 

    fprintf('ITERACIÓN %d\n', i);
    fprintf('CORRECCIONES: %.2f metros (dx), %.2f metros (dy)\n', delta(1), delta(2));
    fprintf('x0 = %.4f\ny0 = %.4f\n\n', X(1), X(2));

    % Condición de parada
    if norm(delta) < 1e-5
        break;
    end
end

3. Resultados del Ajuste y Precisión

Evaluación de los residuos, la varianza a posteriori y la matriz de covarianza para determinar la precisión de las coordenadas finales.


% Vector de residuos v = A*delta - L
V = D_cal - D_obs; 
fprintf('--- RESULTADOS DEL AJUSTE ---\n');
fprintf('Residuos v:\n'); disp(V);

n = length(D_obs);
u = length(X);
gl = n - u;

% Varianza de referencia a posteriori
var_post = (V' * W * V) / gl;
fprintf('Varianza de referencia a posteriori: %.4f\n\n', var_post);

Sx = inv(N);
fprintf('Matriz Covarianza Sx:\n'); disp(Sx);

% Precisiones de las coordenadas
Sx_x = sqrt(Sx(1,1));
Sx_y = sqrt(Sx(2,2));
fprintf('PRECISIONES DE LAS COORDENADAS SX=%.2f m SY=%.2f m\n\n', Sx_x, Sx_y);

4. Cálculo de la Elipse de Error Estándar

Determinación de los semiejes y la orientación de la elipse de error a partir de los autovalores y autovectores.


% 4. Elipse de Error Estándar
fprintf('--- ELIPSES DE ERROR ---\n');

% Autovalores y autovectores de la matriz de covarianza
[eig_vec, eig_val] = eig(Sx);
eigenvalores = diag(eig_val);

% Ordenar para identificar semieje mayor (s2) y menor (s1)
[eig_val_sorted, orden] = sort(eigenvalores, 'descend');
eig_vec_sorted = eig_vec(:, orden);

s2 = sqrt(eig_val_sorted(1)); % Semieje mayor
s1 = sqrt(eig_val_sorted(2)); % Semieje menor

% Orientación de la elipse (en grados centesimales o gons)
angulo_rad = atan2(eig_vec_sorted(1,1), eig_vec_sorted(2,1));
orientacion = mod(angulo_rad * 200 / pi, 200); 

fprintf('Semiejes estándar:\n');
fprintf('s1 = %.4f\n', s1);
fprintf('s2 = %.4f\n', s2);
fprintf('orientación = %.4f\n\n', orientacion);

5. Elipse de Error para Probabilidad del 91%

Cálculo de la elipse expandida utilizando un factor de escala c basado en una probabilidad específica.


% 5. Elipse de Error asociada a probabilidad 0.91
probabilidad = 0.91;

% P = 1 - exp(-c^2 / 2) -> despejando el factor de escala 'c'
c = sqrt(-2 * log(1 - probabilidad));

p1 = c * s1;
p2 = c * s2;

fprintf('Elipse (Prob = 0.91):\n');
fprintf('c = %.4f\n', c);
fprintf('p1 = %.4f\n', p1);
fprintf('p2 = %.4f\n', p2);

Entradas relacionadas: