3.2 Pivoteo parcial por filas con Python

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]

Referencia: Chapra 9.4.2 p268. Burden 6.2 p279. Rodríguez 4.0 p105pivoteo parcial por filas

Los métodos de solución a sistemas de ecuaciones en los primeros pasos usan la matriz aumentada y pivoteada por filas.

Como es un procedimiento usado en todos los métodos de la unidad, para simplificar se presenta como uno de los primeros algoritmos.diagonal dominante vs cima de montaña

El objetivo del pivoteo es ordenar la matriz para que en lo posible sea diagonal dominante.

|a_{i,i}| \geq \sum_{j=0 ; i\neq j}^n |a_{i,j}|

..


1. Ejercicio

Referencia: 1Eva_IIT2011_T2 Sistema de Ecuaciones, diagonal dominante

Considere el siguiente sistema de ecuaciones AX=B dado por:

\begin{cases} -2x+5y+9z=1\\7x+y+z=6\\-3x+7y-z=-26\end{cases}

Realice el pivoteo parcial por filas, de tal manera que la diagonal de A sea estrictamente dominante.

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]
..


2. Matriz Aumentada

El sistema de ecuaciones se escribe en la forma algebraica como matrices y vectores de la forma Ax=B

\begin{pmatrix} -2 & 5 & 9 \\ 7 & 1 & 1 \\-3 & 7 & -1 \end{pmatrix} \begin{pmatrix} x_0 \\ x_1 \\ x_2 \end{pmatrix} = \begin{pmatrix} 1 \\ 6 \\ -26 \end{pmatrix}

Para el algoritmo, las ecuaciones se escriben en forma de matriz A y vector B.

A = [[-2, 5, 9],
     [ 7, 1, 1],
     [-3, 7,-1]]

B = [1,6,-26]

Las matrices y vectores se procesan como arreglos np.array() de números reales. No se usan listas.

A = np.array(A,dtype=float)
B = np.array(B,dtype=float)

El vector B para la matriz aumentada se usa en forma de columna. Se aumenta una dimensión [B] y se aplica la transpuesta.

B_columna = np.transpose([B])
>>> B_columna
array([[  1],
       [  6],
       [-26]])

La matriz aumentada AB se forma al concatenar por columnas la matriz A con el vector B_columna,  usando el parámetro axis=1.

AB = np.concatenate((A,B_columna),axis=1)

el resultado AB se muestra como:

>>> AB
array([[ -2. ,  5. ,   9. ,   1.],
       [  7. ,  1. ,   1. ,   6.],
       [ -3. ,  7. ,  -1. , -26.]])
\left( \begin{array}{rrr|r} -2 & 5 & 9 & 1 \\ 7 & 1 & 1 & 6 \\ -3 & 7 & -1 & -26 \end{array} \right)

En varios algoritmos se usa la matriz aumentada AB, para mantener el orden entre filas de A y B al aplicar cambios de fila.

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]
..


3. Pivoteo parcial por filas

pivotea filas columna 0Para el pivoteo por filas de la matriz aumentada AB, tiene como primer paso revisar la primera columna, desde la posición diagonal hacia todas las filas por debajo, usando solo la magnitud de los coeficientes |A|.

La representación gráfica de la matriz A, permite visualizar los intercambios de fila.

>>> AB
array([[ -2. ,  5. ,   9. ,   1.],
       [  7. ,  1. ,   1. ,   6.],
       [ -3. ,  7. ,  -1. , -26.]])

Las instrucciones para seleccionar la columna, usar el valor absoluto y dónde se encuentra el máximo son:

columna = abs(AB[i:,i])
dondemax = np.argmax(columna)

Los valores de la columna se reducen a:

columna = [|-2.|,   fila=0
           | 7.|,   fila=1
           |-3.|]   fila=2
dondemax = 1

Si la magnitud de mayor valor no está en la diagonal (dondemax≠0), se realiza el intercambio entre la fila dondemax y la fila de la diagonal i en AB.

AB = [[  7. ,  1. ,   1. ,   6.],
      [ -2. ,  5. ,   9. ,   1.],
      [ -3. ,  7. ,  -1. , -26.]]

