Ajustar una curva mediante optimización
En este ejemplo se muestra cómo ajustar una función no lineal a los datos. Para este ejemplo, la función no lineal es la curva de decaimiento exponencial estándar
donde es la respuesta en el tiempo y y son los parámetros que se desea ajustar. Ajustar la curva significa encontrar parámetros y que minimizan la suma de los errores cuadráticos
donde los tiempos son y las respuestas son . La suma de los errores cuadráticos es la función objetivo.
Crear datos de muestra
Generalmente, tiene datos a partir de mediciones. Para este ejemplo, cree datos artificiales basados en un modelo con y , con errores seudoaleatorios distribuidos normalmente.
rng default % for reproducibility tdata = 0:0.1:10; ydata = 40*exp(-0.5*tdata) + randn(size(tdata));
Escribir una función objetivo
Escriba una función que acepte parámetros A
y lambda
, y datos tdata
e ydata
, y que devuelva la suma de los errores cuadráticos para el modelo . Ponga todas las variables que se vayan a optimizar (A
y lambda
) en una única variable vectorial (x
). Para obtener más información, consulte Minimizar funciones de varias variables.
type sseval
function sse = sseval(x,tdata,ydata) A = x(1); lambda = x(2); sse = sum((ydata - A*exp(-lambda*tdata)).^2);
Guarde esta función objetivo como un archivo denominado sseval.m
en la ruta de MATLAB®.
El solver fminsearch
se aplica a las funciones de una variable, x
. Sin embargo, la función sseval
tiene tres variables. Las variables adicionales tdata
e ydata
no son variables que se vayan a optimizar, sino datos para la optimización. Defina la función objetivo para fminsearch
como una función solo de x
:
fun = @(x)sseval(x,tdata,ydata);
Para obtener información sobre cómo incluir parámetros adicionales como tdata
e ydata
, consulte Parametrizar funciones.
Encontrar los parámetros que mejor se ajustan
Empiece por un conjunto positivo aleatorio de parámetros x0
y haga que fminsearch
encuentre los parámetros que minimizan la función objetivo.
x0 = rand(2,1); bestx = fminsearch(fun,x0)
bestx = 2×1
40.6877
0.4984
El resultado bestx
está razonablemente cerca de los parámetros que generaron los datos, A = 40
y lambda = 0.5
.
Comprobar la calidad del ajuste
Para comprobar la calidad del ajuste, represente los datos y la curva de respuesta ajustada resultante. Cree la curva de respuesta a partir de los parámetros devueltos del modelo.
A = bestx(1); lambda = bestx(2); yfit = A*exp(-lambda*tdata); plot(tdata,ydata,'*'); hold on plot(tdata,yfit,'r'); xlabel('tdata') ylabel('Response Data and Curve') title('Data and Best Fitting Exponential Curve') legend('Data','Fitted Curve') hold off
Temas relacionados
- Optimizar funciones no lineales
- Ajuste de datos no lineales (Optimization Toolbox)
- Nonlinear Regression (Statistics and Machine Learning Toolbox)