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.

lsqnonneg

Resuelve el problema lineal de mínimos cuadrados no negativos

Descripción

Resuelva los problemas de ajuste de curva de mínimos cuadrados no negativos de la forma

minxCxd22, where x0.

Nota

lsqnonneg solo se aplica al enfoque basado en el solucionador. Para ver una explicación de los dos enfoques de optimización, consulte.Elija primero el enfoque basado en problemas o basado en Solver

ejemplo

x = lsqnonneg(C,d) Devuelve el vector que minimiza el sujeto.xnorm(C*x-d)x ≥ 0 Argumentos y deben ser reales.Cd

ejemplo

x = lsqnonneg(C,d,options) minimiza con las opciones de optimización especificadas en la estructura.Opciones Se usa para establecer estas opciones.optimset

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

ejemplo

[x,resnorm,residual] = lsqnonneg(___), para cualquier sintaxis anterior, además devuelve el valor de la 2-norma cuadrada del residuo, y devuelve el residuo.norm(C*x-d)^2d-C*x

[x,resnorm,residual,exitflag,output] = lsqnonneg(___) Además devuelve un valor que describe la condición de salida de, y una estructura con información sobre el proceso de optimización.exitflaglsqnonnegoutput

ejemplo

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___) Además devuelve el vector multiplicador de Lagrange.lambda

Ejemplos

contraer todo

Calcule una solución no negativa a un problema de mínimos cuadrados lineales y compare el resultado con la solución de un problema sin restricciones.

Prepare una matriz y un vector para el problemaCd

<math display="block">
<mrow>
<mrow>
<mi mathvariant="normal">min</mi>
</mrow>
<mo>|</mo>
<mo>|</mo>
<mi>C</mi>
<mi>x</mi>
<mo>-</mo>
<mi>d</mi>
<mo>|</mo>
<mo>|</mo>
</mrow>
</math>
.

C = [0.0372    0.2869      0.6861    0.7071      0.6233    0.6245      0.6344    0.6170];   d = [0.8587      0.1781      0.0747      0.8405];

Calcule las soluciones restringidas y sin restricciones.

x = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

xunc = C\d
xunc = 2×1

   -2.5627
    3.1108

Todas las entradas en son no negativas, pero algunas entradas en son negativas.xxunc

Calcule las normas de los residuos para las dos soluciones.

constrained_norm = norm(C*x - d)
constrained_norm = 0.9118 
unconstrained_norm = norm(C*xunc - d)
unconstrained_norm = 0.6674 

La solución sin restricciones tiene una norma residual más pequeña porque las restricciones solo pueden aumentar una norma residual.

Establezca la opción para ver la salida cuando finalice.Display'final'lsqnonneg

Cree las opciones.

options = optimset('Display','final');

Prepare una matriz y un vector para el problemaCd

<math display="block">
<mrow>
<mrow>
<mi mathvariant="normal">min</mi>
</mrow>
<mo>|</mo>
<mo>|</mo>
<mi>C</mi>
<mi>x</mi>
<mo>-</mo>
<mi>d</mi>
<mo>|</mo>
<mo>|</mo>
</mrow>
</math>
.

C = [0.0372    0.2869      0.6861    0.7071      0.6233    0.6245      0.6344    0.6170];  d = [0.8587      0.1781      0.0747      0.8405];

Llame con la estructura de opciones.lsqnonneg

x = lsqnonneg(C,d,options);
Optimization terminated. 

Llame con salidas para obtener la solución, la norma residual y el vector residual.lsqnonneg

Prepare una matriz y un vector para el problemaCd

<math display="block">
<mrow>
<mrow>
<mi mathvariant="normal">min</mi>
</mrow>
<mo>|</mo>
<mo>|</mo>
<mi>C</mi>
<mi>x</mi>
<mo>-</mo>
<mi>d</mi>
<mo>|</mo>
<mo>|</mo>
</mrow>
</math>
.

C = [0.0372    0.2869      0.6861    0.7071      0.6233    0.6245      0.6344    0.6170];  d = [0.8587      0.1781      0.0747      0.8405];

Obtenga la solución y la información residual.

 [x,resnorm,residual] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315 
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

Compruebe que la norma residual devuelta es el cuadrado de la norma del vector residual devuelto.

 norm(residual)^2
ans = 0.8315 

Solicite todos los argumentos de salida para examinar el proceso de solución y solución después de finalizar.lsqnonneg

Prepare una matriz y un vector para el problemaCd

