Skip to content

Instantly share code, notes, and snippets.

@hcastillaq
Created August 13, 2018 19:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hcastillaq/847b4a92326a3504f2aea04ddc31827e to your computer and use it in GitHub Desktop.
Save hcastillaq/847b4a92326a3504f2aea04ddc31827e to your computer and use it in GitHub Desktop.
Resolviendo ejercicio de programacion no linal con una sola restriccion y dos variables - python
from sympy import *
"""
recibe como parámetro un arreglo de soluciones,
las valida y retorna la solución, ignora soluciones con parte imaginaria
"""
def getSolution(data):
sol = None
#recorremos cada solucion del arreglo
for val in data:
val = val.evalf() #evaluamos la solucion, nos deja un numero
#validamos que la solucion evaluada sea mayor que 0 y tambien un numero real
if val > 0 and sympify(val).is_real:
sol = val
break
return sol
x,y = symbols("x y") #definimos los simbolos a utilizar
res = sympify("3*x**2 + 2*y**2 - 13950") #restriccion
z = sympify("9.6*x - 0.06*x**2 + 10*y") #función objetivo
"""
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)))
y1 = solve(z, y)[0] #solucionamos la funcion objetivo para y
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)
igual = Eq(dy1, dy2) #creamos una nueva ecuacion igualando las derivadas
yigual = solve(igual, y)[0] #resolvemos la nueva ecuacion para la variable y
res2 = res.subs(y, yigual) #reemplazamos yigual en nuestra restriccion
xSolution = getSolution(solve(res2, x)) #encontramos la solucion para x
ySolution = res.subs(x, xSolution) #reemplazamos x por xSoluction
ySolution = getSolution(solve(ySolution, y)) #resolvemos para y
"""
reemplazamos las soluciones de x y en z, para obtener la solucion de z
"""
zSolution = z.subs(x, xSolution).subs(y, ySolution)
resp = {"y1":str(y1),
"dy1": str(dy1), "dy2": str(dy2),
"igual":str(igual), "yigual":str(yigual),
"res2":str(res2), "xSolution": str(xSolution),
"ySolution": str(ySolution), "zSolution":str(zSolution),
"px": str(px), "py": str(py) }
print( " Se necesita producir ", xSolution, " unidades del producto X" )
print( " Se necesita producir ", ySolution, " unidades del producto Y" )
print( " para obtener una contribución máxima de ", zSolution )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment