Ejercicio: 1Eva2007TIII_T1 Container: Cocinas y Refrigeradoras
literal a
Considerando como x la cantidad de refrigeradoras, y cantidad de cocinas, las ecuaciones a plantear son:
\begin{cases} 200 x + 100 y = 1000 \\ 2 x + 1.05 y = 10.4 \end{cases}La forma matricial del ejercicio se convierte a:
\begin{pmatrix} 200 & 100 \\ 2 & 1.05\end{pmatrix} \begin{pmatrix}x \\ y \end{pmatrix} = \begin{pmatrix} 1000 \\10.4 \end{pmatrix}la matriz aumentada es
\begin{pmatrix} 200 & 100 & 1000\\ 2 & 1.05 & 10.4\end{pmatrix}Para el pivoteo parcial por filas, dado que el mayor valor de la primera columna se encuentra en la diagonal, no se requiere y la matriz aumentada se mantiene igual.
Para el proceso de eliminación hacia adelante, se incia con el pivote=200
factor = \frac{2}{200} = 0.01que se aplica a la segunda fila
[ 200. 100. 1000 ]
-(2/200)*[ 2. 1.05 10.4]
_________________________________
= [ 0. 0.05 0.4]
con lo que la matriz queda:
\begin{pmatrix} 200 & 100 & 1000\\ 0 & 0.05 & 0.4\end{pmatrix}Se aplica sustitución hacia atrás, desde la última fila:
0.05 y = 0.4 y = \frac{0.4}{0.05 } = 8para la primera fila:
200 x+100(8)=1000 200 x=1000-100 (8) x=\frac{1000 - 100 (8)}{200} = 1siendo la respuesta [1,8]
Con el algoritmo se obtiene:
Matriz aumentada
[[ 200. 100. 1000. ]
[ 2. 1.05 10.4 ]]
Pivoteo parcial:
Pivoteo por filas NO requerido
Elimina hacia adelante:
factor: 0.01 para fila: 1
[[2.e+02 1.e+02 1.e+03]
[0.e+00 5.e-02 4.e-01]]
solución:
[1. 8.]
>>>
literal b
Matriz aumentada
[[ 200. 100. 1000. ]
[ 2. 1.1 10.4]]
Pivoteo parcial:
Pivoteo por filas NO requerido
Elimina hacia adelante:
fila 0 pivote: 200
factor: 0.01 para fila: 1
[[2.e+02 1.e+02 1.e+03]
[0.e+00 1.e-01 4.e-01]]
solución:
[3. 4.]
>>>
literal c

Observación: el pequeño cambio de volumen de la cocina no es consistente con los resultados.
El asunto es que la forma de la refrigeradora o cocina no se adapta al volumen disponible, pues son objetos rígidos. Por lo que el sistema de ecuaciones estaría mal planteado.
Las ecuaciones tendrían sentido si esta diseñando el mejor "tamaño" para que entren la mayor cantidad dentro de un container, sin embargo los tamaños de las refrigeradoras y cocinas se encuentran estandarizados.
Revisamos el número de condición, que resulta ser del orden de 104, lo que confirma que el sistema está mal condicionado.
Usando la el valor de 1.05
>>> C = np.concatenate((A,B),axis=1)
>>> C
array([[ 200. , 100. , 1000. ],
[ 2. , 1.05, 10.4]])
>>> np.linalg.cond(C)
12926.000640466344
Algoritmo en Python
# 1Eva_IIIT2007_T1 Container: Cocinas y Refrigeradoras
import numpy as np
def pivoteafila(A,B,vertabla=False):
'''
Pivotea parcial por filas
Si hay ceros en diagonal es matriz singular,
Tarea: Revisar si diagonal tiene ceros
'''
A = np.array(A,dtype=float)
B = np.array(B,dtype=float)
# Matriz aumentada
nB = len(np.shape(B))
if nB == 1:
B = np.transpose([B])
AB = np.concatenate((A,B),axis=1)
if vertabla==True:
print('Matriz aumentada')
print(AB)
print('Pivoteo parcial:')
# Pivoteo por filas AB
tamano = np.shape(AB)
n = tamano[0]
m = tamano[1]
# Para cada fila en AB
pivoteado = 0
for i in range(0,n-1,1):
# columna desde diagonal i en adelante
columna = np.abs(AB[i:,i])
dondemax = np.argmax(columna)
# dondemax no es en diagonal
if (dondemax != 0):
# intercambia filas
temporal = np.copy(AB[i,:])
AB[i,:] = AB[dondemax+i,:]
AB[dondemax+i,:] = temporal
pivoteado = pivoteado + 1
if vertabla==True:
print(' ',pivoteado, 'intercambiar filas: ',i,'y', dondemax)
if vertabla==True:
if pivoteado==0:
print(' Pivoteo por filas NO requerido')
else:
print(AB)
return(AB)
def gauss_eliminaAdelante(AB,vertabla=False, casicero = 1e-15):
''' Gauss elimina hacia adelante
tarea: verificar términos cero
'''
tamano = np.shape(AB)
n = tamano[0]
m = tamano[1]
if vertabla==True:
print('Elimina hacia adelante:')
for i in range(0,n,1):
pivote = AB[i,i]
adelante = i+1
if vertabla==True:
print(' fila',i,'pivote: ', pivote)
for k in range(adelante,n,1):
if (np.abs(pivote)>=casicero):
factor = AB[k,i]/pivote
AB[k,:] = AB[k,:] - factor*AB[i,:]
if vertabla==True:
print(' factor: ',factor,' para fila: ',k)
else:
print(' pivote:', pivote,'en fila:',i,
'genera division para cero')
if vertabla==True:
print(AB)
return(AB)
def gauss_sustituyeAtras(AB,vertabla=False, casicero = 1e-15):
''' Gauss sustituye hacia atras
'''
tamano = np.shape(AB)
n = tamano[0]
m = tamano[1]
# Sustitución hacia atras
X = np.zeros(n,dtype=float)
ultfila = n-1
ultcolumna = m-1
for i in range(ultfila,0-1,-1):
suma = 0
for j in range(i+1,ultcolumna,1):
suma = suma + AB[i,j]*X[j]
X[i] = (AB[i,ultcolumna]-suma)/AB[i,i]
return(X)
# INGRESO
A = [[200, 100 ],
[ 2, 1.05]]
B = [1000, 10.4]
# PROCEDIMIENTO
AB = pivoteafila(A,B,vertabla=True)
AB = gauss_eliminaAdelante(AB,vertabla=True)
X = gauss_sustituyeAtras(AB,vertabla=True)
# SALIDA
print('solución: ')
print(X)