En éste paso se asegura que en la casilla AB[0,0] se encuentre el mayor valor de la columna 1.

El intercambio de filas requiere tres pasos: realizar una copia de la fila que se esta analizando en un vector temporal. Luego se copian los valores en la fila AB[dondemax+i] en la fila AB[i]. Finalmente actualizando la fila AB[dondemax+i] con los valores de temporal.

    if (dondemax !=0): # NO en diagonal
        # intercambia filas
        temporal = np.copy(AB[i,:])
        AB[i,:]  = AB[dondemax+i,:]
        AB[dondemax+i,:] = temporal

pivoteo por filas siguiente columnaSe repite el proceso anterior para la siguiente columna (j=1), pero siempre formada desde la diagonal (i=j).

La columna en éste paso se reduce el tamaño en una posición. Se consideran solo las magnitudes para la selección de dondemax.

AB = [[  7. ,  1. ,   1. ,   6.],
      [ -2. ,  5. ,   9. ,   1.],
      [ -3. ,  7. ,  -1. , -26.]]

Los valores de la columna se reducen a:

columna = [|5|,  fila=0
           |7|]  fila=1
dondemax = 1

En el ejercicio se encuentra que: la magnitud de mayor valor está en la fila=1, no en la diagonal. Se realiza el intercambio entre la fila ‘i’ y la fila (dondemax+i) de AB.

AB = ([[  7. ,  1. ,   1. ,   6.],
       [ -3. ,  7. ,  -1. , -26.],
       [ -2. ,  5. ,   9. ,   1.]]

pivoteo por filas completadoSe repite el proceso para la tercera columna desde la diagonal, que resulta tener solo una casilla (columna =[9]) y no ser requiere continuar.

En la gráfica se destaca el resultado del pivoteo por filas, acercando en lo posible a una matriz diagonal dominante.

Pivoteo parcial por filas AB:
[[  7. , 1. ,  1. ,   6.],
 [ -3. , 7. , -1. , -26.],
 [ -2. , 5. ,  9. ,   1.]]
A:
[[ 7. , 1. , 1.],
[ -3. , 7. , -1.],
[ -2. , 5. , 9.]]
B:
[6. , -26. , 1.]

Tarea: Revisar cuando en una columna se tiene dos valores mayores de igual valor. Ampliar el algoritmo. Considere como ejemplo del caso planteado: 1Eva_IT2011_T2_MN Alimentos para animales

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]
..


4. Algoritmo en Python

Para realizar el algoritmo, es de recordar que para realizar operaciones en una matriz sin alterar la original, se usa una copia de la matriz (np.copy).  Con la copia de la matriz, se puede comparar y observar los cambios entre la matriz original y la copia a la que se aplicaron cambios.

Si no es necesaria la comparación entre el antes y después, no se realiza la copia y se ahorra el espacio de memoria, detalle importante para matrices de «gran tamaño» y una computadora con «limitada» memoria.

# Pivoteo parcial por filas
import numpy as np

# INGRESO
A = [[-2, 5, 9],
     [ 7, 1, 1],
     [-3, 7,-1]]
B = [1,6,-26]

# PROCEDIMIENTO
# Matrices como arreglo, numeros reales
A = np.array(A,dtype=float)
B = np.array(B,dtype=float)

# Matriz aumentada AB
B_columna = np.transpose([B])
AB  = np.concatenate((A,B_columna),axis=1)
AB0 = np.copy(AB) # copia de AB

# Pivoteo parcial por filas
tamano = np.shape(AB)
n = tamano[0]
m = tamano[1]

# Para cada fila en AB
for i in range(0,n-1,1):
    # columna desde diagonal i en adelante
    columna = abs(AB[i:,i])
    dondemax = np.argmax(columna)
    
    if (dondemax !=0): # NO en diagonal
        # intercambia filas
        temporal = np.copy(AB[i,:])
        AB[i,:]  = AB[dondemax+i,:]
        AB[dondemax+i,:] = temporal
