Main Content

lsqcurvefit

Resolver problemas de ajuste de curvas (ajuste de datos) no lineales en el sentido de mínimos cuadrados

Descripción

Solver de mínimos cuadrados no lineales

Encuentre coeficientes x que resuelven el problema

minxF(x,xdata)ydata22=minxi(F(x,xdatai)ydatai)2,

dados los datos de entrada xdata y la salida observada ydata, donde xdata e ydata son matrices o vectores, y F (x, xdata) es una función con valores matriciales o vectoriales del mismo tamaño que ydata.

Opcionalmente, los componentes de x están sujetos a restricciones.

lbxxubAxbAeqx=beqc(x)0ceq(x)=0.

Los argumentos x, lb y ub pueden ser vectores o matrices; consulte Argumentos de matriz.

La función lsqcurvefit utiliza el mismo algoritmo que lsqnonlin. lsqcurvefit simplemente proporciona una interfaz práctica para problemas de ajuste de datos.

En lugar de calcular la suma de cuadrados, lsqcurvefit requiere que la función que define el usuario calcule la función de valor vectorial

F(x,xdata)=[F(x,xdata)(1)F(x,xdata)(2)F(x,xdata)(k)].

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata) empieza en x0 y encuentra los coeficientes x que mejor ajustan la función no lineal fun(x,xdata) a los datos ydata (en el sentido de mínimos cuadrados). ydata debe ser del mismo tamaño que el vector (o la matriz) F que devuelve fun.

Nota

Pasar parámetros adicionales explica cómo pasar parámetros adicionales a la función vectorial fun(x), si fuera necesario.

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub) define un conjunto de límites inferiores y superiores en las variables de diseño de x, de modo que la solución siempre se encuentra en el rango lb x ub. Puede fijar el componente de la solución x(i) especificando lb(i) = ub(i).

Nota

Si los límites de entrada especificados para un problema son inconsistentes, la salida x es x0 y las salidas resnorm y residual son [].

Los componentes de x0 que vulneran los límites lb ≤ x ≤ ub se restablecen al interior del cuadro definido por los límites. Los componentes que respetan los límites no se cambian.

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq) restringe la solución para satisfacer las restricciones lineales

A xb

Aeq x = beq.

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq,nonlcon) restringe la solución para satisfacer las restricciones no lineales en la función nonlcon(x). nonlcon devuelve dos salidas: c y ceq. El solver intenta satisfacer las restricciones

c ≤ 0

ceq = 0.

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) o x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq,nonlcon,options) minimiza con las opciones de optimización especificadas en options. Utilice optimoptions para configurar estas opciones. Pase matrices vacías para lb y ub y para otros argumentos de entrada si los argumentos no existen.

x = lsqcurvefit(problem) encuentra el mínimo para problem, una estructura descrita en problem.

[x,resnorm] = lsqcurvefit(___), para cualquier argumento de entrada, devuelve la norma euclídea al cuadrado del valor residual en x: sum((fun(x,xdata)-ydata).^2).

ejemplo

[x,resnorm,residual,exitflag,output] = lsqcurvefit(___), devuelve adicionalmente el valor del residual fun(x,xdata)-ydata en la solución x, un valor exitflag que describe la condición de salida y una estructura output que contiene información sobre el proceso de optimización.

