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.

lsqcurvefit

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

Descripción

El solucionador de mínimos cuadrados no lineales

Encuentre los coeficientes que resuelven el problemax

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

datos de entrada dados, y la salida observada, donde y son matrices o vectores, y (,) es una función con valores de matriz o con valores vectoriales del mismo tamaño que.xdataydataxdataydataF xxdataydata

Opcionalmente, los componentes de pueden tener límites inferiores y superiores, y.xlbub Los argumentos, y pueden ser vectores o matrices; Ver.xlbubArgumentos de matriz

La función utiliza el mismo algoritmo que. simplemente proporciona una interfaz conveniente para los problemas de ajuste de datos.lsqcurvefitlsqnonlinlsqcurvefit

En lugar de calcular la suma de los cuadrados, requiere que la función definida por el usuario calcule la función con valoreslsqcurvefitvector

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

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata) comienza y encuentra los coeficientes que mejor se ajustan a la función no lineal a los datos (en el sentido de mínimos cuadrados). debe tener el mismo tamaño que el vector (o matriz) devuelto por.x0xfun(x,xdata)ydataydataFfun

Nota

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

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub) define un conjunto de límites inferior y superior en las variables de diseño, de modo que la solución esté siempre en el rango ≤ ≤.xlb  x  ub Puede corregir el componente de la solución especificando.x(i)lb(i) = ub(i)

Nota

Si los límites de entrada especificados para un problema son incoherentes, la salida es y las salidas y son.xx0resnormresidual[]

Los componentes que infringen los límites se restablecen al interior del cuadro definido por los límites.x0lb ≤ x ≤ ub Los componentes que respetan los límites no se modifican.

ejemplo

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) minimiza con las opciones de optimización especificadas en.Opciones Se usa para establecer estas opciones.optimoptions Pase matrices vacías para y si no existen límites.lbub

x = lsqcurvefit(problem) encuentra el mínimo para, donde se describe una estructura.problemproblemArgumentos de entrada Cree la estructura exportando un problema desde la aplicación de optimización, como se describe en.problemExportar su trabajo

[x,resnorm] = lsqcurvefit(___), para cualquier argumento de entrada, devuelve el valor de la 2-norma cuadrada del residuo en:.xsum((fun(x,xdata)-ydata).^2)

ejemplo

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

[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(___) Además, devuelve una estructura cuyos campos contienen los multiplicadores de Lagrange en la solución, y el jacobiano de la solución.lambdaxfunx

Ejemplos

contraer todo

Supongamos que tiene datos de tiempo de observación y datos de respuesta observados, y desea buscar parámetrosxdataydata

<math display="block">
<mrow>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
Y
<math display="block">
<mrow>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
para ajustarse a un modelo de la forma

<math display="block">
<mrow>
<mrow>
<mtext>ydata</mtext>
</mrow>
<mo>=</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mi mathvariant="normal">exp</mi>
<mrow>
<mo>(</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
<mrow>
<mtext>xdata</mtext>
</mrow>
<mo>)</mo>
</mrow>
<mo>.</mo>
</mrow>
</math>

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 decadencia exponencial simple.

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

Ajuste el modelo utilizando el punto de partida.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

Graficar 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')

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

Genere datos a partir de un modelo de decaimiento exponencial más ruido. El modelo es

<math display="block">
<mrow>
<mi>y</mi>
<mo>=</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mo>-</mo>
<mn>1</mn>
<mo>.</mo>
<mn>3</mn>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mi>ε</mi>
<mo>,</mo>
</mrow>
</math>

Con

<math display="block">
<mrow>
<mi>t</mi>
</mrow>
</math>
que van de 0 a 3, y
<math display="block">
<mrow>
<mi>ε</mi>
</mrow>
</math>
ruido normalmente distribuido con la media 0 y la desviación estándar 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 (,), encontrar el modelo de decadencia exponencialxdataydata

<math display="block">
<mrow>
<mi>y</mi>
<mo>=</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
<mrow>
<mtext>xdata</mtext>
</mrow>
<mo stretchy="false">)</mo>
</mrow>
</math>
que mejor se adapte a los datos, con los parámetros delimitados de la siguiente manera:

<math display="block">
<mrow>
<mn>0</mn>
<mo></mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo></mo>
<mn>3</mn>
<mo>/</mo>
<mn>4</mn>
</mrow>
</math>

