Universidad tamaulipeca Campus Reynosa Informe de práctica Tema: Karush – Kuhn – Tucker (KKT) Curso: Posgrado en Sistemas de producción y calidad. Materia: Métodos cuantitativos Introducción: Las condiciones de Karush-Kuhn-Tucker (también conocidas como las condiciones KKT o Kuhn-Tucker) son requerimientos necesarios y suficientes para que la solución de un problema de programación matemática sea óptima. Objetivo: El objetivo de la siguiente práctica es analizar, entender y facilitar la optimización de los procesos dentro de la manufactura para dicho objetivo se plantea un ejercicio para aprender y aumentar la experiencia en optimización de procesos. Para el siguiente ejercicio se utilizó el programa Spyder (Python 3.7) en el cual se programó el siguiente código: #%% OPTIMIZACION KKT import numpy as np import sympy as sp import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.axes3d import Axes3D from matplotlib import cm ### DETERMINAR ENTRADA DE INFORMACION ### x1 = sp.Symbol('x1') x2 = sp.Symbol('x2') z1 = sp.Symbol('z1') z2 = sp.Symbol('z2') z3 = sp.Symbol('z3') x10 = float(input('Digite la interaccion de x1:')) x20 = float(input('Digite la interaccion de x1:')) z10 = float(input('Digite la interaccion de z1:')) z20 = float(input('Digite la interaccion de z2:')) z30 = float(input('Digite la interaccion de z3:')) def f(x1,x2): return((x1**2)+(x2**2)-(17*x1)-(35*x2)) def g1(x1,x2): return(x1+x2-17.25) def g2(x1,x2): return(-x1) def g3(x1,x2): return(-x2) F = f(x1,x2)+(z1*g1(x1,x2))+(z2*g2(x1,x2))+(z3*g3(x1,x2)) ### CONDICIONES ESTACIONARIAS F1 = sp.diff(F,x1) F2 = sp.diff(F,x2) ### CONDICIONES DE HOLGURA F3 = z1*(g1(x1,x2)) F4 = z2*(g2(x1,x2)) F5 = z3*(g3(x1,x2)) ### DETERMINAR DERIVADAS F1x1 = sp.diff(F1,x1) F1x2 = sp.diff(F1,x2) F1z1 = sp.diff(F1,z1) F1z2 = sp.diff(F1,z2) F1z3 = sp.diff(F1,z3) F2x1 = sp.diff(F2,x1) F2x2 = sp.diff(F2,x2) F2z1 = sp.diff(F2,z1) F2z2 = sp.diff(F2,z2) F2z3 = sp.diff(F2,z3) F3x1 = sp.diff(F3,x1) F3x2 = sp.diff(F3,x2) F3z1 = sp.diff(F3,z1) F3z2 = sp.diff(F3,z2) F3z3 = sp.diff(F3,z3) F4x1 = sp.diff(F4,x1) F4x2 = sp.diff(F4,x2) F4z1 = sp.diff(F4,z1) F4z2 = sp.diff(F4,z2) F4z3 = sp.diff(F4,z3) F5x1 = sp.diff(F5,x1) F5x2 = sp.diff(F5,x2) F5z1 = sp.diff(F5,z1) F5z2 = sp.diff(F5,z2) F5z3 = sp.diff(F5,z3) i=0 while i<100: i = i+1 xi = np.matrix([[x10],[x20],[z10],[z20],[z30]]) V = np.matrix([[float(F1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F4.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F5.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))]]) J = np.matrix([[float(F1x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F1x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F1z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F1z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F1z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F2x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F2x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F2z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F2z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F2z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F3x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F3x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F3z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F3z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F3z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F4x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F4x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F4z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F4z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F4z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))], [float(F5x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F5x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F5z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F5z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})), float(F5z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))]]) J_inv = np.linalg.inv(J) xn = xi-(J_inv*V) x10 = xn[0,0] x20 = xn[1,0] z10 = xn[2,0] z20 = xn[3,0] z30 = xn[4,0] else: if (g1(x10,x20)<=0)&(g2(x10,x20)<=0)&(g3(x10,x20)<=0): c1 = ' Factible ' else : c1 = ' No Factible ' if (z10<=0)&(z20<=0)&(z30<=0): c2 = ' Maximo ' elif (z10>=0)&(z20>=0)&(z30>=0): c2 = ' Minimo ' else: c2 = ' ' print('----------------------------------------------------------------------') print('| P(x1,x2) | z(zi,z2,z3) | Factibilidad | CKKT |') print('----------------------------------------------------------------------') print('|PC1('+str(round(x10,2))+','+str(round(x20,2))+')| '+'Z('+str(round(z10,2))+','+str(round(z20,2))+','+str(round(z30,2))+') |'+c1+'|'+c2+'|') print('----------------------------------------------------------------------') xs = np.linspace(-100,100) ys = np.linspace(-100,100) X, Y = np.meshgrid(xs,ys) Fs = f(X,Y) fig = plt.figure() axes1 = fig.add_subplot(1,1,1,projection='3d') axes1.plot_surface(X,Y,Fs,cmap=cm.hot) axes1.set_xlabel('$x$') axes1.set_ylabel('$y$') axes1.set_zlabel('$F(x,y)$') plt.show() print('----------------------------------------------------------------------') El cual lo que hace es que resolver la Función, indicarnos si es factible o no y al ingresar 5 valores los cuales significan en el código x1:5, x2:10, z1:15, z2:-10,z3:-5 nos arroja una tabla y una gráfica como la siguientes: ---------------------------------------------------------------------| P(x1,x2) | z(zi,z2,z3) | Factibilidad | CKKT | ---------------------------------------------------------------------|PC1(0.0,17.25)| Z(0.5,-16.5,0.0) | Factible | | ---------------------------------------------------------------------- ----------------------------------------------------------------------