Main Content

lsqnonneg

Resolver problemas de mínimos cuadrados lineales no negativos

Descripción

Resuelva problemas de ajuste de curvas de mínimos cuadrados no negativos con el formato

minxCxd22, where x0.

Nota

lsqnonneg se aplica únicamente al enfoque basado en solvers. Para ver una exposición sobre los dos enfoques de optimización, consulte En primer lugar, elija el enfoque basado en problemas o el enfoque basado en solvers.

ejemplo

x = lsqnonneg(C,d) devuelve el vector x que minimiza norm(C*x-d) sujeto a x ≥ 0. Los argumentos C y d deben ser reales.

ejemplo

x = lsqnonneg(C,d,options) minimiza con las opciones de optimización que se especifican en la estructura options. Utilice optimset para configurar estas opciones.

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

ejemplo

[x,resnorm,residual] = lsqnonneg(___), para cualquier sintaxis previa, devuelve además el valor de la norma euclídea al cuadrado del valor residual, norm(C*x-d)^2, y devuelve el valor residual d-C*x.

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

ejemplo

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

Ejemplos

contraer todo

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

Prepare una matriz C y un vector d para el problema min||Cx-d||.

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 la solución restringida y la no restringida.

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

         0
    0.6929

xunc = C\d
xunc = 2×1

   -2.5627
    3.1108

Todas las entradas de x son no negativas, pero algunas entradas de xunc son negativas.

Calcule las normas de los valores residuales de 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 la norma residual.

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

Cree las opciones.

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

Prepare una matriz C y un vector d para el problema min||Cx-d||.

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 a lsqnonneg con la estructura de opciones.

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

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

Prepare una matriz C y un vector d para el problema min||Cx-d||.

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 del valor 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 a los todos los argumentos de salida que examinen la solución y el proceso de resolución una vez que lsqnonneg termine.

Prepare una matriz C y un vector d para el problema min||Cx-d||.

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

exitflag es 1, lo que indica una solución correcta.

x(1) = 0 y el coorespondiente lambda(1) 0, mostrando la dualidad correcta. De forma similar, x(2) > 0 y el correspondiente lambda(2) = 0.

Argumentos de entrada

contraer todo

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

minxCxd22.

Para tener compatibilidad, el número de filas de C debe ser igual que la longitud de d.

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

Tipos de datos: double

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

minxCxd22.

Para tener compatibilidad, la longitud de d debe ser igual que el número de filas de C.

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

Tipos de datos: double

Opciones de optimización, especificadas como una estructura como la que devuelve optimset. Puede utilizar optimset para establecer o cambiar los valores de estos campos en la estructura de las opciones. Consulte Referencia de opciones de optimización para ver información detallada.

Display

Nivel de visualización:

  • 'notify' (predeterminado) solo muestra salidas si la función no converge.

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

  • 'final' solo muestra la salida final.

TolX

Tolerancia de terminación en x, un escalar positivo. La opción predeterminada es 10*eps*norm(C,1)*length(C). Consulte Tolerancias y criterios de detención.

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

Tipos de datos: struct

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

Nombre de campoEntrada

C

Matriz real

d

Vector real

solver

'lsqnonneg'

options

Estructura de las opciones como la que devuelve optimset

Tipos de datos: struct

Argumentos de salida

contraer todo

Solución, devuelta como un vector real. La longitud de x es la misma que la de d.

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

Valor residual, devuelto como un vector real. El valor residual es d - C*x.

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

1

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

0

El número de iteraciones ha sobrepasado options.MaxIter.

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

iterations

Número de iteraciones realizadas

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 lambda(i) < 0 cuando x(i) es aproximadamente 0 y que lambda(i) es aproximadamente 0 cuando x(i) > 0.

Sugerencias

  • En el caso de problemas en los que d tiene una longitud superior a 20, lsqlin debe ser más rápido que lsqnonneg. Cuando d tiene una longitud inferior a 20, lsqnonneg, generalmente, es más eficiente.

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

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

    es equivalente 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

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

Funcionalidad alternativa

App

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

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

Historial de versiones

Introducido antes de R2006a

Consulte también

| | |