Ejercicio: 1Eva_IT2015_T4 Lingotes metales
Se plantea que cada lingote debe aportar una proporción xi al lingote nuevo a ser fundido.
Se dispone de los compuestos de cada lingote por filas:
compuesto = np.array([[ 20, 50, 20, 10], [ 30, 40, 10, 20], [ 20, 40, 10, 30], [ 50, 20, 20, 10]]) proporcion = np.array([ 27, 39.5, 14, 19.5])
El contenido final de cada componente basado en los aportes xi de cada lingote para cada componente.
Ejemplo para los 27 gramos de oro
20x_1 + 30x_2+ 20x_3 + 50x_4 = 27se realiza el mismo procedimiento para los otros tipos de metal.
50x_1 + 40x_2+ 40x_3 + 20x_4 = 39.5 20x_1 + 10x_2+ 10x_3 + 20x_4 = 14 10x_1 + 20x_2+ 30x_3 + 10x_4 = 19.5Las ecuaciones se escriben en la forma matricial Ax=B
\begin{bmatrix} 20 && 30&& 20 &&50 \\ 50 && 40 && 40 && 20 \\ 20 && 10 && 10 && 20 \\ 10 && 20 && 30 && 10 \end{bmatrix} = \begin{bmatrix} x_1 \\ x_2 \\x_3 \\ x_4 \end{bmatrix} = \begin{bmatrix} 27 \\ 39.5 \\ 14 \\ 19.5 \end{bmatrix}Para resolver se plantea la matriz aumentada
\begin{bmatrix} 20 && 30&& 20 &&50 && 27\\ 50 && 40 && 40 && 20 && 39.5\\ 20 && 10 && 10 && 20 && 14 \\ 10 && 20 && 30 && 10 && 19.5 \end{bmatrix}se pivotea por filas la matriz:
\begin{bmatrix} 50 && 40 && 40 && 20 && 39.5\\ 20 && 30&& 20 &&50 && 27\\ 10 && 20 && 30 && 10 && 19.5 \\ 20 && 10 && 10 && 20 && 14 \end{bmatrix}Para eliminar hacia adelante:
\begin{bmatrix} 50 && 40 && 40 && 20 && 39.5 \\ 20 - 50\frac{20}{50} && 30-40\frac{20}{50} && 20-40\frac{20}{50} && 50-20\frac{20}{50} && 27-39.5\frac{20}{50}\\ 10 - 50\frac{10}{50} && 20-40\frac{10}{50} && 30-40\frac{10}{50} && 10-20\frac{10}{50} && 19.5-39.5\frac{10}{50} \\ 20 - 50\frac{20}{50} && 10-40\frac{20}{50} && 10-40\frac{20}{50} && 20-20\frac{20}{50} && 14-39.5\frac{20}{50} \end{bmatrix}continuando con el desarrollo:
Elimina hacia adelante [[50. 40. 40. 20. 39.5] [ 0. 14. 4. 42. 11.2] [ 0. 12. 22. 6. 11.6] [ 0. -6. -6. 12. -1.8]] Elimina hacia adelante [[ 50. 40. 40. 20. 39.5] [ 0. 14. 4. 42. 11.2] [ 0. 0. 18.5714 -30. 2. ] [ 0. 0. -4.2857 30. 3. ]] Elimina hacia adelante [[ 50. 40. 40. 20. 39.5 ] [ 0. 14. 4. 42. 11.2 ] [ 0. 0. 18.5714 -30. 2. ] [ 0. 0. 0. 23.0769 3.4615]] Elimina hacia adelante [[ 50. 40. 40. 20. 39.5 ] [ 0. 14. 4. 42. 11.2 ] [ 0. 0. 18.5714 -30. 2. ] [ 0. 0. 0. 23.0769 3.4615]] Elimina hacia atras [[ 1. 0. 0. 0. 0.25] [ 0. 1. 0. 0. 0.25] [ 0. 0. 1. -0. 0.35] [ 0. 0. 0. 1. 0.15]] el vector solución X es: [[0.25] [0.25] [0.35] [0.15]] verificar que A.X = B [[39.5] [27. ] [19.5] [14. ]]
Las proporciones de cada lingote a usar para el nuevo lingote que cumple con lo solicitado son:
[0.25, 0.25, 0.35, 0.15]
Algoritmo en python
usado para la solución es:
# Método de Gauss-Jordan , # Recibe las matrices A,B # presenta solucion X que cumple: A.X=B import numpy as np import matplotlib.pyplot as plt # INGRESO A = np.array([[ 50., 40, 40, 20], [ 20., 30, 20, 50], [ 10., 20, 30, 10], [ 20., 10, 10, 20]]) B1 = np.array([ 39.5, 27, 19.5, 14]) B = np.transpose([B1]) # PROCEDIMIENTO casicero = 1e-15 # 0 AB = np.concatenate((A,B),axis=1) tamano = np.shape(AB) n = tamano[0] m = tamano[1] print('matriz aumentada: ') print(AB) # Gauss elimina hacia adelante # tarea: verificar términos cero for i in range(0,n,1): pivote = AB[i,i] adelante = i+1 for k in range(adelante,n,1): if (np.abs(pivote)>=casicero): factor = AB[k,i]/pivote AB[k,:] = AB[k,:] - factor*AB[i,:] print('Elimina hacia adelante') print(AB) # Gauss-Jordan elimina hacia atras ultfila = n-1 ultcolumna = m-1 for i in range(ultfila,0-1,-1): # Normaliza a 1 elemento diagonal AB[i,:] = AB[i,:]/AB[i,i] pivote = AB[i,i] # uno # arriba de la fila i atras = i-1 for k in range(atras,0-1,-1): if (np.abs(AB[k,i])>=casicero): factor = pivote/AB[k,i] AB[k,:] = AB[k,:]*factor - AB[i,:] else: factor= 'division para cero' print('Elimina hacia atras') print(AB) X = AB[:,ultcolumna] # Verifica resultado verifica = np.dot(A,X) # SALIDA print('el vector solución X es:') print(np.transpose([X])) print('verificar que A.X = B') print(np.transpose([verifica]))
Tarea: Revisar sobre la última pregunta.