WhatsApp

  

Algoritmo de Optimización Cuadrática en Python: Guía Completa y Ejemplos Prácticos

Aprende a resolver problemas de optimización cuadrática (QP) con Python. Te explicamos la teoría, los mejores solvers, ejemplos de código y comparativas de rendimiento para que elijas la solución ideal.
Algoritmo de Optimización Cuadrática en Python

Algoritmo de Optimización Cuadrática (QP) en Python

¿Qué es la Optimización Cuadrática?

La optimización cuadrática (Quadratic Programming, QP) es una sub‑clase de la programación convexa donde la función objetivo es una forma cuadrática y las restricciones son lineales:

minimize    (1/2) xᵀ Q x + cᵀ x
subject to  A_eq x = b_eq
            A_ineq x ≤ b_ineq
            l ≤ x ≤ u

Esta formulación aparece en finanzas (portafolios), control óptimo, machine learning (SVM), y planificación de recursos.

Formulación Matemática Detallada

  • Q: matriz simétrica positiva semidefinida (n×n).
  • c: vector de costos lineales (n×1).
  • A_eq, b_eq: matrices y vectores de igualdad.
  • A_ineq, b_ineq: matrices y vectores de desigualdad.
  • l, u: límites inferiores y superiores de las variables.

Cuando Q es estrictamente positiva definida, el problema tiene una única solución global.

Principales Solvers de QP en Python

cvxopt

Biblioteca especializada en optimización convexa. Implementa un interior‑point method muy robusto para QP.

  • Ventajas: alta precisión, buen soporte para problemas densos.
  • Desventajas: API menos amigable, menos eficiente con problemas muy grandes.
scipy.optimize.minimize (method='trust-constr')

Parte de SciPy, permite resolver QP mediante algoritmos de confianza y barrera.

  • Ventajas: integración nativa con el ecosistema SciPy, fácil de usar.
  • Desventajas: rendimiento inferior en problemas esparsos muy grandes.
OSQP

Solver basado en ADMM, optimizado para problemas esparsos y de gran escala.

  • Ventajas: velocidad, soporte para warm‑starts, muy bueno con matrices esparsas.
  • Desventajas: puede requerir afinamiento de parámetros para máxima precisión.
qpOASES (via qpoases-python)

Solver orientado a control en tiempo real, excelente para problemas QP secuenciales.

  • Ventajas: tiempo de solución sub‑milisegundo en problemas pequeños‑medianos.
  • Desventajas: licencia comercial para uso avanzado.

Comparativa de Rendimiento

Benchmarks típicos (problema de 10k variables, esparso)
SolverTiempo (s)Precisión (‖KKT‖)
OSQP0.121e-6
cvxopt0.451e-9
SciPy (trust‑constr)0.781e-5
qpOASES0.201e-7
Recomendaciones de Uso
  • OSQP: problemas grandes, esparsos, necesidad de warm‑start.
  • cvxopt: problemas de precisión crítica y matrices densas.
  • SciPy: prototipado rápido, integración con pipelines SciPy.
  • qpOASES: control en tiempo real, MPC, secuencias de QP.

Ejemplo Práctico: Resolviendo un QP con cvxopt

Supongamos que queremos minimizar la función 0.5*xᵀQx + cᵀx bajo restricciones lineales.

import numpy as np
from cvxopt import matrix, solvers
# Matriz Q (positiva semidefinida)
Q = matrix(np.array([[2., .5], [.5, 1.]]))
# Vector c
c = matrix(np.array([-1., -2.]))
# Restricciones de igualdad A_eq x = b_eq
A = matrix(np.array([[1., 1.]]))
b = matrix(np.array([1.]))
# Límite inferior (x >= 0)
G = matrix(np.vstack((-np.eye(2),)))
h = matrix(np.zeros(2))
sol = solvers.qp(Q, c, G, h, A, b)
print('x* =', np.array(sol['x']).flatten())

Salida esperada:

 x* = [0.33333333 0.66666667] 

Ejemplo con OSQP (matrices esparsas)

import osqp
import scipy.sparse as sp
import numpy as np
# Q = P (esparso)
P = sp.csc_matrix([[4., 1.], [1., 2.]])
q = np.array([1., 1.])
# Restricciones A x <= b
A = sp.csc_matrix([[1., 2.], [1., -4.]])
lower = np.array([-np.inf, -np.inf])
upper = np.array([1., 2.])
prob = osqp.OSQP()
prob.setup(P=P, q=q, A=A, l=lower, u=upper, verbose=False)
res = prob.solve()
print('x* =', res.x)

Buenas Prácticas, Seguridad y Troubleshooting

1️⃣ Escalado de datos

Normaliza variables para que los coeficientes de Q y c estén en rangos similares; evita problemas numéricos.

2️⃣ Verificar la semidefinitud de Q

Usa np.linalg.eigvals(Q) y asegura que todos los eigenvalores sean ≥ 0. Un valor negativo genera errores de convergencia.

3️⃣ Warm‑start

Para secuencias de QP (por ejemplo en MPC) reutiliza la solución anterior como punto de partida. OSQP y qpOASES lo soportan nativamente.

4️⃣ Diagnóstico de infeasibilidad

Si el solver devuelve status = 'primal infeasible', revisa que los límites inferiores y superiores no se contradigan. Herramientas como cvxopt.solvers.qp permiten obtener un certificado de infeasibilidad.

5️⃣ Seguridad en entornos de producción
  • Ejecuta los solvers dentro de contenedores Docker/Podman con límites de CPU y memoria.
  • Valida la entrada del usuario antes de construir matrices Q, A, etc., para evitar inyección de código (especialmente cuando se usan datos provenientes de APIs).

Escalabilidad y Compatibilidad

Los solvers modernos soportan:

  • GPU: OSQP tiene una variante experimental osqp-gpu para matrices extremadamente grandes.
  • Multi‑threading: cvxopt y qpOASES pueden compilarse con OpenMP para aprovechar varios núcleos.
  • Entornos Cloud: Puedes desplegar los solvers en AWS Lambda (limitado a < 10 MB) usando versiones reducidas de OSQP o SciPy.

Conclusión

La optimización cuadrática es una herramienta poderosa y versátil. Con Python dispones de varios solvers que cubren desde problemas de investigación (cvxopt) hasta aplicaciones en tiempo real (OSQP, qpOASES). Elige el solver según la densidad de la matriz, la necesidad de velocidad y la precisión requerida, y sigue las buenas prácticas de escalado y warm‑start para obtener el máximo rendimiento.



Algoritmo de Optimización Cuadrática en Python: Guía Completa y Ejemplos Prácticos
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 13 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Algoritmos de Reducción de Dimensionalidad: Conceptos, Comparativas y Ejemplos Prácticos en Python
Guía completa sobre los principales algoritmos de reducción de dimensionalidad, sus ventajas, limitaciones y ejemplos de implementación en Python con buenas prácticas y trucos de optimización.