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
se realiza el mismo procedimiento para los otros tipos de metal.
Las ecuaciones se escriben en la forma matricial Ax=B
Para resolver se plantea la matriz aumentada
se pivotea por filas la matriz:
Para eliminar hacia adelante:
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.