Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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

y(t)=Aexp(-λt),

donde y(t) es la respuesta en el tiempo t y A y λ son los parámetros que se desea ajustar. Ajustar la curva significa encontrar parámetros A y λ que minimizan la suma de los errores cuadráticos

i=1n(yi-Aexp(-λti))2,

donde los tiempos son ti y las respuestas son yi,i=1,,n. 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 A=40 y λ=0.5, 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 y(t). 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

Figure contains an axes object. The axes object with title Data and Best Fitting Exponential Curve, xlabel tdata, ylabel Response Data and Curve contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Fitted Curve.

Temas relacionados