[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(___) devuelve adicionalmente una estructura lambda cuyos campos contienen los multiplicadores de Lagrange en la solución x y la matriz jacobiana de fun en la solución x.

Ejemplos

contraer todo

Suponga que tiene datos de tiempo de observación xdata y datos de respuesta observada ydata, y desea encontrar parámetros x(1) y x(2) para ajustar un modelo con el formato

ydata=x(1)exp(x(2)xdata).

Introduzca los tiempos de observación y las respuestas.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

Cree un modelo de decaimiento exponencial simple.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

Ajuste el modelo utilizando el punto de inicio x0 = [100,-1].

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

  498.8309   -0.1013

Represente los datos y la curva ajustada.

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

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

Encuentre el mejor ajuste exponencial a los datos en el que los parámetros de ajuste estén restringidos.

Genere datos a partir de un modelo de decaimiento exponencial con ruido. El modelo es

y=exp(-1.3t)+ε,

con t en un rango de 0 a 3 y ruido ε distribuido normalmente con una media de 0 y una desviación estándar de 0,05.

rng default % for reproducibility
xdata = linspace(0,3);
ydata = exp(-1.3*xdata) + 0.05*randn(size(xdata));

El problema es: dados los datos (xdata, ydata), encuentre la tasa de decaimiento exponencial y=x(1)exp(x(2)xdata) que mejor se ajusta a los datos, con los parámetros acotados como sigue:

0x(1)3/4

-2x(2)-1.

lb = [0,-2];
ub = [3/4,-1];

Cree el modelo.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

Cree una conjetura inicial.

x0 = [1/2,-2];

Resuelva el problema de ajuste acotado.

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    0.7500   -1.0000

Compruebe lo bien que se ajusta la curva resultante a los datos. Dado que los límites mantienen la solución lejos de los valores reales, el ajuste es mediocre.

plot(xdata,ydata,'ko',xdata,fun(x,xdata),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

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

Cree datos artificiales para un modelo no lineal y=a+barctan(t-t0)+ct con parámetros a, b, t0 y c, para el tiempo t de 2 a 7. Añada ruido a los datos utilizando randn.

a = 2; % x(1)
b = 4; % x(2)
t0 = 5; % x(3)
c = 1/2; % x(4)
xdata = linspace(2,7);
rng default
ydata = a + b*atan(xdata - t0) + c*xdata + 1/10*randn(size(xdata));

Represente los datos.

plot(xdata,ydata,'ro')

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

Ajuste un modelo no lineal a los datos con las restricciones siguientes:

  • Todos los coeficientes deben estar entre 0 y 7.

  • x1+x2x3+x4. Puede escribir esta restricción con el formato A*x <= b empleando A = [-1 -1 1 1] y b = 0.

lb = zeros(4,1);
ub = 7*ones(4,1);
A = [-1 -1 1 1];
b = 0;

La función myfun al final de este ejemplo crea la función objetivo para este modelo.

Resuelva el problema de ajuste comenzando por el punto [1 2 3 1].

startpt = [1 2 3 1];
Aeq = [];
beq = [];
[x,res] = lsqcurvefit(@myfun,startpt,xdata,ydata,lb,ub,A,b,Aeq,beq)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×4

    2.3447    4.0972    4.9979    0.4303

res = 1.2682

La solución devuelta no está lejos del punto original [2 4 5 1/2]. Represente los datos en la curva desde el punto de solución.

plot(xdata,ydata,'ro',xdata,myfun(x,xdata),'b-')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

La solución obtenida se ajusta bastante bien a los datos. ¿La restricción está activa?

A*x(:)
ans = -1.0137

La restricción no está activa porque A*x < 0.

function F = myfun(x,xdata)
a = x(1);
b = x(2);
t0 = x(3);
c = x(4);
F = a + b*atan(xdata - t0) + c*xdata;
end

Cree datos artificiales para un modelo no lineal y=a+barctan(t-t0)+ct con parámetros a, b, t0 y c, para el tiempo t de 2 a 7. Añada ruido a los datos utilizando randn.

a = 2; % x(1)
b = 4; % x(2)
t0 = 5; % x(3)
c = 1/2; % x(4)
xdata = linspace(2,7);
rng default
ydata = a + b*atan(xdata - t0) + c*xdata + 1/10*randn(size(xdata));

Represente los datos.

plot(xdata,ydata,'ro')

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

Ajuste un modelo no lineal a los datos con las restricciones siguientes:

  • Todos los coeficientes deben estar entre 0 y 7.

  • x12+x2242

lb = zeros(4,1);
ub = 7*ones(4,1);

El problema no tiene restricciones lineales.

A = [];
b = [];
Aeq = [];
beq = [];

La función myfun al final de este ejemplo crea la función objetivo para este modelo. La función nlcon al final de este ejemplo crea la función de restricción no lineal.

Resuelva el problema de ajuste comenzando por el punto [1 2 3 1].

startpt = [1 2 3 1];
[x,res] = lsqcurvefit(@myfun,startpt,xdata,ydata,lb,ub,A,b,Aeq,beq,@nlcon)
Feasible point with lower objective function value found.


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×4

    1.3806    3.7542    5.0169    0.6337

res = 1.6018

La solución devuelta x no se encuentra en el punto original [2 4 5 1/2] debido a que la restricción no lineal se vulnera en ese punto. Represente los datos en la curva desde el punto de solución y calcule la función de restricción.

plot(xdata,ydata,'ro',xdata,myfun(x,xdata),'b-')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

[c,ceq] = nlcon(x)
c = -3.1307e-06
ceq =

     []

La restricción de desigualdad no lineal se encuentra activa en la solución porque c = 0 en la solución.

Aunque el punto de solución no se encuentra en el punto original, la curva de solución se ajusta bastante bien a los datos.

function F = myfun(x,xdata)
a = x(1);
b = x(2);
t0 = x(3);
c = x(4);
F = a + b*atan(xdata - t0) + c*xdata;
end

function [c,ceq] = nlcon(x)
ceq = [];
c = x(1)^2 + x(2)^2 - 4^2;
end

Compare los resultados de ajuste con el algoritmo 'trust-region-reflective' predeterminado y con el algoritmo 'levenberg-marquardt'.

Suponga que tiene datos de tiempo de observación xdata y datos de respuesta observada ydata, y desea encontrar parámetros x(1) y x(2) para ajustar un modelo con el formato

ydata=x(1)exp(x(2)xdata).

Introduzca los tiempos de observación y las respuestas.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

Cree un modelo de decaimiento exponencial simple.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

Ajuste el modelo utilizando el punto de inicio x0 = [100,-1].

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

  498.8309   -0.1013

Compare la solución con la de un ajuste 'levenberg-marquardt'.

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [];
ub = [];
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
Local minimum possible.
lsqcurvefit stopped because the relative size of the current step is less than
the value of the step size tolerance.
x = 1×2

  498.8309   -0.1013

Los dos algoritmos han convergido en la misma solución. Represente los datos y el modelo exponencial ajustado.

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

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

Compare los resultados de ajuste con el algoritmo 'trust-region-reflective' predeterminado y con el algoritmo 'levenberg-marquardt'. Examine el proceso de resolución para ver cuál es más eficiente en este caso.

Suponga que tiene datos de tiempo de observación xdata y datos de respuesta observada ydata, y desea encontrar parámetros x(1) y x(2) para ajustar un modelo con el formato

ydata=x(1)exp(x(2)xdata).

Introduzca los tiempos de observación y las respuestas.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

Cree un modelo de decaimiento exponencial simple.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

Ajuste el modelo utilizando el punto de inicio x0 = [100,-1].

x0 = [100,-1];
[x,resnorm,residual,exitflag,output] = lsqcurvefit(fun,x0,xdata,ydata);
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

Compare la solución con la de un ajuste 'levenberg-marquardt'.

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [];
ub = [];
[x2,resnorm2,residual2,exitflag2,output2] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options);
Local minimum possible.
lsqcurvefit stopped because the relative size of the current step is less than
the value of the step size tolerance.

¿Son las soluciones equivalentes?

norm(x-x2)
ans = 2.0626e-06

Sí, las soluciones son equivalentes.

¿Qué algoritmo necesitó menos evaluaciones de función para llegar a la solución?

fprintf(['The ''trust-region-reflective'' algorithm took %d function evaluations,\n',...
   'and the ''levenberg-marquardt'' algorithm took %d function evaluations.\n'],...
   output.funcCount,output2.funcCount)
The 'trust-region-reflective' algorithm took 87 function evaluations,
and the 'levenberg-marquardt' algorithm took 72 function evaluations.

Represente los datos y el modelo exponencial ajustado.

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

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

El ajuste tiene buen aspecto. ¿Cuán grandes son los valores residuales?

fprintf(['The ''trust-region-reflective'' algorithm has residual norm %f,\n',...
   'and the ''levenberg-marquardt'' algorithm has residual norm %f.\n'],...
   resnorm,resnorm2)
The 'trust-region-reflective' algorithm has residual norm 9.504887,
and the 'levenberg-marquardt' algorithm has residual norm 9.504887.

Argumentos de entrada

contraer todo

Función que desea ajustar, especificada como un identificador de función o el nombre de una función. Para el algoritmo 'interior-point', fun debe ser un identificador de función. fun es una función que toma dos entradas: un vector o una matriz x y un vector o una matriz xdata. fun devuelve un vector o una matriz F, la función objetivo evaluada en x y xdata.

Nota

fun debería devolver fun(x,xdata) y no la suma de cuadrados sum((fun(x,xdata)-ydata).^2). lsqcurvefit calcula implícitamente la suma de cuadrados de los componentes de fun(x,xdata)-ydata. Consulte Ejemplos.

La función fun puede especificarse como un identificador de función para un archivo de función:

x = lsqcurvefit(@myfun,x0,xdata,ydata)

donde myfun es una función de MATLAB® como

function F = myfun(x,xdata)
F = ...     % Compute function values at x, xdata

fun también puede ser un identificador de función para una función anónima.

f = @(x,xdata)x(1)*xdata.^2+x(2)*sin(xdata);
x = lsqcurvefit(f,x0,xdata,ydata);

lsqcurvefit pasa x a su función objetivo en forma de argumento x0. Por ejemplo, si x0 es un arreglo de 5 por 3, lsqcurvefit pasa x a fun como un arreglo de 5 por 3.

Si la matriz jacobiana también puede calcularse y la opción 'SpecifyObjectiveGradient' es true, configurado mediante

options = optimoptions('lsqcurvefit','SpecifyObjectiveGradient',true)

entonces la función fun debe devolver un segundo argumento de salida con el valor jacobiano J (una matriz) en x. Comprobando el valor de nargout, la función puede evitar calcular J cuando se llama a fun con solo un argumento de salida (en el caso en el que el algoritmo de optimización solo necesite el valor de F, pero no el de J).

function [F,J] = myfun(x,xdata)
F = ...          % objective function values at x
if nargout > 1   % two output arguments
   J = ...   % Jacobian of the function evaluated at x
end

Si fun devuelve un vector (matriz) de m componentes y x tiene n elementos, donde n es el número de elementos de x0, la matriz jacobiana J es una matriz de m por n donde J(i,j) es la derivada parcial de F(i) con respecto a x(j). (La matriz jacobiana J es la traspuesta del gradiente de F). Para obtener más información, consulte Escribir funciones objetivo de vector y de matriz.

Ejemplo: @(x,xdata)x(1)*exp(-x(2)*xdata)

Tipos de datos: char | function_handle | string

Punto inicial, especificado como un vector real o un arreglo real. Los solvers utilizan el número de elementos en x0 y el tamaño de x0 para determinar el número y el tamaño de las variables que fun acepta.

Ejemplo: x0 = [1,2,3,4]

Tipos de datos: double

Datos de entrada para un modelo, especificados como un vector real o un arreglo real. El modelo es

ydata = fun(x,xdata),

donde xdata e ydata son arreglos fijos, y x es el arreglo de parámetros que lsqcurvefit cambia para buscar una suma mínima de cuadrados.

Ejemplo: xdata = [1,2,3,4]

Tipos de datos: double

Datos de respuesta para un modelo, especificados como un vector real o un arreglo real. El modelo es

ydata = fun(x,xdata),

donde xdata e ydata son arreglos fijos, y x es el arreglo de parámetros que lsqcurvefit cambia para buscar una suma mínima de cuadrados.

El arreglo ydata debe ser del mismo tamaño y la misma forma que el arreglo fun(x0,xdata).

Ejemplo: ydata = [1,2,3,4]

Tipos de datos: double

Límites inferiores, especificados como un vector real o un arreglo real. Si el número de elementos en x0 es igual al número de elementos en lb, entonces lb especifica que

x(i) >= lb(i) para todo i.

Si numel(lb) < numel(x0), entonces lb especifica que

x(i) >= lb(i) para 1 <= i <= numel(lb).

Si lb tiene menos elementos que x0, los solvers emiten una advertencia.

Ejemplo: Para especificar que todos los componentes de x son positivos, utilice lb = zeros(size(x0)).

Tipos de datos: double

Límites superiores, especificados como un vector real o un arreglo real. Si el número de elementos en x0 es igual al número de elementos en ub, entonces ub especifica que

x(i) <= ub(i) para todo i.

Si numel(ub) < numel(x0), entonces ub especifica que

x(i) <= ub(i) para 1 <= i <= numel(ub).

Si ub tiene menos elementos que x0, los solvers emiten una advertencia.

Ejemplo: Para especificar que todos los componentes de x son menores que 1, utilice ub = ones(size(x0)).

Tipos de datos: double

Restricciones de desigualdad lineales, especificadas como una matriz real. A es una matriz de M por N, donde M es el número de desigualdades y N es el número de variables (número de elementos de x0). Para problemas grandes, pase A como una matriz dispersa.

A codifica las M desigualdades lineales

A*x <= b,

donde x es el vector columna de N variables x(:) y b es un vector columna con M elementos.

Por ejemplo, considere estas desigualdades:

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

Especifique las desigualdades introduciendo las siguientes restricciones.

A = [1,2;3,4;5,6];
b = [10;20;30];

Ejemplo: Para especificar que los componentes de x suman 1 o menos, utilice A = ones(1,N) y b = 1.

Tipos de datos: double

Restricciones de desigualdad lineales, especificadas como un vector real. b es un vector de M elementos relacionado con la matriz A. Si pasa b como un vector fila, los solvers convierten internamente b en el vector columna b(:). Para problemas grandes, pase b como un vector disperso.

b codifica las M desigualdades lineales

A*x <= b,

donde x es el vector columna de N variables x(:) y A es una matriz de tamaño M por N.

Por ejemplo, considere estas desigualdades:

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.

Especifique las desigualdades introduciendo las siguientes restricciones.

A = [1,2;3,4;5,6];
b = [10;20;30];

Ejemplo: Para especificar que los componentes de x suman 1 o menos, utilice A = ones(1,N) y b = 1.

Tipos de datos: double

Restricciones de igualdad lineales, especificadas como una matriz real. Aeq es una matriz de Me por N, donde Me es el número de igualdades y N es el número de variables (número de elementos de x0). Para problemas grandes, pase Aeq como una matriz dispersa.

Aeq codifica las Me igualdades lineales

Aeq*x = beq,

donde x es el vector columna de N variables x(:) y beq es un vector columna con Me elementos.

Por ejemplo, considere estas desigualdades:

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

Especifique las desigualdades introduciendo las siguientes restricciones.

Aeq = [1,2,3;2,4,1];
beq = [10;20];

Ejemplo: Para especificar que los componentes de x suman 1, utilice Aeq = ones(1,N) y beq = 1.

Tipos de datos: double

Restricciones de igualdad lineales, especificadas como un vector real. beq es un vector de Me elementos relacionado con la matriz Aeq. Si pasa beq como un vector fila, los solvers convierten internamente beq en el vector columna beq(:). Para problemas grandes, pase beq como un vector disperso.

beq codifica las Me igualdades lineales

Aeq*x = beq,

donde x es el vector columna de N variables x(:) y Aeq es una matriz de tamaño Me por N.

Por ejemplo, considere estas igualdades:

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.

Especifique las igualdades introduciendo las siguientes restricciones.

Aeq = [1,2,3;2,4,1];
beq = [10;20];

Ejemplo: Para especificar que los componentes de x suman 1, utilice Aeq = ones(1,N) y beq = 1.

Tipos de datos: double

Restricciones no lineales, especificadas como un identificador de función. nonlcon es una función que acepta un vector o arreglo x y devuelve dos arreglos, c(x) y ceq(x).

  • c(x) es el arreglo de restricciones de desigualdad no lineales de x. lsqcurvefit intenta satisfacer

    c(x) <= 0 para todas las entradas de c.(1)
  • ceq(x) es el arreglo de restricciones de igualdad no lineales de x. lsqcurvefit intenta satisfacer

    ceq(x) = 0 para todas las entradas de ceq.(2)

Por ejemplo:

x = lsqcurvefit(@myfun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq,@mycon,options)

donde mycon es una función de MATLAB como

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.
Si los gradientes de las restricciones también pueden calcularse y la opción SpecifyConstraintGradient es true, según establece
options = optimoptions('lsqcurvefit','SpecifyConstraintGradient',true)
nonlcon también debe devolver, en el tercer y el cuarto argumentos de salida, GC, el gradiente de c(x), y GCeq, el gradiente de ceq(x). GC y GCeq pueden ser dispersos o densos. Si GC o GCeq son grandes, con relativamente pocas entradas distintas de cero, ahorre tiempo de ejecución y memoria en el algoritmo 'interior-point' representándolos como matrices dispersas. Para obtener más información, consulte Restricciones no lineales.

Tipos de datos: function_handle

Opciones de optimización, especificadas como la salida de optimoptions o una estructura como la que devuelve optimset.

Algunas opciones son aplicables a todos los algoritmos y otras son relevantes para algoritmos particulares. Consulte Referencia de opciones de optimización para ver información detallada.

Algunas opciones no aparecen en la visualización optimoptions. Estas opciones se muestran en cursiva en la siguiente tabla. Para obtener más detalles, consulte Consultar las opciones de optimización.

Todos los algoritmos

Algorithm

Escoja entre 'trust-region-reflective' (opción predeterminada), 'levenberg-marquardt' y 'interior-point'.

La opción Algorithm especifica una preferencia sobre qué algoritmo utilizar. Se trata únicamente de una preferencia, ya que se deben cumplir ciertas condiciones para utilizar cada uno de los algoritmos. Para el algoritmo trust-region-reflective, el número elementos de F devuelto por fun debe ser, al menos, igual a la longitud de x.

El algoritmo 'interior-point' es el único algoritmo que puede resolver problemas con restricciones lineales o no lineales. Si incluye estas restricciones en su problema y no especifica un algoritmo, el solver cambia automáticamente al algoritmo 'interior-point'. El algoritmo 'interior-point' llama a una versión modificada del algoritmo fmincon 'interior-point'.

Para obtener más información sobre cómo elegir el algoritmo, consulte Seleccionar el algoritmo.

CheckGradients

Compare las derivadas proporcionadas por el usuario (gradientes de objetivo o de restricciones) con las derivadas de diferencias finitas. Las opciones son false (predeterminada) o true.

Para optimset, el nombre es DerivativeCheck y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

La opción CheckGradients se eliminará en una versión futura. Para comprobar las derivadas, utilice la función checkGradients.

Diagnóstico

Muestre información de diagnóstico sobre la función que se desea minimizar o resolver. Las opciones son 'off' (predeterminada) o 'on'.

DiffMaxChange

Cambio máximo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es Inf.

DiffMinChange

Cambio mínimo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es 0.

Display

Nivel de visualización (consulte Visualización iterativa):

  • 'off' o 'none' no muestran salida alguna.

  • 'iter' muestra la salida en cada iteración y emite el mensaje de salida predeterminado.

  • 'iter-detailed' muestra la salida en cada iteración y emite el mensaje de salida técnico.

  • 'final' (opción predeterminada) solo muestra la salida final y emite el mensaje de salida predeterminado.

  • 'final-detailed' solo muestra la salida final y emite el mensaje de salida técnico.

FiniteDifferenceStepSize

Factor de tamaño de paso de escalar o vector para diferencias finitas. Cuando establece FiniteDifferenceStepSize en un vector v, las diferencias finitas progresivas delta son

delta = v.*sign′(x).*max(abs(x),TypicalX);

, donde sign′(x) = sign(x) excepto sign′(0) = 1. Las diferencias finitas centrales son

delta = v.*max(abs(x),TypicalX);

Un escalar FiniteDifferenceStepSize se expande a un vector. La opción predeterminada es sqrt(eps) para diferencias finitas progresivas y eps^(1/3) para diferencias finitas centrales.

Para optimset, el nombre es FinDiffRelStep. Consulte Nombres de opciones actuales y antiguos.

FiniteDifferenceType

Las diferencias finitas, utilizadas para estimar gradientes, son o bien 'forward' (opción predeterminada), o bien 'central' (centradas). La opción 'central' requiere el doble de evaluaciones de función, pero debería ser más precisa.

El algoritmo respeta escrupulosamente los límites cuando estima ambos tipos de diferencias finitas. De este modo, por ejemplo, podrá seleccionar una diferencia regresiva en lugar de progresiva para evitar realizar la evaluación en un punto fuera de los límites.

Para optimset, el nombre es FinDiffType. Consulte Nombres de opciones actuales y antiguos.

FunctionTolerance

Tolerancia de terminación en el valor de la función, un escalar positivo. La opción predeterminada es 1e-6. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolFun. Consulte Nombres de opciones actuales y antiguos.

FunValCheck

Compruebe si los valores de la función son válidos. 'on' muestra un error cuando la función devuelve un valor complex, Inf o NaN. La opción predeterminada 'off' no muestra ningún error.

MaxFunctionEvaluations

Número máximo de evaluaciones de función permitidas, un entero positivo. El valor predeterminado es 100*numberOfVariables para el algoritmo 'trust-region-reflective', 200*numberOfVariables para el algoritmo 'levenberg-marquardt' y 3000 para el algoritmo 'interior-point'. Consulte Tolerancias y criterios de detención y Iteraciones y recuentos de la función.

Para optimset, el nombre es MaxFunEvals. Consulte Nombres de opciones actuales y antiguos.

MaxIterations

Número máximo de iteraciones permitidas, un entero positivo. El valor predeterminado es 400 para los algoritmos 'trust-region-reflective' y 'levenberg-marquardt', y 1000 para el algoritmo 'interior-point'. Consulte Tolerancias y criterios de detención y Iteraciones y recuentos de la función.

Para optimset, el nombre es MaxIter. Consulte Nombres de opciones actuales y antiguos.

OptimalityTolerance

Tolerancia de terminación en la optimalidad de primer orden (un escalar positivo). La opción predeterminada es 1e-6. Consulte Medida de optimalidad de primer orden.

Internamente, el algoritmo 'levenberg-marquardt' utiliza una tolerancia de optimalidad (criterio de detención) de 1e-4 veces la FunctionTolerance y no utiliza OptimalityTolerance.

Para optimset, el nombre es TolFun. Consulte Nombres de opciones actuales y antiguos.

OutputFcn

Especifique una o varias funciones definidas por el usuario a las que una función de optimización llame en cada iteración. Pase un identificador de función o un arreglo de celdas de identificadores de función. La opción predeterminada es ninguno ([]). Consulte Sintaxis de función de salida y función de gráfica.

PlotFcn

Representa varias medidas de progreso mientras el algoritmo se ejecuta; seleccione una de las gráficas predefinidas o escriba la suya propia. Pase un nombre, un identificador de función o un arreglo de celdas de nombres o identificadores de función. Para funciones de gráfica personalizadas, pase identificadores de función. La opción predeterminada es ninguno ([]):

  • 'optimplotx' representa el punto actual.

  • 'optimplotfunccount' representa el recuento de la función.

  • 'optimplotfval' representa el valor de la función.

  • 'optimplotresnorm' representa la norma de los valores residuales.

  • 'optimplotstepsize' representa el tamaño de paso.

  • 'optimplotfirstorderopt' representa la medida de optimalidad de primer orden.

Las funciones de gráfica personalizadas utilizan la misma sintaxis que las funciones de salida. Consulte Funciones de salida para Optimization Toolbox y Sintaxis de función de salida y función de gráfica.

Para optimset, el nombre es PlotFcns. Consulte Nombres de opciones actuales y antiguos.

SpecifyObjectiveGradient

Si false (opción predeterminada), el solver aproxima la matriz jacobiana utilizando diferencias finitas. Si true, el solver utiliza una matriz jacobiana definida por el usuario (definida en fun) o información jacobiana (cuando se utiliza JacobMult) para la función objetivo.

Para optimset, el nombre es Jacobian y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

StepTolerance

Tolerancia de terminación en x, un escalar positivo. El valor predeterminado es 1e-6 para los algoritmos 'trust-region-reflective' y 'levenberg-marquardt', y 1e-10 para el algoritmo 'interior-point'. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolX. Consulte Nombres de opciones actuales y antiguos.

TypicalX

Valores x típicos. El número de elementos en TypicalX es igual al número de elementos en x0, el punto de inicio. El valor predeterminado es ones(numberofvariables,1). El solver utiliza TypicalX para escalar diferencias finitas para la estimación de gradientes.

UseParallel

Cuando true, el solver estima gradientes en paralelo. Deshabilite la opción estableciéndola en la opción predeterminada, false. Consulte Computación paralela.

Algoritmo trust-region-reflective
JacobianMultiplyFcn

Función de multiplicación de matriz jacobiana, especificada como un identificador de función. Para problemas estructurados a gran escala, esta función calcula el producto de la matriz jacobiana J*Y, J'*Y o J'*(J*Y) sin formar J. Para lsqnonlin, la función tiene el formato

W = jmfun(Jinfo,Y,flag)

donde Jinfo contiene los datos que ayudan a calcular J*Y (o J'*Y, o J'*(J*Y)). Para lsqcurvefit, la función tiene el formato

W = jmfun(Jinfo,Y,flag,xdata)

donde xdata son los datos pasados en el argumento xdata.

Los datos Jinfo son el segundo argumento devuelto por la función objetivo fun:

[F,Jinfo] = fun(x)
% or [F,Jinfo] = fun(x,xdata)

lsqcurvefit pasa los datos Jinfo, Y, flag y, para lsqcurvefit, xdata, y la función jmfun calcula un resultado como se especifica a continuación. Y es una matriz cuyo tamaño depende del valor de flag. Deje que m especifique el número de componentes de la función objetivo fun y deje que n especifique el número de variables del problema en x. La matriz jacobiana es de tamaño m por n tal y como se describe en fun. La función jmfun devuelve uno de los siguientes resultados:

  • Si flag == 0, entonces W = J'*(J*Y) e Y tiene el tamaño n por 2.

  • Si flag > 0, entonces W = J*Y e Y tiene el tamaño n por 1.

  • Si flag < 0, entonces W = J'*Y e Y tiene el tamaño m por 1.

En cada caso, J no se forma explícitamente. El solver utiliza Jinfo para calcular las multiplicaciones. Consulte Pasar parámetros adicionales para obtener información sobre cómo proporcionar valores para cualquier parámetro adicional que jmfun necesite.

Nota

'SpecifyObjectiveGradient' debe establecerse en true para que el solver pase Jinfo de fun a jmfun.

Consulte Minimization with Dense Structured Hessian, Linear Equalities y Jacobian Multiply Function with Linear Least Squares para ver ejemplos similares.

Para optimset, el nombre es JacobMult. Consulte Nombres de opciones actuales y antiguos.

JacobPattern

Patrón de dispersión de la matriz jacobiana para diferenciación finita. Establezca JacobPattern(i,j) = 1 cuando fun(i) dependa de x(j). De lo contrario, establezca JacobPattern(i,j) = 0. En otras palabras, establezca JacobPattern(i,j) = 1 cuando puede tener ∂fun(i)/∂x(j) ≠ 0.

Utilice JacobPattern cuando no sea conveniente calcular la matriz jacobiana J en fun, aunque puede determinar (por ejemplo, inspeccionándolo) cuándo fun(i) depende de x(j). El solver puede aproximar J mediante diferencias finitas dispersas cuando proporciona JacobPattern.

Si la estructura es desconocida, no establezca JacobPattern. El comportamiento predeterminado es como si JacobPattern fuera una matriz densa de unos. Entonces, el solver calcula una aproximación completa de diferencias finitas en cada iteración. Esto puede ser costoso para problemas grandes, por lo que normalmente es mejor determinar la estructura de dispersión.

MaxPCGIter

Número máximo de iteraciones PCG (gradiente conjugado precondicionado), un escalar positivo. La opción predeterminada es max(1,numberOfVariables/2). Para obtener más información, consulte Mínimos cuadrados no lineales a gran escala.

PrecondBandWidth

Ancho de banda superior del precondicionador para PCG, un entero no negativo. La opción predeterminada de PrecondBandWidth es Inf, lo que implica que se utiliza una factorización directa (Cholesky) en lugar de los gradientes conjugados (CG). La factorización directa es más costosa computacionalmente que CG, pero produce un paso de mejor calidad hacia la solución. Establezca PrecondBandWidth en 0 para precondicionamiento diagonal (ancho de banda superior de 0). Para algunos problemas, un ancho de banda intermedio reduce el número de iteraciones PCG.

SubproblemAlgorithm

Determina cómo se calcula el paso de iteración. La opción predeterminada, 'factorization', realiza un paso más lento, pero más preciso que 'cg'. Consulte Mínimos cuadrados trust-region-reflective.

TolPCG

Tolerancia de terminación en la iteración PCG, un escalar positivo. La opción predeterminada es 0.1.

Algoritmo Levenberg-Marquardt
InitDamping

Valor inicial del parámetro de Levenberg-Marquardt, un escalar positivo. La opción predeterminada es 1e-2. Para obtener más detalles, consulte Método de Levenberg-Marquardt.

ScaleProblem

'jacobian' puede, en ocasiones, mejorar la convergencia de un problema que no esté bien escalado; la opción predeterminada es 'none'.

Algoritmo interior-point
BarrierParamUpdate

Especifica cómo fmincon actualiza el parámetro de barrera (consulte Algoritmo interior-point de fmincon). Las opciones son:

  • 'monotone' (valor predeterminado)

  • 'predictor-corrector'

Esta opción puede afectar a la velocidad y la convergencia del solver, pero su efecto no es fácil de predecir.

ConstraintTolerance

Tolerancia en la vulneración de restricciones, un escalar positivo. La opción predeterminada es 1e-6. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolCon. Consulte Nombres de opciones actuales y antiguos.

InitBarrierParam

Valor de barrera inicial, un escalar positivo. En ocasiones puede resultar útil probar un valor superior al valor predeterminado 0.1, sobre todo si las funciones objetivo o de restricción son grandes.

SpecifyConstraintGradient

Gradiente para las funciones de restricción no lineales definidas por el usuario. Si se establece en el valor predeterminado, false, lsqcurvefit estima los gradientes de las restricciones no lineales mediante diferencias finitas. Si se establece en true, lsqcurvefit prevé que la función de restricción tenga cuatro salidas, según se describe en nonlcon.

Para optimset, el nombre es GradConstr y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

SubproblemAlgorithm

Determina cómo se calcula el paso de iteración. El valor predeterminado, 'factorization', suele ser más rápido que 'cg' (gradiente conjugado), aunque 'cg' puede ser más rápido para problemas grandes con matrices hessianas densas. Consulte Algoritmo interior-point de fmincon.

Para optimset, los valores posibles son 'cg' y 'ldl-factorization'. Consulte Nombres de opciones actuales y antiguos.

Ejemplo: options = optimoptions('lsqcurvefit','FiniteDifferenceType','central')

Estructura de problema, especificada como una estructura con los siguientes campos:

Nombre de campoEntrada

objective

Función objetivo

x0

Punto inicial para x

xdata

Datos de entrada para función objetivo

ydata

Datos de salida con los que debe coincidir la función objetivo

Aineq

Matriz para restricciones de desigualdad lineales

bineq

Vector para restricciones de desigualdad lineales

Aeq

Matriz para restricciones de igualdad lineales

beq

Vector para restricciones de igualdad lineales
lbVector de límites inferiores
ubVector de límites superiores

nonlcon

Función de restricción no lineal

solver

'lsqcurvefit'

options

Opciones creadas con optimoptions

Debe proporcionar al menos los campos objective, x0, solver, xdata, ydata y options en la estructura problem.

Tipos de datos: struct

Argumentos de salida

contraer todo

Solución, devuelta como un vector real o un arreglo real. El tamaño de x es el mismo que el tamaño de x0. Habitualmente, x es una solución local al problema cuando exitflag es positivo. Para obtener información sobre la calidad de la solución, consulte Cuando el solver tiene éxito.

Norma cuadrada del valor residual, devuelta como un valor real no negativo. resnorm es la norma euclídea al cuadrado del valor residual en x: sum((fun(x,xdata)-ydata).^2).

Valor de la función objetivo en la solución, devuelto como un arreglo. En general, residual = fun(x,xdata)-ydata.

Razón por la que el solver se ha detenido, devuelta como un entero.

1

La función ha convergido a una solución x.

2

El cambio en x es menor que la tolerancia especificada o la matriz jacobiana en x no está definida.

3

El cambio en el valor residual es menor que la tolerancia especificada.

4

La magnitud relativa de la dirección de búsqueda es menor que la tolerancia de paso.

0

El número de iteraciones sobrepasa options.MaxIterations o el número de evaluaciones de función ha sobrepasado options.MaxFunctionEvaluations.

-1

Una función de gráfica o una función de salida ha detenido el solver.

-2

No se ha encontrado ningún punto factible. Los límites lb y ub son inconsistentes o el solver se ha detenido en un punto no factible.

Información sobre el proceso de optimización, devuelta como estructura con campos:

firstorderopt

Medida de optimalidad de primer orden

iterations

Número de iteraciones realizadas

funcCount

Número de evaluaciones de función

cgiterations

Número total de iteraciones PCG (solo algoritmos 'trust-region-reflective' y 'interior-point')

stepsize

Desplazamiento final en x

constrviolation

Máximo de funciones de restricción (algoritmo 'interior-point')

bestfeasible

Mejor punto factible (menor función objetivo) encontrado (algoritmo 'interior-point'). Una estructura con los siguientes campos:

  • x

  • fval

  • firstorderopt

  • constrviolation

Si no se encuentra ningún punto factible, el campo bestfeasible está vacío. Para este fin, un punto es factible cuando el máximo de las funciones de restricción no supera options.ConstraintTolerance.

El punto bestfeasible puede diferir del punto de solución devuelto x por distintos motivos. Para ver un ejemplo, consulte Obtain Best Feasible Point.

algorithm

Algoritmo de optimización utilizado

message

Mensaje de salida

Multiplicadores de Lagrange en la solución, devueltos como una estructura con campos:

lower

Límites inferiores que corresponden a lb

upper

Límites superiores que corresponden a ub

ineqlin

Desigualdades lineales que corresponden a A y b

eqlin

Igualdades lineales que corresponden a Aeq y beq

ineqnonlin

Desigualdades no lineales que corresponden a c en nonlcon

eqnonlin

Igualdades no lineales que corresponden a ceq en nonlcon

Matriz jacobiana en la solución, devuelta como una matriz real. jacobian(i,j) es la derivada parcial de fun(i) con respecto a x(j) en la solución x.

Para los problemas con restricciones activas en la solución, jacobian no es útil para estimar intervalos de confianza.

Limitaciones

  • El algoritmo trust-region-reflective no resuelve sistemas subdeterminados; requiere que el número de ecuaciones, es decir, la dimensión de fila de F, sea al menos igual que el número de variables. En el caso subdeterminado, lsqcurvefit utiliza el algoritmo Levenberg-Marquardt.

  • lsqcurvefit puede resolver problemas de valores complejos de forma directa. Tenga en cuenta que las restricciones no tienen sentido para valores complejos, ya que los números complejos no están bien ordenados; preguntar si un valor complejo es mayor o menor que otro valor complejo carece de sentido. Para un problema complejo con límites de restricción, divida las variables en partes reales e imaginarias. No utilice el algoritmo 'interior-point' para datos complejos. Consulte Ajustar un modelo a datos de valores complejos.

  • El cálculo de precondicionador utilizado en la parte del gradiente conjugado precondicionado del método trust-region-reflective forma JTJ (donde J es la matriz jacobiana) antes de calcular el precondicionador. Por lo tanto, una fila de J con muchos elementos distintos de cero, que resulta en un producto JTJ casi denso, puede traducirse en un proceso de resolución costoso para problemas grandes.

  • Si los componentes de x no tienen límites superiores (o inferiores), lsqcurvefit prefiere que los correspondientes componentes de ub (o lb) se establezcan en inf (o -inf para límites inferiores) en lugar de un número positivo arbitrario, pero muy grande (o negativo para límites inferiores).

Puede utilizar el algoritmo trust-region reflective en lsqnonlin, lsqcurvefit y fsolve con problemas a pequeña o mediana escala sin calcular la matriz jacobiana en fun o sin proporcionar el patrón de dispersión de la matriz jacobiana. (Esto también se aplica al uso de fmincon o fminunc sin calcular la matriz Hessiana o sin proporcionar el patrón de dispersión de la matriz hessiana). ¿Cómo de pequeña es la escala pequeña o mediana? No existe ninguna respuesta absoluta, ya que depende de la cantidad de memoria virtual en la configuración que haya disponible en sistema del ordenador.

Suponga que su problema tiene m ecuaciones y n incógnitas. Si el comando J = sparse(ones(m,n)) provoca un error Out of memory en su equipo, se trata claramente de un problema demasiado grande. Si no provoca un error, es posible que el problema aún sea demasiado grande. Solo puede saberlo ejecutándolo y comprobando si MATLAB se ejecuta dentro de la cantidad de memoria virtual disponible en el sistema.

Algoritmos

Los métodos Levenberg-Marquardt y trust-region-reflective se basan en los algoritmos de mínimos cuadrados no lineales que también se utilizan en fsolve.

  • Este algoritmo trust-region-reflective predeterminado es un método de región de confianza de subespacio y se basa en el método de Newton de reflejo de punto interior descrito en [1] y [2]. Cada iteración implica la solución aproximada de un sistema lineal amplio utilizando el método de gradientes conjugados precondicionados (PCG). Consulte Mínimos cuadrados trust-region-reflective.

  • El método de Levenberg-Marquardt se describe en las referencias [4], [5] y [6]. Consulte Método de Levenberg-Marquardt.

El algoritmo 'interior-point' utiliza el algoritmo 'interior-point' de fmincon con algunas modificaciones. Para obtener más detalles, consulte Algoritmo fmincon modificado para mínimos cuadrados restringidos.

Funcionalidad alternativa

App

La tarea Optimize de Live Editor proporciona una interfaz visual para lsqcurvefit.

Referencias

[1] Coleman, T.F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[2] Coleman, T.F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[3] Dennis, J. E. Jr. “Nonlinear Least-Squares.” State of the Art in Numerical Analysis, ed. D. Jacobs, Academic Press, pp. 269–312.

[4] Levenberg, K. “A Method for the Solution of Certain Problems in Least-Squares.” Quarterly Applied Mathematics 2, 1944, pp. 164–168.

[5] Marquardt, D. “An Algorithm for Least-squares Estimation of Nonlinear Parameters.” SIAM Journal Applied Mathematics, Vol. 11, 1963, pp. 431–441.

[6] Moré, J. J. “The Levenberg-Marquardt Algorithm: Implementation and Theory.” Numerical Analysis, ed. G. A. Watson, Lecture Notes in Mathematics 630, Springer Verlag, 1977, pp. 105–116.

[7] Moré, J. J., B. S. Garbow, and K. E. Hillstrom. User Guide for MINPACK 1. Argonne National Laboratory, Rept. ANL–80–74, 1980.

[8] Powell, M. J. D. “A Fortran Subroutine for Solving Systems of Nonlinear Algebraic Equations.” Numerical Methods for Nonlinear Algebraic Equations, P. Rabinowitz, ed., Ch.7, 1970.

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a

expandir todo