<jupyter_start><jupyter_text>Lo siguiente está basado en el capítulo 2 y apéndice del libro de texto de <NAME>iusalas Numerical Methods in Engineering with Python 3 y el libro de Matrix Analysis and Applied Linear Algebra de <NAME>. **Se sugiere haber revisado la sección 1.5 del libro de texto de J. Kiusalas Numerical Methods in Engineering with Python 3: uso de numpy**  Sistemas de ecuaciones lineales En general son de la forma: $$\begin{array}{ccc} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n  &= & b_1 \\ a_{21}x_1 + a_{22}x_2 +  \cdots + a_{2n}x_n &= & b_2 \\ \vdots & & \\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n &=& b_m \end{array}$$ donde: las $x_i$'s son las incógnitas y las $a_i$'s y $b_i$'s son constantes conocidas. Las entradas $a_{ij}$'s son llamadas coeficientes del sistema y el conjunto de $b_i$'s se le llama lado derecho del sistema. Si todas las $b_i$'s son iguales a $0$ el sistema se le nombra **homogéneo**. **3 posibilidades para solución del sistema anterior:*** Una única solución: sólo existe uno y sólo un conjunto de valores de $x_i$'s que satisfacen todas las ecuaciones simultáneamente y el sistema se nombra **consistente** o **no singular**.* Ninguna solución: no existe ningún conjunto de valores de $x_i$'s que satisfacen todas las ecuaciones simultáneamente (el conjunto solución es vacío) y el sistema se nombra **inconsistente** o singular.* Infinitas soluciones: hay una infinidad de conjuntos (distintos) de valores de las $x_i$'s que satisfacen todas las ecuaciones simultáneamente. **obs:** si un sistema tiene más de una solución entonces tiene una infinidad de soluciones y el sistema se nombra **consistente** o **no singular**.  Interpretación geométrica Resolver un sistema de ecuaciones lineales equivale a encontrar la intersección entre rectas, planos o hiperplanos (2,3 o n dimensiones respectivamente). Por ejemplo para un caso de dos dimensiones se tiene: ![image](https://drive.google.com/uc?export=view&id=0B66Kmqpqr3IQdHlOQk9LOWxZQ0VINVd6SlFELWdjR0c3d2lz) El inciso a) representa un sistema de ecuaciones lineales sin solución, el inciso b) infinitas soluciones (en el dibujo ligeramente se desplazó hacia abajo una de las rectas para mostrar ambas) y el inciso c) una única solución.   Algoritmos Existen una gran cantidad de algoritmos para resolver los sistemas de ecuaciones. Típicamente se elige el algoritmo de acuerdo a las características de los coeficientes.Los hay iterativos y directos o basados en factorizaciones matriciales. Entre los directos o basados en factorizaciones matriciales se encuentran:* Eliminación Gaussiana o factorización LU.* Factorización de Cholesky.* Factorización QR.* Descomposición en valores singulares.y como ejemplo de los iterativos están:* Jacobi.* Gauss-Seidel.* Gradiente conjugado.  Algoritmos directos o basados en factorizaciones matriciales Los algoritmos directos encuentran sistemas de ecuaciones equivalentes a partir de operaciones básicas del álgebra lineal. **Obs:** dos sistemas de ecuaciones lineales son equivalentes si tienen el mismo conjunto solución.  Ejemplos de uso de los paquetes numpy y scipy para resolver ecuaciones lineales 1)Resolver: $$\begin{array}{ccc} 8x_1 -6x_2 + 2x_3  &= & 28 \\ -4x_1 + 11x_2 -7x_3 &= & -40 \\ 4x_1 -7x_2 + 6x_3 &=& 33\end{array} $$<jupyter_code>import numpy as np
import pprint
A = np.array([[8, -6, 2], [-4, 11, -7], [4, -7, 6]])
b = np.array([28,-40,33])
print('A:')
pprint.pprint(A)
print('b:')
pprint.pprint(b)
x=np.linalg.solve(A,b)
print('x:')
pprint.pprint(x)
print('Verificando resultado Ax = b')
print('b:')
pprint.pprint(b)
print('Ax:')
pprint.pprint(A@x)<jupyter_output>Verificando resultado Ax = b
b:
array([ 28, -40,  33])
Ax:
array([ 28., -40.,  33.])<jupyter_text>2) Resolver $Ax = B$  $$\begin{array}{l}\begin{array}{ccc}6x_1-4x_2+x_3&=&\\-4x_1+6x_2-4x_3&=&\\x_1-4x_2+6x_3&=&\end{array}\left[\begin{array}{cc}-14 & 22\\36 & -18\\6 & 7\end{array}\right] \end{array}$$<jupyter_code>import numpy as np
import pprint
A = np.array([[6,-4,1], [-4,6,-4], [1,-4,6]])
B = np.array([[-14,22],[36,-18],[6,7]])
print('A:')
pprint.pprint(A)
print('B:')
pprint.pprint(B)
X=np.linalg.solve(A,B)
print('X:')
pprint.pprint(X)
print('Verificando resultado AX = B')
print('B:')
pprint.pprint(B)
print('AX:')
pprint.pprint(A@X)<jupyter_output>Verificando resultado AX = B
B:
array([[-14,  22],
       [ 36, -18],
       [  6,   7]])
AX:
array([[-14.,  22.],
       [ 36., -18.],
       [  6.,   7.]])<jupyter_text>3) Obtener los factores $P, L, U$ de la matriz $A$: $$A = \begin{bmatrix} 2& -1&2 \\ 1& 6& -1 \\ 1& 4& 1\end{bmatrix}$$  y utilizarlos para resolver $Ax = B$ con $$B=\begin{bmatrix}7 & -1\\13 & 6\\5 & 7\end{bmatrix}$$<jupyter_code>import scipy
import scipy.linalg 
import numpy as np
import pprint
A = scipy.array([[2,-1,2], [1,6,-1], [1,4,1]])
P, L, U = scipy.linalg.lu(A)

print('A:')
pprint.pprint(A)
print('P:')
pprint.pprint(P)
print('L:')
pprint.pprint(L)
print('U:')
pprint.pprint(U)

print('Verificando que es igual PA al producto LU')
print('L*U:')
pprint.pprint(L@U)
print('P*A')
pprint.pprint(P@A)
print('Usando los factores P,L,U para resolver AX = B')
B = scipy.array([[7,-1],[13,6],[5,7]])
D = scipy.linalg.solve_triangular(L,P@B,lower=True)
X = scipy.linalg.solve_triangular(U,D) #default es usar una triangular superior
print('X:')
pprint.pprint(X)
print('Verificando resultado AX = B')
print('B:')
pprint.pprint(B)
print('AX:')
pprint.pprint(A@X)<jupyter_output>Verificando resultado AX = B
B:
array([[ 7, -1],
       [13,  6],
       [ 5,  7]])
AX:
array([[ 7., -1.],
       [13.,  6.],
       [ 5.,  7.]])
{'fraction_non_alphanumeric': 0.1473533619456366, 'fraction_numerical': 0.03683834048640915, 'mean_word_length': 4.760041194644696, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 12, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '446162', 'license': 'Apache-2.0', 'n_tokens_mistral': 2355, 'n_tokens_neox': 2226, 'n_words': 662, 'path': 'Python/clases/3_algebra_lineal/1_ecuaciones_lineales.ipynb', 'repo_name': 'IvanSalgadoVel/Propedeutico', 'size': '5595'}