<math display="block">
<mrow>
<mo>-</mo>
<mn>2</mn>
<mo></mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
<mo></mo>
<mo>-</mo>
<mn>1</mn>
<mo>.</mo>
</mrow>
</math>

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

Cree el modelo.

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

Cree una suposición inicial.

x0 = [1/2,-2];

Resuelva el problema de ajuste enlazado.

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

Examine qué tan bien se ajusta la curva resultante a los datos. Dado que los límites mantienen la solución alejada de los valores verdaderos, el ajuste es mediocre.

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

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

Supongamos que tiene datos de tiempo de observación y datos de respuesta observados, y desea buscar parámetrosxdataydata

<math display="block">
<mrow>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
Y
<math display="block">
<mrow>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
para ajustarse a un modelo de la forma

<math display="block">
<mrow>
<mrow>
<mtext>ydata</mtext>
</mrow>
<mo>=</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mi mathvariant="normal">exp</mi>
<mrow>
<mo>(</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
<mrow>
<mtext>xdata</mtext>
</mrow>
<mo>)</mo>
</mrow>
<mo>.</mo>
</mrow>
</math>

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 decadencia exponencial simple.

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

Ajuste el modelo utilizando el punto de partida.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 convergieron en la misma solución. Graficar 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')

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

Supongamos que tiene datos de tiempo de observación y datos de respuesta observados, y desea buscar parámetrosxdataydata

<math display="block">
<mrow>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
Y
<math display="block">
<mrow>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
para ajustarse a un modelo de la forma

<math display="block">
<mrow>
<mrow>
<mtext>ydata</mtext>
</mrow>
<mo>=</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mi mathvariant="normal">exp</mi>
<mrow>
<mo>(</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
<mrow>
<mtext>xdata</mtext>
</mrow>
<mo>)</mo>
</mrow>
<mo>.</mo>
</mrow>
</math>

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 decadencia exponencial simple.

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

Ajuste el modelo utilizando el punto de partida.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. 

¿Las soluciones son equivalentes?

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

Sí, las soluciones son equivalentes.

¿Qué algoritmo tomó menos evaluaciones de funciones 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. 

Graficar 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')

El ajuste se ve bien. ¿Qué tan grandes son los residuos?

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. es una función que toma dos entradas: un vector o una matriz, y un vector o una matriz. Devuelve un vector o una matriz, la función objetiva evaluada en y.funxxdatafunFxxdata La función Fun se puede especificar como un identificador de función para un archivo de función:

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

donde se encuentra una función comomyfunMATLAB®

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

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

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

Si los valores definidos por el usuario para y son matrices, se convierten en vectores mediante la indexación lineal (consulte).xFIndexación de matrices (MATLAB)

Nota

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

Si el jacobiano también se puede calcular la opción jacobiana es, fijado porand'on'

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

a continuación, la función debe devolver un segundo argumento de salida con el valor jacobiano (una matriz) en.funJx Al comprobar el valor de, la función puede evitar la computación cuando se llama con sólo un argumento de salida (en el caso de que el algoritmo de optimización sólo necesita el valor de, pero no).nargoutJfunFJ

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 devuelve un vector (matriz) de componentes y tiene elementos, donde es el número de elementos de, el jacobiano es un-por-matriz donde es la derivada parcial de con respecto a.funmxnnx0JmnJ(i,j)F(i)x(j) (El jacobiano es la transposición del gradiente de.)JF Para obtener más información, consulte.Escritura de funciones de objetivo vectorial y 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 una matriz real. Solvers utilizan el número de elementos en y el tamaño de para determinar el número y el tamaño de las variables que acepta.x0x0fun

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

Tipos de datos: double

Datos de entrada para el modelo, especificados como un vector real o una matriz real. El modelo es

,ydata = fun(x,xdata)

Dónde y son matrices fijas, y es la matriz de parámetros que cambia para buscar una suma mínima de cuadrados.xdataydataxlsqcurvefit

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

Tipos de datos: double

Datos de respuesta para el modelo, especificados como un vector real o una matriz real. El modelo es

,ydata = fun(x,xdata)

Dónde y son matrices fijas, y es la matriz de parámetros que cambia para buscar una suma mínima de cuadrados.xdataydataxlsqcurvefit

La matriz debe tener el mismo tamaño y forma que la matriz.ydatafun(x0,xdata)

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

