s1Eva_IIT2011_T2_AN Sistema de Ecuaciones, diagonal dominante

para resolver, se usa:

A = np.array([[-2, 5, 9],
              [ 7, 1, 1],
              [-3, 7,-1]])
B = np.array([1,6,-26])

debiendo notar que el vector B se encuentra en forma de fila, no de columna.
Para crear la matriz aumentada se usa B en forma de columna.

Para el pivoteo parcial por filas, se usa la matriz aumentada.

Para aplicar el algoritmo de Gauss-Seidel desarrollado, se debe actualizar A y B desde la matriz aumentada a la que se aplicó pivoteo parcial.

El resto es semejante al procedimento de Gauss-Seidel, obteniendo la respuesta de:

matriz aumentada con diagonal dominante: 
[[  7   1   1   6]
 [ -3   7  -1 -26]
 [ -2   5   9   1]]
nuevas matrices: 
[[ 7  1  1]
 [-3  7 -1]
 [-2  5  9]]
[  6 -26   1]
respuesta: 
[[ 1.00000245]
 [-2.99999785]
 [ 1.99999935]]
>>> 

Algoritmo desarrollado por partes:

# 1ra Evaluación II Término 2011
# Tema 2. sistema de ecuaciones
# Desarrolla: diagonal estrictamente dominante
#             Gauss-Seidel
# Vector B se ingresa como fila, luego de convierte a columna

import numpy as np

# INGRESO
A = np.array([[-2, 5, 9],
              [ 7, 1, 1],
              [-3, 7,-1]])
B = np.array([1,6,-26])

# PROCEDIMIENTO
# convierte B a columna
B = np.transpose([B])
# matriz aumentada
aumentada = np.concatenate((A,B), axis=1)
tamano = np.shape(aumentada)
n = tamano[0]
m = tamano[1]
# Diagonal estrictamente dominante
i = 0
while not(i>=(n-1)):
    columna = np.abs(aumentada[i:,i])
    dondemax = np.argmax(columna)
    if (dondemax != 0):
        temporal = np.copy(aumentada[i,:])
        aumentada[i,:] = aumentada[dondemax+i,:]
        aumentada[dondemax+i,:] = temporal
    i=i+1

# Separa matriz aumentada para forma estandar A.X=B
ultima = m-1
penultima = m-2
# antes de última
A = aumentada[:,:ultima]
# solo última columna
B = aumentada[:,ultima] 

# Método GAUSS-SEIDEL
# el ejercicio indica vector X inicia con ceros
# puede ser otro vector
X = np.zeros(n, dtype=float)
tolera = 1e-4

# Método Gauss-Seidel
iteramax = 100
tamano = np.shape(A)
n = tamano[0]
m = tamano[1]
diferencia = np.ones(n, dtype=float)
errado = np.max(diferencia)

itera = 0
while (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]
        diferencia[i] = np.abs(nuevo-X[i])
        X[i] = nuevo
    errado = np.max(diferencia)
    itera = itera + 1
# Vector en columna
X =  np.transpose([X])
# No converge
if (itera>iteramax):
    X=0

respuesta = X
# SALIDA
print('matriz aumentada con diagonal dominante: ')
print(aumentada)
print('nuevas matrices: ')
print(A)
print(B)
print('respuesta: ')
print(respuesta)