Created
August 13, 2018 19:28
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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