Tipos de datos: double

Límites inferiores, especificados como un vector real o una matriz real. Si el número de elementos en es igual al número de elementos en, a continuación, especifica quex0lblb

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

Si, a continuación, especifica quenumel(lb) < numel(x0)lb

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

Si hay menos elementos en que in, los solucionadores emiten una advertencia.lbx0

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

Tipos de datos: double

Límites superiores, especificados como un vector real o una matriz real. Si el número de elementos en es igual al número de elementos en, a continuación, especifica quex0ubub

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

Si, a continuación, especifica quenumel(ub) < numel(x0)ub

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

Si hay menos elementos en que in, los solucionadores emiten una advertencia.ubx0

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

Tipos de datos: double

Opciones de optimización, especificadas como la salida de o una estructura como devoluciones.optimoptionsoptimset

Algunas opciones se aplican a todos los algoritmos, y otras son relevantes para determinados algoritmos. Consulte para obtener información detallada.Opciones de optimización referencia

Algunas opciones están ausentes en la pantalla.optimoptions Estas opciones aparecen en cursiva en la tabla siguiente. Para obtener más información, consulte.Ver opciones

All Algorithms

Algorithm

Elija entre (predeterminado) y.'trust-region-reflective''levenberg-marquardt'

La opción especifica una preferencia para el algoritmo que se utilizará.Algorithm Es sólo una preferencia, porque se deben cumplir ciertas condiciones para usar cada algoritmo. Para el algoritmo de confianza-región-reflexivo, el sistema no lineal de ecuaciones no puede ser subdeterminado; es decir, el número de ecuaciones (el número de elementos devueltos por) debe ser al menos tantos como la longitud de.Ffunx El algoritmo Levenberg-Marquardt no controla las restricciones enlazadas. Para obtener más información sobre cómo elegir el algoritmo, consulte.Elegir el algoritmo

CheckGradients

Compare los derivados suministrados por el usuario (degradados de objetivos o restricciones) con los derivados de diferenciación finita. Las opciones son (predeterminado) o.falsetrue

Para, el nombre es y los valores son o.optimsetDerivativeCheck'on''off' Ver.Las tablas de nombres de opciones actuales y heredadas

Diagnostics

Mostrar información de diagnóstico sobre la función que se debe minimizar o resolver. Las opciones son (predeterminado) o.'off''on'

DiffMaxChange

Cambio máximo en las variables para los degradados de diferencias finitas (un escalar positivo). El valor predeterminado es.Inf

DiffMinChange

Cambio mínimo en las variables para los degradados de diferencias finitas (un escalar positivo). El valor predeterminado es.0

Display

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

  • o no muestra ninguna salida.'off''none'

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

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

  • (valor predeterminado) muestra solo la salida final y proporciona el mensaje de salida predeterminado.'final'

  • muestra sólo la salida final y da el mensaje técnico de salida.'final-detailed'

FiniteDifferenceStepSize

Factor de tamaño de paso escalar o vectorial para diferencias finitas. Cuando se establece en un vector, las diferencias finitas de avance sonFiniteDifferenceStepSizevdelta

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

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

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

Escalar se expande a un vector.FiniteDifferenceStepSize El valor predeterminado es para las diferencias finitas de avance y para las diferencias finitas centrales.sqrt(eps)eps^(1/3)

El nombre es.optimsetFinDiffRelStep Ver.Las tablas de nombres de opciones actuales y heredadas

FiniteDifferenceType

Las diferencias finitas, que se utilizan para estimar degradados, son (predeterminadas) o (centradas). toma el doble de evaluaciones de funciones, pero debe ser más precisa.'forward''central''central'

El algoritmo tiene cuidado de obedecer los límites al estimar ambos tipos de diferencias finitas. Así, por ejemplo, podría tomar una diferencia hacia atrás, en lugar de una hacia adelante, para evitar la evaluación en un punto fuera de los límites.

El nombre es.optimsetFinDiffType Ver.Las tablas de nombres de opciones actuales y heredadas

FunctionTolerance

Tolerancia de terminación en el valor de la función, un escalar positivo. El valor predeterminado es.1e-6 Ver.Tolerancias y criterios de detención

El nombre es.optimsetTolFun Ver.Las tablas de nombres de opciones actuales y heredadas

FunValCheck

