Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Mínimos cuadrados no lineales con y sin jacobiano

Definición de problemas y técnica de solución

Este ejemplo muestra cómo resolver un problema de mínimos cuadrados no lineales de dos maneras. Primero muestra la solución sin usar una función jacobiana. Luego muestra cómo incluir un jacobiano, y muestra la mejora de eficiencia que da el jacobiano.

El problema tiene 10 términos con 2 desconocidos: Find, un vector bidimensional, que minimizax

k=110(2+2kekx1ekx2)2,

comenzando en el punto.x0 = [0.3,0.4]

Dado que se supone que la suma de los cuadrados no se forma explícitamente en la función de usuario, la función pasada debe calcular la función de valor vectoriallsqnonlinlsqnonlin

Fk(x)=2+2kekx1ekx2,

para = 1 a 10 (es decir, debe tener 10 componentes).kF

Paso 1: escriba un archivo myfun. m que calcule los valores de la función objetiva.

function F = myfun(x) k = 1:10; F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));

Paso 2: llame a la rutina de mínimos cuadrados no lineales.

x0 = [0.3,0.4]; % Starting guess [x,resnorm,res,eflag,output1] = lsqnonlin(@myfun,x0); % Invoke optimizer

Debido a que el jacobiano no se calcula en, llama al algoritmo reflexivo de región de confianza con completa diferenciación finita.myfun.mlsqnonlin Tenga en cuenta que la opción en se establece de forma predeterminada.SpecifyObjectiveGradientOpcionesfalse

Después de 72 evaluaciones de función, este ejemplo proporciona la solución

x,resnorm
x =       0.2578   0.2578  resnorm =       124.3622

La mayoría de los sistemas informáticos pueden manejar problemas completos mucho más grandes, digamos en los cientos de ecuaciones y variables. Pero hay cierta estructura de la dispersión en el jacobiano (o hessian) que se puede aprovechar, los métodos a gran escala siempre se ejecuta más rápido si se proporciona esta información.if

Paso 3: incluir un jacobiano.

La función objetiva es lo suficientemente simple para calcular su jacobiano. Siguiendo la definición en, una función jacobiana representa la matrizJacobianos de funciones vectoriales

Jkj(x)=Fk(x)xj.

Aquí Fk(es el componente TH de la función objetiva.xk Este ejemplo tiene

Fk(x)=2+2kekx1ekx2,

así que

Jk1(x)=kekx1Jk2(x)=kekx2.

Modifique el archivo de función objetivo.

function [F,J] = myfun(x) k = 1:10; F = 2 + 2*k-exp(k*x(1))-exp(k*x(2)); if nargout > 1     J = zeros(10,2);     J(k,1) = -k.*exp(k*x(1));     J(k,2) = -k.*exp(k*x(2)); end

Configure las opciones para que el solucionador utilice el jacobiano.

opts = optimoptions(@lsqnonlin,'SpecifyObjectiveGradient',true);

Ejecute el solucionador.

x0 = [0.3 0.4]; % Starting guess [x,resnorm,res,eflag,output2] = lsqnonlin(@myfun,x0,[],[],opts);

La solución es la misma que antes.

x,resnorm
x =       0.2578   0.2578  resnorm =       124.3622

La ventaja de usar un jacobiano es que el solucionador toma menos evaluaciones de funciones, 24 en lugar de 72.

[output1.funcCount,output2.funcCount]
ans =     72    24

Temas relacionados