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.

lsqnonlin

Resuelva problemas de mínimos cuadrados no lineales (ajuste de datos no lineales)

Descripción

El solucionador de mínimos cuadrados no lineales

Resuelve problemas de ajuste de curva de mínimos cuadrados no lineales de la forma

minxf(x)22=minx(f1(x)2+f2(x)2+...+fn(x)2)

con los límites inferior y superior opcionales y en los componentes de.lbubx

, y pueden ser vectores o matrices; Ver.xlbubArgumentos de matriz

En lugar de calcular el valor f(x)22 (la suma de los cuadrados), requiere la función definida por el usuario para calcular la función con valoreslsqnonlinvector

f(x)=[f1(x)f2(x)fn(x)].

ejemplo

x = lsqnonlin(fun,x0) comienza en el punto y encuentra un mínimo de la suma de cuadrados de las funciones descritas en.x0fun La función debe devolver un vector (o array) de valores y no la suma de los cuadrados de los valores.fun (El algoritmo calcula implícitamente la suma de los cuadrados de los componentes de.)fun(x)

Nota

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

ejemplo

x = lsqnonlin(fun,x0,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 = lsqnonlin(fun,x0,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 = lsqnonlin(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

ejemplo

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

ejemplo

[x,resnorm,residual,exitflag,output] = lsqnonlin(___) 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)xexitflagoutput

[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(___) 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

Ajuste una curva de decaimiento exponencial simple a los datos.

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 d = linspace(0,3); y = exp(-1.3*d) + 0.05*randn(size(d));

El problema es: dados los datos (,), encuentre la tasa de desintegración exponencial que mejor se adapte a los datos.dy

Cree una función anónima que tome un valor de la tasa de desintegración exponencial

<math display="block">
<mrow>
<mi>r</mi>
</mrow>
</math>
y devuelve un vector de diferencias del modelo con esa tasa de descomposición y los datos.

fun = @(r)exp(-d*r)-y;

Encuentre el valor de la tasa de descomposición óptima. Arbitrariamente elegir una suposición inicial = 4.x0

x0 = 4; x = lsqnonlin(fun,x0)
Local minimum possible.  lsqnonlin 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.2645 

Trace los datos y la curva exponencial que mejor se ajuste.

plot(d,y,'ko',d,exp(-x*d),'b-') legend('Data','Best fit') xlabel('t') ylabel('exp(-tx)')

Encuentre el modelo que mejor se ajuste cuando algunos de los parámetros de ajuste tengan límites.

Encuentra un centrado

<math display="block">
<mrow>
<mi>b</mi>
</mrow>
</math>
y escalado
<math display="block">
<mrow>
<mi>a</mi>
</mrow>
</math>
que mejor se adapten a la función

<math display="block">
<mrow>
<mi>a</mi>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mo>-</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mo>-</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mo>-</mo>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo>-</mo>
<mi>b</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
</mrow>
</math>

a la densidad normal estándar,

<math display="block">
<mrow>
<mfrac>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<msqrt>
<mrow>
<mn>2</mn>
<mi>π</mi>
</mrow>
</msqrt>
</mrow>
</mfrac>
<mi mathvariant="normal">exp</mi>
<mrow>
<mo>(</mo>
<mo>-</mo>
<msup>
<mrow>
<mi>t</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>/</mo>
<mn>2</mn>
<mo>)</mo>
</mrow>
<mo>.</mo>
</mrow>
</math>

Cree un vector de puntos de datos y la densidad normal correspondiente en esos puntos.t

t = linspace(-4,4); y = 1/sqrt(2*pi)*exp(-t.^2/2);

Cree una función que evalúe la diferencia entre la función centrada y la escala de la normal, con el escaladoyx(1)

<math display="block">
<mrow>
<mi>a</mi>
</mrow>
</math>
y como el centradox(2)
<math display="block">
<mrow>
<mi>b</mi>
</mrow>
</math>
.

fun = @(x)x(1)*exp(-t).*exp(-exp(-(t-x(2)))) - y;

Encuentre el ajuste óptimo a partir de =, con el escaladox0[1/2,0]

<math display="block">
<mrow>
<mi>a</mi>
</mrow>
</math>
entre 1/2 y 3/2, y el centrado
<math display="block">
<mrow>
<mi>b</mi>
</mrow>
</math>
entre-1 y 3.

lb = [1/2,-1]; ub = [3/2,3]; x0 = [1/2,0]; x = lsqnonlin(fun,x0,lb,ub)
Local minimum possible.  lsqnonlin 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

    0.8231   -0.2444

Trace las dos funciones para ver la calidad del ajuste.

plot(t,y,'r-',t,fun(x)+y,'b-') xlabel('t') legend('Normal density','Fitted function')

Compare los resultados de un problema de ajuste de datos cuando utilice algoritmos diferentes.lsqnonlin

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. El modelo calcula un vector de diferencias entre los valores previstos y los valores observados.

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

Ajuste el modelo utilizando el punto de partida.x0 = [100,-1] En primer lugar, utilice el algoritmo predeterminado.'trust-region-reflective'

x0 = [100,-1]; options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective'); x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible.  lsqnonlin 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

Vea si hay alguna diferencia usando el algoritmo.'levenberg-marquardt

options.Algorithm = 'levenberg-marquardt'; x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible. lsqnonlin 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 encontraron la misma solución. Trace la solución y los datos.

plot(xdata,ydata,'ko') hold on tlist = linspace(xdata(1),xdata(end)); plot(tlist,x(1)*exp(x(2)*tlist),'b-') xlabel xdata ylabel ydata title('Exponential Fit to Data') legend('Data','Exponential Fit') hold off

Encuentra el que minimizax

k=110(2+2kekx1ekx2)2,

y encontrar el valor de la suma mínima de cuadrados.

Dado que se supone que la suma de los cuadrados se forma explícitamente en la función definida por el usuario, la función que se pasa a debe calcular la función con valores vectorialeslsqnonlinnotlsqnonlin

Fk(x)=2+2kekx1ekx2,

Para k = 1 to 10 (es decir, debe tener componentes).F10

En primer lugar, escriba un archivo para calcular el vector de componente.10F

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

Encuentre el punto de minimización y el valor mínimo, comenzando en el punto.x0 = [0.3,0.4]

x0 = [0.3,0.4]; [x,resnorm] = lsqnonlin(@myfun,x0);

Después de 24 evaluaciones de funciones, este ejemplo da la solución

x,resnorm
x =       0.2578   0.2578  resnorm =       124.3622

Examine el proceso de solución tanto como se produzca (estableciendo la opción en) y después (examinando la estructura).Display'iter'output

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. El modelo calcula un vector de diferencias entre los valores previstos y los valores observados.

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

Ajuste el modelo utilizando el punto de partida.x0 = [100,-1] Examine el proceso de solución estableciendo la opción en.Display'iter' Obtenga una estructura para obtener más información sobre el proceso de solución.output

x0 = [100,-1]; options = optimoptions('lsqnonlin','Display','iter'); [x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
                                         Norm of      First-order   Iteration  Func-count     f(x)          step          optimality      0          3          359677                      2.88e+04 Objective function returned Inf; trying a new point...      1          6          359677        11.6976       2.88e+04            2          9          321395            0.5       4.97e+04            3         12          321395              1       4.97e+04            4         15          292253           0.25       7.06e+04            5         18          292253            0.5       7.06e+04            6         21          270350          0.125       1.15e+05            7         24          270350           0.25       1.15e+05            8         27          252777         0.0625       1.63e+05            9         30          252777          0.125       1.63e+05           10         33          243877        0.03125       7.48e+04           11         36          243660         0.0625        8.7e+04           12         39          243276         0.0625          2e+04           13         42          243174         0.0625       1.14e+04           14         45          242999          0.125        5.1e+03           15         48          242661           0.25       2.04e+03           16         51          241987            0.5       1.91e+03           17         54          240643              1       1.04e+03           18         57          237971              2       3.36e+03           19         60          232686              4       6.04e+03           20         63          222354              8        1.2e+04           21         66          202592             16       2.25e+04           22         69          166443             32       4.05e+04           23         72          106320             64       6.68e+04           24         75         28704.7            128       8.31e+04           25         78         89.7947        140.674       2.22e+04           26         81         9.57381        2.02599            684           27         84         9.50489      0.0619927           2.27           28         87         9.50489    0.000462259         0.0114        Local minimum possible.  lsqnonlin stopped because the final change in the sum of squares relative to  its initial value is less than the value of the function tolerance. 

Examine la estructura de salida para obtener más información sobre el proceso de solución.

output
output = struct with fields:
    firstorderopt: 0.0114
       iterations: 28
        funcCount: 87
     cgiterations: 0
        algorithm: 'trust-region-reflective'
         stepsize: 4.6226e-04
          message: '...'

Para comparar, establezca la opción en.Algorithm'levenberg-marquardt'

options.Algorithm = 'levenberg-marquardt'; [x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
                                        First-Order                    Norm of   Iteration  Func-count    Residual       optimality      Lambda           step      0           3          359677        2.88e+04         0.01 Objective function returned Inf; trying a new point...      1          13          340761        3.91e+04       100000       0.280777      2          16          304661        5.97e+04        10000       0.373146      3          21          297292        6.55e+04        1e+06      0.0589933      4          24          288240        7.57e+04       100000      0.0645444      5          28          275407        1.01e+05        1e+06      0.0741266      6          31          249954        1.62e+05       100000       0.094571      7          36          245896        1.35e+05        1e+07      0.0133606      8          39          243846        7.26e+04        1e+06      0.0094431      9          42          243568        5.66e+04       100000      0.0082162     10          45          243424        1.61e+04        10000     0.00777935     11          48          243322         8.8e+03         1000      0.0673933     12          51          242408         5.1e+03          100       0.675209     13          54          233628        1.05e+04           10        6.59804     14          57          169089        8.51e+04            1        54.6992     15          60         30814.7        1.54e+05          0.1        196.939     16          63         147.496           8e+03         0.01        129.795     17          66         9.51503             117        0.001        9.96069     18          69         9.50489          0.0714       0.0001       0.080486     19          72         9.50489        4.86e-05        1e-05    5.07037e-05  Local minimum possible. lsqnonlin stopped because the relative size of the current step is less than the value of the step size tolerance. 

El convergió con menos iteraciones, pero casi tantas evaluaciones de funciones:'levenberg-marquardt'

output
output = struct with fields:
       iterations: 19
        funcCount: 72
         stepsize: 5.0704e-05
     cgiterations: []
    firstorderopt: 4.8597e-05
        algorithm: 'levenberg-marquardt'
          message: '...'

Argumentos de entrada

contraer todo

Función cuya suma de cuadrados está minimizada, especificada como un identificador de función o el nombre de una función. es una función que acepta una matriz y devuelve una matriz, las funciones objetivas evaluadas en.funxFx La función se puede especificar como un identificador de función para un archivo:fun

x = lsqnonlin(@myfun,x0)

donde se encuentra una función comomyfunMATLAB®

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

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

x = lsqnonlin(@(x)sin(x.*x),x0);

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

La suma de los cuadrados no debe formarse explícitamente. En su lugar, la función debe devolver un vector de valores de función. Ver.Ejemplos

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

options = optimoptions('lsqnonlin','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) F = ...          % Objective function values at x if nargout > 1   % Two output arguments    J = ...   % Jacobian of the function evaluated at x end

Si devuelve una 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

Ejemplo: @(x)cos(x).*exp(-x)

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

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

Todos los algoritmos

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

Confianza-región-algoritmo reflexivo
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('lsqnonlin','FiniteDifferenceType','central')

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

Nombre de campoEntrada

Objetivo

Función objetiva

x0

Punto inicial parax
lbVector de los límites inferiores
ubVector de los límites superiores

solver

'lsqnonlin'

Opciones

Las opciones creadas conoptimoptions

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

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).^2)

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

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.lsqnonlin

    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.lsqnonlin

  • lsqnonlin puede resolver problemas de valor complejo directamente con el algoritmo.levenberg-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.xlsqnonlinublbinf-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