Compruebe si los valores de función son válidos. muestra un error cuando la función devuelve un valor que es, o.'on'complexInfNaN El valor predeterminado no muestra ningún error.'off'

MaxFunctionEvaluations

Número máximo de evaluaciones de funciones permitidas, un entero positivo. El valor predeterminado es.100*numberOfVariables Mira y.Tolerancias y criterios de detenciónIteraciones y recuentos de funciones

El nombre es.optimsetMaxFunEvals Ver.Las tablas de nombres de opciones actuales y heredadas

MaxIterations

Número máximo de iteraciones permitidas, un entero positivo. El valor predeterminado es.400 Mira y.Tolerancias y criterios de detenciónIteraciones y recuentos de funciones

El nombre es.optimsetMaxIter Ver.Las tablas de nombres de opciones actuales y heredadas

OptimalityTolerance

Tolerancia de terminación en la optimalidad de primer orden (un escalar positivo). El valor predeterminado es.1e-6 Ver.Medida de optimalidad de primer orden

Internamente, el algoritmo utiliza una tolerancia de optimalidad (criterio de parada) de veces y no utiliza.'levenberg-marquardt'1e-4FunctionToleranceOptimalityTolerance

El nombre es.optimsetTolFun Ver.Las tablas de nombres de opciones actuales y heredadas

OutputFcn

Especifique una o varias funciones definidas por el usuario a las que llama una función de optimización en cada iteración. Pasar un identificador de función o una matriz de celdas de identificadores de función. El valor predeterminado es None ().[] Ver.Sintaxis de función de salida

PlotFcn

Traza varias medidas de progreso mientras se ejecuta el algoritmo; seleccionar de parcelas predefinidas o escribir las suyas propias. Pase un nombre, un identificador de función o una matriz de celdas de nombres o identificadores de función. Para las funciones de trazado personalizadas, pase los identificadores de función. El valor predeterminado es None ():[]

  • traza el punto actual.'optimplotx'

  • traza el recuento de funciones.'optimplotfunccount'

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

  • grafica la norma de los residuos.'optimplotresnorm'

  • traza el tamaño del paso.'optimplotstepsize'

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

Para obtener información sobre cómo escribir una función de trazado personalizada, consulte.Sintaxis de función de trazado

El nombre es.optimsetPlotFcns Ver.Las tablas de nombres de opciones actuales y heredadas

SpecifyObjectiveGradient

Si (valor predeterminado), el solucionador se aproxima al jacobiano utilizando diferencias finitas.false Si el solucionador utiliza una información jacobiana definida por el usuario (definida en) o jacobiana (cuando se utiliza), para la función objetiva.truefunJacobMult

Para, el nombre es, y los valores son o.optimsetJacobian'on''off' Ver.Las tablas de nombres de opciones actuales y heredadas

StepTolerance

Tolerancia de terminación activada, un escalar positivo.x El valor predeterminado es.1e-6 Ver.Tolerancias y criterios de detención

El nombre es.optimsetTolX Ver.Las tablas de nombres de opciones actuales y heredadas

TypicalX

Valores típicos.x El número de elementos en es igual al número de elementos en, el punto de partida.TypicalXx0 El valor predeterminado es.ones(numberofvariables,1) El solucionador utiliza para escalar las diferencias finitas para la estimación de degradado.TypicalX

UseParallel

Cuando el solucionador estima los degradados en paralelo.true Deshabilite estableciendo el valor predeterminado,.false Ver.Computación paralela

Trust-Region-Reflective Algorithm
JacobianMultiplyFcn

Función de multiplicación jacobiana, especificada como un manejador de funciones. Para problemas estructurados a gran escala, esta función calcula el producto de matriz jacobiana, o sin formar realmente.J*YJ'*YJ'*(J*Y)J La función es de la forma

W = jmfun(Jinfo,Y,flag) 

donde contiene la matriz utilizada para computar (o, o).JinfoJ*Y J'*YJ'*(J*Y) El primer argumento debe ser el mismo que el segundo argumento devuelto por la función objetiva, por ejemplo, porJinfofun

[F,Jinfo] = fun(x)

es una matriz que tiene el mismo número de filas que hay dimensiones en el problema. determina qué producto calcular:Yflag

  • Si entonces.flag == 0W = J'*(J*Y)

  • Si entonces.flag > 0W = J*Y

  • Si entonces.flag < 0W = J'*Y

