Resolviendo ejercicio de programación no lineal con python — Investigación de operaciones

Hernan Castilla
3 min readAug 13, 2018

La idea es resolver problemas de programación no lineal utilizando python, este tipo de problemas requieren de una matemática un poquito mas compleja y puede ser tedioso resolverlos a mano, algo ideal para hacerlo mediante programación.

Requerimientos

  • python
  • sympy

Resolviendo ejercicio de programación no lineal con una sola restricción y dos variables

Lo primero es importar nuestros recursos y declarar nuestra función objetivo (z) y su restricción

from sympy import *x,y = symbols("x y") #definimos los simbolos a utilizarres = sympify("3*x**2 + 2*y**2 - 13950") #restriccion
z = sympify("9.6*x - 0.06*x**2 + 10*y") #función objetivo

primero encontraremos las soluciones de nuestra restricción para x, y, debemos crear un pequeña función que valide que nuestra solución sea un numero real

con esta función lista, solo reemplazamos x=0, y=0 y evaluamos nuestra expresión

"""res.subs(variable, valor) esto reemplaza el valor
designado en cada coincidencia de la variable,
retorna una expresion.
solve(expresion) nos resulve
nuestra ecuación, retorna un arreglo con dichas soluciones.
getSolution(arregloSoluciones) verifica que cada solución sea real y positiva, retorna un valor numérico."""px = getSolution(solve(res.subs(y, 0)))py = getSolution(solve(res.subs(x, 0)))

listo, tenemos nuestros puntos en (x, 0) y (0, y), podríamos graficar nuestra restricción y dichos puntos.

damos solución a la función objetivo para la variable y.

y1 = solve(z, y)[0] #solucionamos la función objetivo para y

ahora necesitamos obtener la derivada de la solución de la función objetivo y la de la restricción

dy1 = diff(y1, x) #derivamos  la solucion y1 con respecto a x"""
calculados la derivada implícita con respecto a la restricción
"""
dy2 = idiff(res, y, x)

el siguiente paso es igualar nuestras derivadas, para eso creamos una nueva ecuación

igual = Eq(dy1, dy2) #creamos una nueva ecuacion igualando las derivadas

resolvemos la nueva ecuación con respecto a la variable y

yigual = solve(igual, y)[0] #resolvemos la nueva ecuacion para la variable y

todo este proceso fue para obtener yigual, el cual debemos reemplazar en la restricción para despejar y obtener la solución en x

res2 = res.subs(y, yigual) #reemplazamos yigual en nuestra restriccionxSolution = getSolution(solve(res2, x)) #encontramos la solucion para x

encontrando la solución para y

ySolution = res.subs(x, xSolution) #reemplazamos x por xSoluctionySolution = getSolution(solve(ySolution, y)) #resolvemos para y

encontrado la solucion de Z (funcion objetivo)

"""
reemplazamos las soluciones de x y en z, para obtener la solucion de z
"""
zSolution = z.subs(x, xSolution).subs(y, ySolution)

listo, tendriamos todas las soluciones, solo faltaria describir la solucion a nuestro probleam, ejemplo:

Con lo que concluimos que la empresa necesita producir xSolution unidades del producto X y ySolution unidades del producto Y para obtener una contribución máxima de zSolution.

aqui les dejo todo el codigo para copiar pegar y probar.

fuente del ejercicio resuelto de forma matemática http://www.aliat.org.mx/BibliotecasDigitales/economico_administrativo/Investigacion_de_operaciones/Investigacion_de_operaciones_Parte_2.pdf

Pero compartir no es inmoral –es un imperativo moral. Sólo aquellos que están cegados por la codicia se negarían a hacerle una copia a un amigo.

--

--