Ejercicio: 1Eva2015TI_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.