En cada caso, no se forma explícitamente.J El solucionador utiliza para calcular el preacondicionador.Jinfo Consulte para obtener información sobre cómo suministrar valores para cualquier necesidad de parámetros adicionales.Pasar parámetros adicionalesjmfun

Nota

debe establecerse para que el solucionador pase de.'SpecifyObjectiveGradient'trueJinfofunjmfun

Ver y para ejemplos similares.Minimización con hessian estructurado denso, Equalidades linealesFunción de multiplicación jacobiana con mínimos cuadrados lineales

El nombre es.optimsetJacobMult Ver.Las tablas de nombres de opciones actuales y heredadas

JacobPattern

Patrón de la Sparsity del jacobiano para la diferenciación finita. Ajuste cuando dependa de.JacobPattern(i,j) = 1fun(i)x(j) De lo contrario, establecer.JacobPattern(i,j) = 0 En otras palabras, cuando puede tener ∂/∂ ≠ 0.JacobPattern(i,j) = 1fun(i)x(j)

Se utiliza cuando es incómodo calcular la matriz jacobiana, aunque se puede determinar (digamos, por inspección) cuando depende.JacobPatternJfunfun(i)x(j) El solucionador puede aproximarse a través de diferencias finitas dispersas cuando se da.JJacobPattern

Si la estructura es desconocida, no la establezca.JacobPattern El comportamiento predeterminado es como si se tratara de una matriz densa de unos.JacobPattern A continuación, el solucionador calcula una aproximación de diferencia finita completa en cada iteración. Esto puede ser costoso para problemas grandes, por lo que generalmente es mejor determinar la estructura de la dispersión.

MaxPCGIter

Número máximo de iteraciones PCG (degradado conjugada precondicionada), un escalar positivo. El valor predeterminado es.max(1,numberOfVariables/2) Para obtener más información, consulte.Los mínimos cuadrados no lineales de gran escala

PrecondBandWidth

Ancho de banda superior del preacondicionador para PCG, un entero no negativo. El valor predeterminado es, lo que significa que se utiliza una factorización directa (Cholesky) en lugar de los degradados conjugados (CG).PrecondBandWidthInf La factorización directa es computacionalmente más costosa que CG, pero produce un mejor paso de calidad hacia la solución. Se establece en para el preacondicionamiento diagonal (ancho de banda superior de 0).PrecondBandWidth0 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. El valor predeterminado,, toma un paso más lento pero más preciso que.'factorization''cg' Ver.Trust-region-reflectivos mínimos cuadrados

TolPCG

Tolerancia de terminación en la iteración PCG, un escalar positivo. El valor predeterminado es.0.1

Levenberg-Marquardt Algorithm
InitDamping

Valor inicial del parámetro Levenberg-Marquardt, un escalar positivo. El valor predeterminado es.1e-2 Para obtener más información, consulte.El método Levenberg-Marquardt

ScaleProblem

a veces puede mejorar la convergencia de un problema mal escalado; el valor predeterminado es.'jacobian''none'

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

Estructura problemática, especificada como estructura con los siguientes campos:

Nombre de campoEntrada

Objetivo

Función objetiva de yxxdata

x0

Punto inicial para el algoritmo de conjunto activo sólox

xdata

Datos de entrada para la función objetiva

ydata

Los datos de salida que deben coincidir con la función objetiva
lbVector de los límites inferiores
ubVector de los límites superiores

solver

'lsqcurvefit'

Opciones

Las opciones creadas conoptimoptions

Debe suministrar al menos los campos,,,, y en la estructura.Objetivox0solverxdataydataOpcionesproblem

La forma más sencilla de obtener una estructura es exportar el problema desde la aplicación de optimización.problem

Tipos de datos: struct

Argumentos de salida

contraer todo

Solución, devuelta como un vector real o una matriz real. El tamaño de es el mismo que el tamaño de.xx0 Normalmente, es una solución local para el problema cuando es positivo.xexitflag Para obtener información sobre la calidad de la solución, consulte.Cuando el Solver se ejecuta correctamente

La norma cuadrada del residuo, devuelta como un real no negativo. es la 2-norma cuadrada del residuo en:.resnormxsum((fun(x,xdata)-ydata).^2)

Valor de la función objetiva en la solución, devuelta como una matriz. En general,.residual = fun(x,xdata)-ydata

