Ejercicio: 1Eva_2022PAOI_T2 Capacidad de alimentos para pacientes internos
a) Realice el planteamiento del sistema de ecuaciones que permita determinar la cantidad máxima de pacientes de cada grupo que podrían ser atendidos usando todos los productos disponibles. Una vez planteadas las ecuaciones, se le indica que la capacidad de atención para emergencia sea fija en K = 10 pacientes (variable libre).
Producto\ Paciente | Maternidad | Pos – operatorio | Covid_19 | emergencia | Suministro diario |
Producto A | 0.2 | 0.1 | 1.7 | 0.25 | 135 |
Producto B | 0.5 | 2 | 0.05 | 0.4 | 320 |
Producto C | 1.5 | 0.2 | 0.75 | 1.4 | 410 |
Sistema de ecuaciones usando la columna de emergencias como variable libre y valor constante para la variable igual a K=10
0.2 x_1 + 0.1 x_2 +1.7 x_3 = 135-0.25 K 0.5 x_1 + 2 x_2 +0.05 x_3 = 320-0.4 K 1.5 x_1 + 0.2 x_2 +0.75 x_3 = 410-1.4 Kb) Muestre los pasos detallados para la matriz aumentada y pivoteo parcial por filas.
matriz aumentada
\begin{pmatrix} 0.2 & 0.1 & 1.7 & 135-0.25*10 \\ 0.5 & 2 &0.05 & 320-0.4*10 \\ 1.5 & 0.2 & 0.75 &410-1.4*10 \end{pmatrix}pivoteo parcial por filas
\begin{pmatrix} 1.5 & 0.2 & 0.75 & 396 \\ 0.5 & 2 &0.05 & 316 \\ 0.2 & 0.1 & 1.7 & 132.5 \end{pmatrix}c) Desarrolle al menos 3 iteraciones para el método requerido, con expresiones completas.
1.5 x_1 + 0.2 x_2 +0.75 x_3 = 396
ecuaciones a usar
x_1 = \frac{1}{1.5}(396 - 0.2 x_2 - 0.75 x_3) x_2 = \frac{1}{2}(316 - 0.5 x_1 - 0.05 x_3) x_3 = \frac{1}{1.7}(132.5 - 0.2 x_1 - 0.1 x_2)Dado que el valor de la variable libre se establecía con K=10, el vector inicial podría ser el doble de este valor
X_0 = [20,20,20]itera=1
X_0 = [20,20,20] x_1 = \frac{1}{1.5}(396 - 0.2(20) - 0.75(20)) =251.33 x_2 = \frac{1}{2}(316 - 0.5(20) - 0.05 (20)) = 152.5 x_3 = \frac{1}{1.7}(132.5 - 0.2 (20) - 0.1 (20)) =74.41 diferencia = [231.33, 132.5, 54.41] errado = max |[231.33, 132.5, 54.41]| = 231.33itera=2
X_1 = [251.33, 152.5, 74.41] x_1 = \frac{1}{1.5}(396 - 0.2(152.5) - 0.75(74.41)) =206.46 x_2 = \frac{1}{2}(316 - 0.5(251.33) - 0.05 (74.41)) = 96.30 x_3 = \frac{1}{1.7}(132.5 - 0.2 (251.33) - 0.1 (152.5)) =39.40 diferencia = [-44.86, -59.27, -211.92] errado = max |[-44.86, -59.27, -211.92]| = 211.92itera=3
X_2 = [231.85, 105.39, 48.16] x_1 = \frac{1}{1.5}(396 - 0.2(105.39) - 0.75(48.16)) =231.85 x_2 = \frac{1}{2}(316 - 0.5(231.85) - 0.05 (48.16)) = 105.39 x_3 = \frac{1}{1.7}(132.5 - 0.2 ( 231.85) - 0.1 (105.39)) =48.16 diferencia = [25.39, 121.09, -158.29] errado = max |[25.39, 121.09, -158.29]| = 158.29 X_3 = [231.85, 105.39, 48.16]d) Realice las observaciones necesarias sobre los errores entre iteraciones y la convergencia.
El error entre iteraciones disminuye, el método converge a:
respuesta X: [[228.22] [ 99.81] [ 44.92]]
e) Si se decide no atender a los pacientes del grupo emergencias, ¿Qué aumento individual de cada una de otros grupos de pacientes podría soportarse con la cantidad diaria de alimento disponible? (use el algoritmo.py).
Se interpreta como K=0 y usando el algoritmo se obtiene:
respuesta X: [[237.23] [ 99.54] [ 45.64]]
el aumento de pacientes entre grupos es
diferencia = [9.01, -0.27, 0.72]
en términos de pacientes, como número entero, solo se gana 9 pacientes para el primer grupo. Se descarta la parte decimal si los pacientes no se cuentan en miles, por lo que las otras variaciones se interpretan como cero.
Algoritmo en Python
Datos tomados luego de pivoteo parcial por filas
Resultados:
0 [20. 20. 20.] 0 [251.33333333 152.5 74.11764706] 1 [206.60784314 93.31372549 39.10784314] 2 [232.00424837 105.37034314 47.85121107] 3 [226.02501538 98.80265763 44.15418589] 4 [228.74921937 100.38989151 45.24395951] 5 [227.99270138 99.68159617 44.83009822] 6 [228.2940714 99.8810722 44.96076477] 7 [228.20214132 99.80246303 44.91357559] 8 [228.23621714 99.82662528 44.92901496] 9 [228.22527582 99.81772034 44.92358473] 10 [228.22917825 99.82059143 44.92539577] 11 [228.22788993 99.81957054 44.92476777] 12 [228.22834004 99.81990832 44.92497939] 13 [228.2281892 99.8197905 44.92490656] 14 [228.22824132 99.81983004 44.92493124] numero de condicion: 2.166985328561448 respuesta con Jacobi [[228.22824132] [ 99.81983004] [ 44.92493124]] verificando: [[396.00002641] [316.00002729] [132.00001438]]
Algoritmo en Python
# 1Eva_2022PAOI_T2 Capacidad de alimentos para pacientes internos import numpy as np def jacobi(A,B,tolera,X,iteramax=100): tamano = np.shape(A) n = tamano[0] m = tamano[1] diferencia = np.ones(n, dtype=float) errado = np.max(diferencia) xnuevo = np.copy(X) itera = 0 print(itera, X) while not(errado<=tolera or itera>iteramax): for i in range(0,n,1): nuevo = B[i] for j in range(0,m,1): if (i!=j): # excepto diagonal de A nuevo = nuevo-A[i,j]*X[j] nuevo = nuevo/A[i,i] xnuevo[i] = nuevo diferencia = np.abs(xnuevo-X) errado = np.max(diferencia) print(itera, xnuevo) X = np.copy(xnuevo) itera = itera + 1 # Vector en columna X = np.transpose([X]) # No converge if (itera>iteramax): X=itera return(X) # INGRESO A = np.array([[1.5, 0.2, 0.75], [0.5, 2.0, 0.05], [0.2, 0.1, 1.7 ]], dtype=float) B = np.array([396.,316.,132.], dtype=float) tolera = 1e-4 X = np.array([20.,20.,20.], dtype=float) # PROCEDIMIENTO # numero de condicion ncond = np.linalg.cond(A) respuesta = jacobi(A,B,tolera,X) verifica = np.dot(A,respuesta) # SALIDA print('numero de condicion:', ncond) print('respuesta con Jacobi') print(respuesta) print('verificando:') print(verifica)