Ejercicio: 1Eva_2023PAOI_T2 Productos en combo por subida de precio
literal a
Para el ejercicio solo es posible plantear tres ecuaciones, se muestran datos solo para tres semanas. Se tienen 4 incógnitas, por lo que tendría infinitas soluciones y no se podría resolver.
500 a + 600 b + 400 c + 90 d = 1660 800 a + 450 b + 300 c + 100 d = 1825 400 a + 300 b + 600 c + 80 d = 1430Sin embargo desde el punto de vista práctico se puede usar una variable libre, considerando algunos criterios como:
– que en la nota se da el precio para la docena de huevos a 2.5 USD
– que la variable para huevos es la de menor cantidad se puede incurrir en un menor error si el precio ha variado en los últimos días respecto a lo que se podría haber tenido como referencia.
que al sustituir con d = 2.5
500 a + 600 b + 400 c = 1660 - 90 (2.5) =1435 800 a + 450 b + 300 c = 1825 - 100 (2.5) = 1575 400 a + 300 b + 600 c = 1430 - 80 (2.5) = 1230Nota: el estudiante puede realizar una justificación diferente para el uso de otra variable libre.
literal b
La forma matricial del sistema de ecuaciones se convierte a:
\begin{pmatrix} 500 & 600 & 400 & \Big| & 1435 \\ 800 & 450 & 300 & \Big| & 1575 \\ 400 & 300 & 600 &\Big| & 1230 \end{pmatrix}literal c
pivoteando la matriz aumentada, se encuentra que para la primera columna se pivotean la fila 1 y 2, por ser 800 el valor de mayor magnitud:
\begin{pmatrix} 800 & 450 & 300 & \Big| & 1575 \\ 500 & 600 & 400 & \Big| & 1435 \\ 400 & 300 & 600 &\Big| & 1230 \end{pmatrix}luego, observando la segunda columna desde el elemento de la diagonal hacia abajo, se observa que el mayor valor en magnitud ya se encuentra en la diagonal. No se requieren intercambios de fila para la tercera columna.
literal d
Para el método iterativo de Gauss-Seidel se requiere el vector inicial, tomando las observaciones de la nota. Se da un precio de 50 USD por un quintal métrico de 100Kg, por lo que se estima que el precio por kilogramo ronda 50/100= 0.5 USD. Se indica además que los demás valores se encuentran en el mismo orden de magnitud, por lo que se tiene como vector inicial
X0 = [0.5, 0.5, 0.5]
Para un método iterativo se despejan las ecuaciones como:
a = \frac {1575 - 450 b - 300 c}{800} b = \frac {1435 -500 a - 400 c}{600} c = \frac {1230 - 400 a - 300 b}{600}Para el cálculo del error se considera que se busca un precio, lo regular es considerar el centavo, es decir una tolerancia 10-2. Para el desarrollo se considera usar cuatro decimales por si se considera truncar o redondear.
itera = 0
a = \frac {1575 - 450 (0.5) - 300 (0.5)}{800} = 1.5 b = \frac {1435 -500(1.5) - 400 (0.5)}{600} = 0.8083 c = \frac {1230 - 400(1.5) - 300 (0.8083)}{600} =0.6458errado = max|[1.5-0.5, 0.8083-0.5, 0.6458-0.5]|
errado = max|[1, 0.3083, 0.1458]| = 1
itera = 1
X1 = [1.5, 0.8083, 0.6458]
a = \frac {1575 - 450 (0.8083) - 300 (0.6458)}{800} = 1.2719 b = \frac {1435 -500(1.2719) - 400 (0.6458)}{600} = 0.9012 c = \frac {1230 - 400 (1.2719) - 300 (0.9012)}{600} = 0.7514errado = max|[1.2719-1.5, 0.9012-0.8083, 0.7514-0.6458]|
errado = max|[-0.2281, 0.0929, 0.1056]| = 0.2281
el error disminuye entre iteraciones.
itera = 2
X2 = [1.2719 , 0.9012, 0.7514]
a = \frac {1575 - 450 (0.9012) - 300 (0.7514)}{800} = 1.1805 b = \frac {1435 -500 (1.1805) - 400 (0.7514)}{600} = 0.9069 c = \frac {1230 - 400 (1.1805) - 300 (0.9069)}{600} = 0.8095errado = max|[ 1.1805-1.2719 , 0.9069-0.9012, 0.8095-0.7514]|
errado = max|[-0.0914, 0.0057, 0.1056]| = 0.1056
el error disminuye entre iteraciones.
literal e
Si el error entre iteraciones disminuye, se considera que el método converge.
usando el algoritmo Método de Gauss-Seidel con Python, se tiene como resultado en 13 iteraciones:
[1.5 0.80833333 0.64583333] 1.0 [1.271875 0.90121528 0.75147569] 0.2281249999999999 [1.18001302 0.90733869 0.80965531] 0.09186197916666661 [1.15475125 0.88960375 0.83536396] 0.025708648304880177 [1.1550864 0.87218536 0.84384972] 0.01741839593330019 [1.16170209 0.86101511 0.84502438] 0.011170246538965367 [1.16754486 0.85536303 0.84395525] 0.005842764350612484 [1.17112508 0.85309227 0.84270381] 0.0035802211655899807 [1.17287167 0.85247107 0.84185002] 0.0017465903731879173 [1.17354127 0.85248226 0.84139802] 0.0006695985845832642 [1.17370447 0.85264759 0.84120656] 0.00019146597344232852 [1.17368327 0.8527929 0.84114804] 0.00014530950399282982 [1.17362348 0.85288174 0.84114348] 8.884049018109685e-05 respuesta X: [[1.17362348] [0.85288174] [0.84114348]] verificar A.X=B: [[1575.03861029] [1434.99817609] [1230. ]] iteraciones 13 >>>
instrucciones en Python
Se debe recordar que las matrices y vectores deben ser tipo real (float) .
# Método de Gauss-Seidel # solución de sistemas de ecuaciones # por métodos iterativos import numpy as np # INGRESO A = np.array([[800, 450, 300], [500, 600, 400], [400, 300, 600]], dtype=float) B = np.array([1575, 1435,1230], dtype=float) X0 = np.array([0.5,0.5,0.5]) tolera = 0.0001 iteramax = 100 # PROCEDIMIENTO # Gauss-Seidel tamano = np.shape(A) n = tamano[0] m = tamano[1] # valores iniciales X = np.copy(X0) diferencia = np.ones(n, dtype=float) errado = 2*tolera itera = 0 while not(errado<=tolera or itera>iteramax): # por fila for i in range(0,n,1): # por columna suma = 0 for j in range(0,m,1): # excepto diagonal de A if (i!=j): suma = suma-A[i,j]*X[j] nuevo = (B[i]+suma)/A[i,i] diferencia[i] = np.abs(nuevo-X[i]) X[i] = nuevo errado = np.max(diferencia) print(X,errado) itera = itera + 1 # Respuesta X en columna X = np.transpose([X]) # revisa si NO converge if (itera>iteramax): X=0 # revisa respuesta verifica = np.dot(A,X) # SALIDA print('respuesta X: ') print(X) print('verificar A.X=B: ') print(verifica) print('iteraciones',itera)