Motivo por el que el solucionador se detuvo, devuelto como un entero.

1

Función convergida a una solución.x

2

El cambio en era menor que la tolerancia especificada.x

3

El cambio en el residuo fue menor que la tolerancia especificada.

4

La magnitud de la dirección de búsqueda era menor que la tolerancia especificada.

0

Número de iteraciones superada o número de evaluaciones de función superada.options.MaxIterationsoptions.MaxFunctionEvaluations

-1

La función de salida finalizó el algoritmo.

-2

El problema es inviable: los límites y son inconsistentes.lbub

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

firstorderopt

Medida de la optimalidad de primer orden

iterations

Número de iteraciones tomadas

funcCount

El número de evaluaciones de funciones

cgiterations

Número total de iteraciones PCG (solo algoritmo de reflexión de región de confianza)

stepsize

El desplazamiento final enx

algorithm

Algoritmo de optimización utilizado

message

Mensaje de salida

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

lower

Los límites inferioreslb

upper

Los límites superioresub

Jacobiano en la solución, regresó como una verdadera matriz. es la derivada parcial de con respecto a la solución.jacobian(i,j)fun(i)x(j)x

Limitaciones

  • El algoritmo Levenberg-Marquardt no controla las restricciones enlazadas.

  • El algoritmo de confianza-región-reflexivo no resuelve los sistemas subdeterminados; requiere que el número de ecuaciones, es decir, la dimensión de fila de, sea al menos tan grande como el número de variables.F En el caso subdeterminado, utiliza el algoritmo Levenberg-Marquardt.lsqcurvefit

    Dado que el algoritmo de confianza-región-reflexivo no maneja los sistemas subdeterminados y el Levenberg-Marquardt no maneja las restricciones enlazadas, los problemas que tienen ambas características no pueden ser resueltos por.lsqcurvefit

  • puede resolver problemas de valor complejo directamente con el algoritmo.lsqcurvefitlevenberg-marquardt Sin embargo, este algoritmo no acepta restricciones enlazadas. Para un problema complejo con restricciones enlazadas, divida las variables en partes reales e imaginarias y utilice el algoritmo.trust-region-reflective Ver.Ajuste un modelo a datos de valor complejo

  • El cálculo del preacondicionador utilizado en la parte de gradiente conjugada precondicionada del método de confianza-región-reflexión forma JTJ (donde está la matriz jacobiana) antes de computar el preacondicionador.J Por lo tanto, una fila de con muchos nonceros, lo que resulta en un producto casi densoJ JTJ, puede conducir a un proceso de solución costoso para problemas grandes.

  • Si los componentes de no tienen límites superiores (o inferiores), prefiere que los componentes correspondientes de (o) se establecen en (o para los límites inferiores) en contraposición a un arbitrario pero muy grande positivo (o negativo para los límites inferiores) número.xlsqcurvefitublbinf-inf

Puede utilizar el algoritmo reflexivo de región de confianza en, y con problemas de pequeña a mediana escala sin calcular el jacobiano o proporcionar el patrón de dispersión jacobiana.lsqnonlinlsqcurvefitfsolvefun (Esto también se aplica al uso o sin la computación del hessian o el suministro del patrón de la dispersión de hessian.)fminconfminunc ¿Cuán pequeña es pequeña-a mediana escala? No hay respuesta absoluta está disponible, ya que depende de la cantidad de memoria virtual en la configuración del sistema informático.

Supongamos que su problema tiene ecuaciones y desconocidos.mn Si el comando provoca unJ = sparse(ones(m,n)) error en su máquina, entonces esto es ciertamente un problema demasiado grande.Out of memory Si no se produce un error, el problema podría seguir siendo demasiado grande. Puede averiguarlo solo ejecutando y viendo si se ejecuta dentro de la cantidad de memoria virtual disponible en su sistema.MATLAB

Algoritmos

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

  • El algoritmo de confianza-región-reflexión predeterminado es un método de región de confianza subespacial y se basa en el método de Newton interior-reflectante descrito en y.[1][2] Cada iteración implica la solución aproximada de un gran sistema lineal utilizando el método de gradientes conjugados preacondicionados (PCG). Ver.Trust-region-reflectivos mínimos cuadrados

  • El método Levenberg-Marquardt se describe en referencias y.[4][5][6] Ver.El método Levenberg-Marquardt

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

Introducido antes de R2006a