Cuadrados Mínimos: Ajuste de círculos
El objetivo es implementar un algoritmo que ajuste conjuntos de datos con círcunferencias. Asumimos que los datos vienen dados por \({\bf x} = (x_1,...,x_n)^t\) e \({\bf y} = (y_1,...,y_n)^t\).
Ajuste algebraico
Un círculo puede definirse implíctamente con la ecuación:
\[ \alpha (x^2 + y^2) + \beta x + \gamma y + \delta = 0. \]
Para garantizar unicidad en la escritura, asumiremos \(\alpha = 1\). Además, según veremos más adelante, resultará útil reescribir los parámetros, notando: \[ x^2+y^2 -2ax-2by -c = 0. \]
Si todos los datos cayeran sobre un círculo tendríamos que la ecuación se satisface para todo \((x_i,y_i)\). Asumiendo que esto no sucede (los datos contienen error), buscaremos valores de \(a\), \(b\) y \(c\) que minimicen: \[ \sum_i (x_i^2 + y_i^2 -2ax_i-2by_i-c)^2. \] O, equivalentemente: \[ \min_{a,b,c} \big\|2a{\bf x} + 2b{\bf y} + c - {\bf p}\big\|, \] donde \[ {\bf p} =\big(x_1^2+y_1^2, \dots,x_n^2+y_n^2\big)^t \]
Este enfoque se conoce como ajuste algebraico del círculo, dado que se propone ajustar los parámetros de la ecuación algebraica que lo define.
En primer lugar debemos poder leer los datos y graficarlos. Los datos a los que debemos calcular el ajuste se encuentran alojados en un archivo .mat que contiene 10 conjuntos de datos (“datos_1”, “datos_2”, etc..). La librearia MAT nos ayuda a leer estos archivos.
using MAT, LinearAlgebra, Plots
file = matopen("datos.mat")
datos = read(file, "datos_1")
scatter(datos[:,1],datos[:,2],label="datos",xlabel="x",ylabel="y")