# Actualiza A y B pivoteado
A = AB[:,:n]
B = AB[:,n]

# SALIDA
print('Matriz aumentada:')
print(AB0)
print('Pivoteo parcial por filas AB:')
print(AB)
print('A:')
print(A)
print('B:')
print(B)

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]
..


5. Función pivoteafila(M)

Los bloques de cada procedimiento que se repiten en otros métodos se convierten a funciones def-return, empaquetando las soluciones algorítmicas.

# Pivoteo parcial por filas, funcion
import numpy as np

def pivoteafila(A,B,vertabla=False):
    '''
    Pivoteo parcial por filas, entrega matriz aumentada AB
    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,
                      'con', dondemax+i)
    if vertabla==True:
        if pivoteado==0:
            print('  Pivoteo por filas NO requerido')
        else:
            print(AB)
    return(AB)

# INGRESO
A = [[-2, 5, 9],
     [ 7, 1, 1],
     [-3, 7,-1]]
B = [1,6,-26]

# PROCEDIMIENTO
AB = pivoteafila(A,B,vertabla=True)
n = len(AB)

# Actualiza A y B pivoteado
A = AB[:,:n]
B = AB[:,n]

# SALIDA
print('Pivoteo parcial por filas AB:')
print(AB)
print('A:')
print(A)
print('B:')
print(B)

El resultado del ejercicio es:

Matriz aumentada
[[ -2.   5.   9.   1.]
 [  7.   1.   1.   6.]
 [ -3.   7.  -1. -26.]]
Pivoteo parcial:
  1 intercambiar filas:  0 con 1
  2 intercambiar filas:  1 con 2
[[  7.   1.   1.   6.]
 [ -3.   7.  -1. -26.]
 [ -2.   5.   9.   1.]]
Pivoteo parcial por filas AB:
[[  7.   1.   1.   6.]
 [ -3.   7.  -1. -26.]
 [ -2.   5.   9.   1.]]
A:
[[ 7.  1.  1.]
 [-3.  7. -1.]
 [-2.  5.  9.]]
B:
[  6. -26.   1.]

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]


6. Gráfica de Matriz A en 3D

Instrucciones para la gráfica en 3D de una matriz A. Las alturas de las barras son relativas a los valores de la casilla A[i,j]

# Matriz A como Barras3D
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
##A = [[-2, 5, 9],
##     [ 7, 1, 1],
##     [-3, 7,-1]]
##titulo = 'matriz A'

##A = [[ 7, 1, 1],
##     [-2, 5, 9],
##     [-3, 7,-1]]
##titulo = 'A pivotea fila0 y fila1'

##A = [[ 7, 1, 1],
##     [-3, 7,-1],
##     [-2, 5, 9]]
##titulo = 'A pivotea fila1 y fila2'

A = [[ 7, 1, 1],
     [-3, 7,-1],
     [-2, 5, 9]]
titulo='A: Pivoteo por Filas'

# PROCEDIMIENTO
A = np.array(A, dtype=float)
n,m = np.shape(A)

# para grafica 3D
xi = np.arange(0,n,1)
yj = np.arange(0,m,1)
Xi,Yj = np.meshgrid(xi,yj)

A_min = np.min([np.min(A),-3])
A_max = np.max([np.max(A),9])

# SALIDA
# Grafica barras 3D
fig3D = plt.figure()
graf3D = fig3D.add_subplot(111,projection='3d')

AT = np.transpose(A) # filas en x, columnas en y
h = 0.5 # Barras ancho y profundidad
color_A = AT.ravel()/A_max
color_ij = plt.cm.rainbow(color_A)

graf3D.bar3d(Xi.ravel(),Yj.ravel(),
             np.zeros(n*m),h,h,
             AT.ravel(),color=color_ij)

# escala eje z
graf3D.set_zlim(A_min,A_max)
# etiqueta
graf3D.set_xlabel('filas i')
graf3D.set_ylabel('columnas j')
graf3D.set_zlabel('A[i,j]')
graf3D.set_title(titulo)
# etiquetas ejes
graf3D.xaxis.set_ticks(xi + h/2)
graf3D.xaxis.set_ticklabels(xi)
graf3D.yaxis.set_ticks(yj + h/2)
graf3D.yaxis.set_ticklabels(yj)
# Barra de color
color_escala = plt.Normalize(A_min,A_max)
color_barra = plt.cm.ScalarMappable(norm=color_escala,
                cmap=plt.colormaps["rainbow"])
fig3D.colorbar(color_barra,ax=graf3D,label="A[i,j]")

graf3D.view_init(35,35)
plt.show()

 

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]


7. Ejercicio 2

Referencia: Rodríguez 4.0 p105,  1Eva_IT2010_T3_MN Precio artículosvende frutas

Ejemplo 1. Un comerciante compra tres productos A, B, C, pero en las facturas únicamente consta la cantidad comprada en Kg y el valor total de la compra.

Se necesita determinar el precio unitario de cada producto.  Dispone de solo tres facturas con los siguientes datos:

Ejemplo:
Cantidad Valor ($)
Factura X0 X1 X2 Pagado
1 4 2 5 60.70
2 2 5 8 92.90
3 5 4 3 56.30

Los precios unitarios se pueden representar por las variables x0, x1, x2 para escribir el sistema de ecuaciones que muestran las relaciones de cantidad, precio y valor pagado:

\begin{cases} 4x_0+2x_1+5x_2 = 60.70 \\ 2x_0+5x_1+8x_2 = 92.90 \\ 5x_0+4x_1+3x_2 = 56.30 \end{cases}

Desarrollo

El sistema de ecuaciones se escribe en la forma algebraica como matrices y vectores de la forma Ax=B

\begin{pmatrix} 4 & 2 & 5 \\ 2 & 5 & 8 \\5 & 4 & 3 \end{pmatrix} \begin{pmatrix} x_0 \\ x_1 \\ x_2 \end{pmatrix} = \begin{pmatrix} 60.70 \\ 92.90 \\ 56.30 \end{pmatrix}

La matriz aumentada usando el algoritmo tiene como resultado:

>>> AB
array([[ 4. ,  2. ,  5. , 60.7],
       [ 2. ,  5. ,  8. , 92.9],
       [ 5. ,  4. ,  3. , 56.3]])

En varios algoritmos se usa la matriz aumentada AB, para mantener el orden entre filas al aplicar cambios de fila.

Para el pivoteo por fila de la matriz aumentada AB, tiene como primer paso revisar la primera columna desde la diagonal en adelante.

>>> AB
array([[ 4. ,  2. ,  5. , 60.7],
       [ 2. ,  5. ,  8. , 92.9],
       [ 5. ,  4. ,  3. , 56.3]])

Los valores de la columna se reducen a:

columna = [|4|,   fila=0
           |2|,   fila=1
           |5|]   fila=2
dondemax = 2

En el ejercicio se encuentra que: la magnitud de mayor valor está en la última fila, no en la diagonal. Se realiza el intercambio entre la fila 2 y la fila 0 de AB.

AB = [[ 5. ,  4. ,  3. , 56.3],
      [ 2. ,  5. ,  8. , 92.9],
      [ 4. ,  2. ,  5. , 60.7]]

Se repite el proceso anterior para la siguiente columna, pero siempre formada desde la diagonal.

AB = [[ 5. ,  4. ,  3. , 56.3],
      [ 2. ,  5. ,  8. , 92.9],
      [ 4. ,  2. ,  5. , 60.7]]

Los valores de la columna se reducen a:

columna = [|5|,  fila=0
           |2|]  fila=1
dondemax = 0

Como la posición dondemax es la primera, índice 0, se determina que ya está en la diagonal de AB y no es necesario realizar el intercambio de filas.

Se repite el proceso para la tercera columna desde la diagonal, que resulta tener solo una casilla (columna =[5]) y no ser requiere continuar.

El resultado del pivoteo por fila se muestra a continuación:

Pivoteo parcial por filas AB:
[[ 5.   4.   3.  56.3]
 [ 2.   5.   8.  92.9]
 [ 4.   2.   5.  60.7]]
A:
[[5. 4. 3.]
 [2. 5. 8.]
 [4. 2. 5.]]
B:
[56.3 92.9 60.7]

[ Ejercicio ] [ Matriz Aumentada ] [ Pivoteo filas ] [ algoritmo ] [ función ]

3.1 Sistema de ecuaciones 3×3, planos 3D con Python

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]

Referencia: Chapra 9.1 p247Plano Ecuaciones 3x3 animado
Como punto de partida para la unidad de sistema de ecuaciones, se usa un ejemplo para ilustrar la solución del sistema en gráficos para 3 ecuaciones y 3 incógnitas.

La solución es un punto de intersección de los planos en el espacio dados por cada ecuación en el sistema.

La intersección entre dos planos es una recta, que al añadir un plano adicional la intersección es un punto. Las coordenadas del punto es la solución buscada.

Para representar lo indicado, se realiza el desarrollo analítico del ejercicio junto al algoritmo y las gráficas en 3D con Python y Matplotlib.

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]
..


1. Ejercicio

Referencia: 1Eva_IIT2011_T2 Sistema de Ecuaciones, diagonal dominante

Considere el siguiente sistema de ecuaciones AX=B dado por:

\begin{cases} -2x+5y+9z=1\\7x+y+z=6\\-3x+7y-z=-26\end{cases}

Se pueden representar como planos en el espacio despejando la variable z para cada ecuación, de la forma:

\begin{cases} z=(1+ 2x - 5y)/9\\z=(6 -7x-y)/1\\z=(-26+3x-7y)/(-1)\end{cases}

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]
..


2. Desarrollo analítico. Ecuaciones como Planos en el espacio

Para diferenciar las ecuaciones, se añade el índice por filas i a cada una:

\begin{cases}f_0(x,y) : z=(1+ 2x - 5y)/9\\f_1(x,y) : z=(6 -7x-y)/1\\f_2(x,y) : z=(-26+3x-7y)/(-1)\end{cases}

Si observamos la primera ecuación en una gráfica, encontramos que para realizar el plano se requiere definir los intervalos para los ejes X, Y, por ejemplo:

-5 ≤ x ≤ 5
-7 ≤ y ≤ 7

Plano Ecuaciones 3x3 animado 0

Al combinar los planos Z0 y Z1, encontramos que la solución al sistema es la recta intersección de ambos planos.

Plano Z0 Z1

Usando la tercera ecuación, la intersección de los planos genera un punto cuyas coordenadas corresponden a la solución del sistema.

Plano Z0 Z1 Z2

Recta intersección de planos Z0 y Z1

Usando solo las dos primeras ecuaciones y considerando para el eje ‘y’ una constante, por ejemplo el lado izquierdo del intervalo ya.

\begin{cases} -2x+5y_a+9z=1\\7x+y_a+z=6\end{cases}

Se reordenan las ecuaciones y reemplazan valores:

\begin{cases} -2x+9z=1-5y_a\\7x+z=6-y_a\end{cases} \begin{cases} -2x+9z=1-5(-7)\\7x+z=6-(-7)\end{cases}

Al resolver las ecuaciones se encuentra un punto de la recta de intersección, del lado izquierdo del intervalo para el eje y. Se aplica el mismo proceso para el lado derecho del intervalo del eje ‘y‘ y se tienen las coordenadas:

array([[ 1.24615385, -7.        ,  4.27692308],
       [ 0.38461538,  7.        , -3.69230769]])

Con las que se puede trazar la línea de intersección entre los planos Z0 y Z1

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]
..


3. Algoritmo con Python

Para observar el sistema de ecuaciones en un gráfico de tres dimensiones, se utilizan gráficas 3D  y observar los resultados con varios puntos de vista al rotar el gráfico con el cursor.

Para el algoritmo, las ecuaciones del sistema se escriben en forma matricial Ax=B.

\begin{cases} -2x+5y+9z=1\\7x+y+z=6\\-3x+7y-z=-26\end{cases}

A es una matriz de coeficientes cuadrada, el número de filas es igual al de columnas. B es un vector de constantes, con el mismo número de elementos que filas de A.

# INGRESO Ax=B
A = [[-2, 5, 9],
     [ 7, 1, 1],
     [-3, 7,-1]]

B = [1,6,-26]

Las ecuaciones de cada plano escriben usando los coeficientes de A y B, según lo realizado en el desarrollo analítico al despejar la variable z. Cada ecuación es una expresión de dos variables (x,y), para simplificar se usa el formato lambda x,y.

# Ecuaciones de planos
f0 = lambda x,y: (B[0]-A[0,0]*x-A[0,1]*y)/A[0,2]
f1 = lambda x,y: (B[1]-A[1,0]*x-A[1,1]*y)/A[1,2]
f2 = lambda x,y: (B[2]-A[2,0]*x-A[2,1]*y)/A[2,2]

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]

..

3.1 Intervalos, muestras para cada eje en los vectores xi, yj

Para la gráfica 3D se requiere usar intervalos para las variables independientes x,y de forma semejante a las gráficas en 2D. En cada intervalo se realizaran muestras en varios puntos del intervalo. La combinación de muestras en cada eje, generan puntos en el plano X,Y.

Se generan las muestras para cada eje en los vectores xi, yj

xa = -5    # Intervalo [xa,xb] para eje x
xb = 5
ya = 7     # Intervalo [ya,yb] para eje y
yb = -7
muestras = 11

xi = np.linspace(xa,xb, muestras)
yj = np.linspace(ya,yb, muestras)

el resultado de las muestras en cada eje para el ejercicio es:

>>> xi
array([-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.])
>>> yj
array([-7. , -5.6, -4.2, -2.8, -1.4,  0. ,  1.4,  2.8,  4.2,  5.6,  7. ])
>>> 

Las combinaciones entre las muestras de cada eje se realizan en las matrices Xi,Yj, (en mayúsculas).

Xi, Yj = np.meshgrid(xi,yj)

Cada matriz representa una malla de puntos en el plano, usando luego cada punto para evaluar el valor de Z. El resultado son las matrices con los puntos de evaluación en la malla. Por ejemplo el primer punto [x0,y0] = [-5,-7]:

>>> Xi
array([[-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.],
       [-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.]])
>>> Yj
array([[-7. , -7. , -7. , -7. , -7. , -7. , -7. , -7. , -7. , -7. , -7. ],
       [-5.6, -5.6, -5.6, -5.6, -5.6, -5.6, -5.6, -5.6, -5.6, -5.6, -5.6],
       [-4.2, -4.2, -4.2, -4.2, -4.2, -4.2, -4.2, -4.2, -4.2, -4.2, -4.2],
       [-2.8, -2.8, -2.8, -2.8, -2.8, -2.8, -2.8, -2.8, -2.8, -2.8, -2.8],
       [-1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 1.4,  1.4,  1.4,  1.4,  1.4,  1.4,  1.4,  1.4,  1.4,  1.4,  1.4],
       [ 2.8,  2.8,  2.8,  2.8,  2.8,  2.8,  2.8,  2.8,  2.8,  2.8,  2.8],
       [ 4.2,  4.2,  4.2,  4.2,  4.2,  4.2,  4.2,  4.2,  4.2,  4.2,  4.2],
       [ 5.6,  5.6,  5.6,  5.6,  5.6,  5.6,  5.6,  5.6,  5.6,  5.6,  5.6],
       [ 7. ,  7. ,  7. ,  7. ,  7. ,  7. ,  7. ,  7. ,  7. ,  7. ,  7. ]])
>>> 

La matriz de resultados Zi, se genera al evaluar una ecuación en cada punto (ij). Como hay una ecuación por cada fila, se usa el índice para diferenciar cada resultado Zi.

Z0 = f0(Xi,Yj)
Z1 = f1(Xi,Yj)
Z2 = f2(Xi,Yj)

El gráfico del plano Z0, se realiza con las matrices Xi,Yj, con la instrucción plot_wireframe(Xi,Yj,Z0) de las librerías 3D. Luego se repite el procedimiento para Z1 y Z2.

graf3D.plot_wireframe(Xi,Yj,Z0,
                      color ='blue',
                      label='Z0')

Si es necesario, revise la sección de Gráficas 3D para wireframe.

Para simplicidad del algoritmo, pues la revisión del concepto es sobre intersección de planos, la solución se obtiene con la librería Numpy.

punto = np.linalg.solve(A,B)

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]
..


4. Instrucciones con Python

# Sistema de ecuaciones 3x3
# Interseccion de Planos
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

# INGRESO Ax=B
A = [[-2, 5, 9],
     [ 7, 1, 1],
     [-3, 7,-1]]
B = [1,6,-26]

xa = -5     # Intervalo Xi ,[ax,bx]
xb = 5
ya = -7     # Intervalo Yj ,[ay,by]
yb = 7
muestras = 11 # en cada intervalo

# PROCEDIMIENTO
# matriz y vector como Numpy
A = np.array(A,dtype=float)
B = np.array(B,dtype=float)

# solucion al sistema
punto = np.linalg.solve(A,B)

# Interseccion entre ecuacion Z0 y Z1
A01  = np.copy(A[0:2,[0,2]])
# usando ay, extremo izquierdo eje y
B01  = B[0:2] - ya*A[0:2,1]
x01 = np.linalg.solve(A01,B01)
recta01 = [x01[0],ya,x01[1]]  # tabla coordenadas
# usando by, extremo derecho eje y
B01 = B[0:2] - yb*A[0:2,1]
x01 = np.linalg.solve(A01,B01)
recta01 = np.concatenate(([recta01 ],
                  [[x01[0],yb,x01[1]]]),
                  axis=0)

# ecuaciones de planos
f0 = lambda x,y: (B[0]-A[0,0]*x-A[0,1]*y)/A[0,2]
f1 = lambda x,y: (B[1]-A[1,0]*x-A[1,1]*y)/A[1,2]
f2 = lambda x,y: (B[2]-A[2,0]*x-A[2,1]*y)/A[2,2]

# muestras
xi = np.linspace(xa,xb, muestras)
yj = np.linspace(ya,yb, muestras)
Xi, Yj = np.meshgrid(xi,yj) # en plano XY

# evalua planos Zi
Z0 = f0(Xi,Yj)
Z1 = f1(Xi,Yj)
Z2 = f2(Xi,Yj)

# SALIDA
print('respuesta de A.X=B : ')
print(punto)

# GRAFICA 3D
fig3D = plt.figure()
graf3D = fig3D.add_subplot(111, projection='3d')

# Planos
graf3D.plot_wireframe(Xi,Yj,Z0,
                       color ='blue',
                       label='Z0')
graf3D.plot_wireframe(Xi,Yj,Z1,
                       color ='orange',
                       label='Z1')
graf3D.plot_wireframe(Xi,Yj,Z2,
                       color ='green',
                       label='Z2')

# recta entre planos Z0 y Z1
graf3D.plot(recta01[:,0],recta01[:,1], recta01[:,2],
            color='purple',
            label='recta01',linewidth=4)

# Punto solucion Z0,Z1,Z2
graf3D.plot(punto[0],punto[1],punto[2],
            'o',color='red',
            label='Punto',linewidth=6)

# etiquetas y entorno gráfico
graf3D.set_title('Sistema de ecuaciones 3x3')
graf3D.set_xlabel('x')
graf3D.set_ylabel('y')
graf3D.set_zlabel('z')
graf3D.set_xlim(xa, xb)
graf3D.set_ylim(ya, yb)
graf3D.legend()
graf3D.view_init(45, 45) # elevacion, azimut

### rotacion de ejes
##for angulo in range(45, 360+45, 5 ):
##    graf3D.view_init(45, angulo)
##    plt.draw()
##    plt.pause(.1)

plt.show()

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]


Referencia: Dear linear algebra students, This is what matrices (and matrix manipulation) really look like. Zach Star. 5 mar 2020.

Ejemplo: [ ejercicio ] [ analítico ] [ algoritmo ] [ Python ]