<math display="block">
<mrow>
<mrow>
<mi mathvariant="normal">min</mi>
</mrow>
<mo>|</mo>
<mo>|</mo>
<mi>C</mi>
<mi>x</mi>
<mo>-</mo>
<mi>d</mi>
<mo>|</mo>
<mo>|</mo>
</mrow>
</math>
.

C = [0.0372    0.2869      0.6861    0.7071      0.6233    0.6245      0.6344    0.6170];  d = [0.8587      0.1781      0.0747      0.8405];

Resuelva el problema, solicitando todos los argumentos de salida.

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315 
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

exitflag = 1 
output = struct with fields:
    iterations: 1
     algorithm: 'active-set'
       message: 'Optimization terminated.'

lambda = 2×1

   -0.1506
   -0.0000

es, indicando una solución correcta.exitflag1

, y el correspondientex(1) = 0lambda(1)

<math display="block">
<mrow>
<mo></mo>
</mrow>
</math>
, mostrando la dualidad correcta.0 Del mismo modo, y el correspondiente.x(2) > 0lambda(2) = 0

Argumentos de entrada

contraer todo

Multiplicador lineal, especificado como una matriz real. Representa la variable en el problemaC

minxCxd22.

Por compatibilidad, el número de filas de debe ser igual a la longitud de.Cd

Ejemplo: C = [1,2;3,-1;-4,4]

Tipos de datos: double

Término aditivo, especificado como un vector real. Representa la variable en el problemad

minxCxd22.

Por compatibilidad, la longitud de debe ser igual al número de filas de.dC

Ejemplo: d = [1;-6;5]

Tipos de datos: double

Opciones de optimización, especificadas como una estructura como devoluciones.optimset Puede utilizar para establecer o cambiar los valores de estos campos en la estructura de opciones.optimset Consulte para obtener información detallada.Opciones de optimización referencia

Display

Nivel de visualización:

  • (valor predeterminado) muestra la salida sólo si la función no converge.'notify'

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

  • muestra sólo la salida final.'final'

TolX

Tolerancia de terminación activada, un escalar positivo.x El valor predeterminado es.10*eps*norm(C,1)*length(C) Ver.Tolerancias y criterios de detención

Ejemplo: options = optimset('Display','final')

Tipos de datos: struct

Estructura del problema, especificada como una estructura con los siguientes campos.

Nombre de campoEntrada

C

Matriz real

d

Vector real

solver

'lsqnonneg'

Opciones

Estructura de opciones como devuelta poroptimset

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. La longitud de es la misma que la longitud de.xd

Norma residual cuadrada, devuelta como un escalar no negativo. Igual a.norm(C*x-d)^2

Residual, devuelta como un vector real. El residuo es.d - C*x

Motivo detenido, devuelto como un entero.lsqnonneg

1

Función convergida a una solución.x

0

Número de iteraciones superada.options.MaxIter

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

iterations

Número de iteraciones tomadas

algorithm

'active-set'

message

Mensaje de salida

Multiplicadores de Lagrange, devueltos como un vector real. Las entradas satisfacen la condición de complementariedad.x'*lambda = 0 Esto significa que cuando es aproximadamente, y es aproximadamente cuando.lambda(i) < 0x(i)0lambda(i)0x(i) > 0

Sugerencias

  • Para los problemas que tienen una longitud superior a 20, podría ser más rápido que.dlsqlinlsqnonneg Cuando tiene una longitud de menos de 20, es generalmente más eficiente.dlsqnonneg

    Para convertir entre los solucionadores cuando tiene más filas que columnas (lo que significa que el sistema está sobredeterminado),C

    [x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)

    equivale a

    [m,n] = size(C); [x,resnorm,residual,exitflag,output,lambda_lsqlin] = ...    lsqlin(C,d,-eye(n,n),zeros(n,1));

    La única diferencia es que los multiplicadores de Lagrange correspondientes tienen signos opuestos:.lambda = -lambda_lsqlin.ineqlin

Algoritmos

utiliza el algoritmo descrito en.lsqnonneg[1] El algoritmo comienza con un conjunto de vectores de base posibles y calcula el vector dual asociado.lambda A continuación, selecciona el vector de base correspondiente al valor máximo para cambiarlo fuera de la base a cambio de otro posible candidato.lambda Esto continúa hasta.lambda ≤ 0

Referencias

[1] Lawson, C. L. and R. J. Hanson. Solving Least-Squares Problems. Upper Saddle River, NJ: Prentice Hall. 1974. Chapter 23, p. 161.

Capacidades ampliadas

Consulte también

| | |

Introducido antes de R2006a