Ejercicio: 1Eva_IT2017_T4 Componentes eléctricos
Desarrollo Analítico
Solo puede usar las cantidades disponibles de material indicadas, por lo que las cantidades desconocidas de producción por componente se convierten en las incógnitas x0, x1, x2. Se usa el índice cero por compatibilidad con las instrucciones Python.
Material 1 | Material 2 | Material 3 | |
---|---|---|---|
Componente 1 | 5 x0 | 9 x0 | 3 x0 |
Componente 2 | 7 x1 | 7 x1 | 16 x1 |
Componente 3 | 9 x2 | 3 x2 | 4 x2 |
Total | 945 | 987 | 1049 |
Se plantean las fórmulas a resolver:
5 x0 + 7 x1 + 9 x2 = 945 9 x0 + 7 x1 + 3 x2 = 987 3 x0 + 16 x1 + 4 x2 = 1049
Se reescriben en la forma matricial AX=B
\begin{bmatrix} 5 & 7 & 9\\ 9 & 7 & 3 \\ 3& 16 & 4\end{bmatrix} \begin{bmatrix} x_0 \\ x_1 \\ x_2 \end{bmatrix}= \begin{bmatrix} 945 \\ 987 \\ 1049 \end{bmatrix}Se reordena, pivoteando por filas para tener la matriz diagonalmente dominante:
\begin{bmatrix} 9 & 7 & 3\\ 3 & 16 & 4 \\ 5& 7 & 9\end{bmatrix} \begin{bmatrix} x_0 \\ x_1 \\ x_2 \end{bmatrix}= \begin{bmatrix} 987 \\ 1049 \\ 945 \end{bmatrix}Se determina el número de condición de la matriz, por facilidad con Python:
numero de condicion: 4.396316324708121
Obtenido con:
# 1Eva_IT2017_T4 Componentes eléctricos import numpy as np import matplotlib.pyplot as plt # INGRESO A = np.array([[9., 7.,3.], [3.,16.,4.], [5., 7.,9.]]) B = np.array([987.,1049.,945.]) # PROCEDIMIENTO # numero de condicion ncond = np.linalg.cond(A) # SALIDA print('numero de condicion:', ncond)
Recordando que la matriz debe ser tipo real, se añade un punto a los dígitos.
El número de condición es cercano a 1, por lo que el sistema si debería converger a la solución.
Desarrollo con Python
La forma AX=B permite usar los algoritmos desarrollados, obteniendo la solución. Se verifica el resultado al realizar la multiplicación de A con el vector respuesta, debe ser el vector B con un error menor al tolerado.
respuesta con Jacobi [[62.99996585] [44.99998037] [34.9999594 ]] verificando: [[ 986.99943346] [1048.99942111] [ 944.99932646]]
Si interpreta el resultado, se debe obtener solo la parte entera [63,45,35] pues las unidades producidas son números enteros.
instrucciones:
# 1Eva_IT2017_T4 Componentes eléctricos import numpy as np def jacobi(A,B,tolera,X0,iteramax=100, vertabla=False): ''' Método de Jacobi, tolerancia, vector inicial X0 para mostrar iteraciones: tabla=1 ''' tamano = np.shape(A) n = tamano[0] m = tamano[1] diferencia = np.ones(n, dtype=float) errado = np.max(diferencia) X = np.copy(X0) xnuevo = np.copy(X0) itera = 0 if vertabla==True: print('itera,[X0],errado') print(itera, xnuevo, errado) while not(errado<=tolera or itera>iteramax): for i in range(0,n,1): nuevo = B[i] for j in range(0,m,1): if (i!=j): # excepto diagonal de A nuevo = nuevo-A[i,j]*X[j] nuevo = nuevo/A[i,i] xnuevo[i] = nuevo diferencia = np.abs(xnuevo-X) errado = np.max(diferencia) X = np.copy(xnuevo) itera = itera + 1 if vertabla==True: print(itera, xnuevo, errado) # Vector en columna X = np.transpose([X]) # No converge if (itera>iteramax): X=itera print('iteramax superado, No converge') return(X) # INGRESO A = np.array([[9., 7.,3.], [3.,16.,4.], [5., 7.,9.]],dtype=float) B = np.array([987.,1049.,945.],dtype=float) tolera = 1e-4 X0 = [0.,0.,0.] # PROCEDIMIENTO # numero de condicion ncond = np.linalg.cond(A) respuesta = jacobi(A,B,tolera,X0,vertabla=True) verifica = np.dot(A,respuesta) verificaErrado = np.max(np.abs(B-np.transpose(verifica))) # SALIDA print('numero de condicion:', ncond) print('respuesta con Jacobi') print(respuesta) print('verificar A.X:') print(verifica) print('max|A.X - B|') print(verificaErrado)
al ejecutar el algoritmo se determina que se requieren 83 iteraciones para cumplir con con el valor de error tolerado.