You are on page 1of 15

class-4-naive-gauss-elimination

February 10, 2024

1 𝑁 𝑎𝑖𝑣𝑒 𝐺𝑎𝑢𝑠𝑠 𝐸𝑙𝑖𝑚𝑖𝑛𝑎𝑡𝑖𝑜𝑛 [𝐴](𝑋) = (𝐵)


1.1 System of Linear equations:
$\ 3x_{1}-0.1x_{2}-0.2x_{3}=7.85\ 0.1x_{1} +7x_{2}-0.3x_{3}=-19.3\ 0.3x_{1}-0.2x_{2}-
10x_{3}=71.4 $

1.1.1 Matrix Formulation


[1]: Matrix_A = [
[3.0 , -0.1, -0.2],
[0.1 , 7.0, -0.3],
[0.3 , -0.2 , -10.0]
]
Matrix_A

[1]: [[3.0, -0.1, -0.2], [0.1, 7.0, -0.3], [0.3, -0.2, -10.0]]

[2]: Matrix_B = [
[7.85],
[-19.3],
[71.4]
]
Matrix_B

[2]: [[7.85], [-19.3], [71.4]]

[3]: import numpy as np


print(np.array(Matrix_A))
print()
print(np.array(Matrix_B))

[[ 3. -0.1 -0.2]
[ 0.1 7. -0.3]
[ 0.3 -0.2 -10. ]]

[[ 7.85]
[-19.3 ]
[ 71.4 ]]

1
1.1.2 Forward Elimination ( Manually going diagonally )

[4]: import numpy as np

Matrix_A = [
[3.0, -0.1, -0.2],
[0.1, 7.0, -0.3],
[0.3, -0.2, -10.0]
]

n,m = np.shape(np.array(Matrix_A))

Matrix_A2 = [Matrix_A[0]]

k = 0
for i in range(k + 1,n):
a = []
for j in range(m):
frac = Matrix_A[i][k] / Matrix_A[k][k]
a_ij = Matrix_A[i][j] - frac * Matrix_A[k][j]
a.append(a_ij)
Matrix_A2.append(a)

print(np.array(Matrix_A2))
print()

Matrix_A3 = [Matrix_A2[0], Matrix_A2[1]]

k = 1
for i in range(k + 1,n):
a = []
for j in range(m):
frac = Matrix_A2[i][k] / Matrix_A2[k][k]
a_ij = Matrix_A2[i][j] - frac * Matrix_A2[k][j]
a.append(a_ij)
Matrix_A3.append(a)

print(np.array(Matrix_A3))

[[ 3. -0.1 -0.2 ]
[ 0. 7.00333333 -0.29333333]
[ 0. -0.19 -9.98 ]]

[[ 3. -0.1 -0.2 ]
[ 0. 7.00333333 -0.29333333]
[ 0. 0. -9.98795812]]

2
1.1.3
1.2 Forward Elimination
[5]: import numpy as np

Matrix_A = [
[3.0, -0.1, -0.2],
[0.1, 7.0, -0.3],
[0.3, -0.2, -10.0]
]

Matrix_B = [
[7.85],
[-19.3],
[71.4]
]

n,m = np.shape(np.array(Matrix_A))

for k in range(n-1): ␣
↪ # k goes diagonaly
for j in range(k+1,n): ␣
↪ # j goes downwards
frac = Matrix_A[j][k] / Matrix_A[k][k]

for i in range(k,m): ␣
↪ # i goes sideways
Matrix_A[j][i] = Matrix_A[j][i] - frac * Matrix_A[k][i]

Matrix_B[j][0] = Matrix_B[j][0] - frac*Matrix_B[k][0]

print(np.array(Matrix_A),"\n")

print("\nFinal Upper Triangular Matrix A is\n")


print(np.array(Matrix_A))
print("\nMatrix B is \n\n",np.array(Matrix_B))

[[ 3. -0.1 -0.2 ]
[ 0. 7.00333333 -0.29333333]
[ 0.3 -0.2 -10. ]]

[[ 3. -0.1 -0.2 ]
[ 0. 7.00333333 -0.29333333]
[ 0. -0.19 -9.98 ]]

[[ 3. -0.1 -0.2 ]
[ 0. 7.00333333 -0.29333333]

3
[ 0. 0. -9.98795812]]

Final Upper Triangular Matrix A is

[[ 3. -0.1 -0.2 ]
[ 0. 7.00333333 -0.29333333]
[ 0. 0. -9.98795812]]

Matrix B is

[[ 7.85 ]
[-19.56166667]
[ 70.08429319]]

1.3 Backward Substitution


[6]: Matrix_X = [
[0],
[0],
[0]
]
Matrix_X[n-1][0]= Matrix_B[n-1][0]/Matrix_A[n-1][n-1]
print("Matrix X -\n\n",np.array(Matrix_X))
print()

for i in range(n-2,-1,-1): #␣
↪reverse order

summ = 0
for j in range(i+1,m):
summ = summ + Matrix_A[i][j]*Matrix_X[j][0]
print("sum = ",summ,"\n")
Matrix_X[i][0] = (Matrix_B[i][0]-summ)/Matrix_A[i][i]
print(np.array(Matrix_X))
print()

Matrix X -

[[ 0. ]
[ 0. ]
[-7.01687896]]

sum = 2.0582844961646662

[[ 0. ]
[-3.08709441]
[-7.01687896]]

4
sum = 0.30870944068773926

sum = 1.7120852335272845

[[ 2.04597159]
[-3.08709441]
[-7.01687896]]

1.4 Check if AX=B


[7]: Matrix_A = [
[3.0, -0.1, -0.2],
[0.1, 7.0, -0.3],
[0.3, -0.2, -10.0]
]
Matrix_B = [
[7.85],
[-19.3],
[71.4]
]

C = np.dot(np.array(Matrix_A),np.array(Matrix_X))
print("Product of A and X =\n\n",C,'\n\nB Matrix = \n\n',np.array(Matrix_B))

Product of A and X =

[[ 7.85]
[-19.3 ]
[ 71.4 ]]

B Matrix =

[[ 7.85]
[-19.3 ]
[ 71.4 ]]

3 Pivoting
[8]: # I am using numpy array this time instead of list ........ Both are mutable i.
↪e they can be modified unlike tuples.

import numpy as np

_A_ = np.array([

5
[0, -0.1, -0.2],
[0.1, 0, -0.3],
[0.3, -0.2, -10.0]
])

_B_ = np.array([
[7.85],
[-19.3],
[71.4]
])

n,m = np.shape(_A_)

for k in range(n-1):
for j in range(k+1,n):
frac = _A_[j,k] /_A_[k,k]
for i in range(k,m):
_A_[j,i] = _A_[j,i] - frac *_A_[k,i]

_B_[i,0] = _B_[i,0] - frac*_B_[k,0]

print(np.array(_A_),"\n")

print("\nFinal Upper Triangular Matrix A is\n")


print(np.array(_A_))
print("\nMatrix B is \n\n",np.array(_B_))

[[ 0. -0.1 -0.2]
[ nan inf inf]
[ 0.3 -0.2 -10. ]]

[[ 0. -0.1 -0.2]
[ nan inf inf]
[ nan inf inf]]

[[ 0. -0.1 -0.2]
[ nan inf inf]
[ nan nan nan]]

Final Upper Triangular Matrix A is

[[ 0. -0.1 -0.2]
[ nan inf inf]
[ nan nan nan]]

Matrix B is

6
[[ 7.85]
[-19.3 ]
[ nan]]
C:\Users\asus\AppData\Local\Temp\ipykernel_3504\1876914903.py:21:
RuntimeWarning: divide by zero encountered in scalar divide
frac = _A_[j,k] /_A_[k,k]
C:\Users\asus\AppData\Local\Temp\ipykernel_3504\1876914903.py:23:
RuntimeWarning: invalid value encountered in scalar multiply
_A_[j,i] = _A_[j,i] - frac *_A_[k,i]
C:\Users\asus\AppData\Local\Temp\ipykernel_3504\1876914903.py:21:
RuntimeWarning: invalid value encountered in scalar divide
frac = _A_[j,k] /_A_[k,k]

3.1 To avoid these undetermined terms we use Pivoting �


[14]: # I used array but I found its better to use list for calculations and then␣
↪print them into array.

import numpy as np

_A_ = [
[0, -0.2, -0.2],
[0.2, 0, -0.3],
[0.3, -0.1, 0]
]

A = np.array(_A_).copy()

_B_ = [
[7.85],
[-19.34],
[71.4]
]
B = np.array(_B_).copy()

n,m = np.shape(np.array(_A_))

def Pivot(_A_,_B_,k):
for j in range(k+1,n):
if abs(_A_[j][k]) > abs(_A_[k][k]):
_A_[j],_A_[k] = _A_[k],_A_[j]
_B_[j],_B_[k] = _B_[k],_B_[j]
return

for k in range(n-1):
for j in range(k+1,n):

7
if _A_[k][k] < 1e-5: # Pivoting␣
↪inside j loop
print(f"\nOrig A = \n\n{np.array(_A_)}")
Pivot(_A_,_B_,k)
print(f"\nPivoted A = \n\n{np.array(_A_)}\n")

frac = _A_[j][k] /_A_[k][k]


for i in range(k,m):
_A_[j][i] = _A_[j][i] - frac *_A_[k][i]

_B_[j][0] = _B_[j][0] - frac*_B_[k][0] # we should␣


↪be using j because we want to skip ...
# changing␣
↪first row of B Matrix

print("\nFinal Upper Triangular Matrix A is\n")


print(np.array(_A_))
print("\nMatrix B is \n\n",np.array(_B_))

Matrix_X = [
[0],
[0],
[0]
]

Matrix_X[n-1][0] = _B_[n-1][0]/_A_[n-1][n-1]
print("\n\n�Matrix X�\n\n",np.array(Matrix_X))
print()

for k in range(n-2,-1,-1):
summ = 0
for i in range(k+1,n):
summ = summ + _A_[k][i]*Matrix_X[i][0]
Matrix_X[k][0] = (_B_[k][0] - summ)/_A_[k][k]
print("\n\n Matrix X = \n\n",np.array(Matrix_X))
print()

C = np.dot(np.array(A),np.array(Matrix_X))
print("---------------------------------------\n\nProduct of A and X␣
↪=\n\n",C,'\n\nB Matrix = \n\n',np.array(B))

Orig A =

[[ 0. -0.2 -0.2]
[ 0.2 0. -0.3]

8
[ 0.3 -0.1 0. ]]

Pivoted A =

[[ 0.3 -0.1 0. ]
[ 0. -0.2 -0.2]
[ 0.2 0. -0.3]]

Orig A =

[[ 0.3 -0.1 0. ]
[ 0. -0.2 -0.2 ]
[ 0. 0.06666667 -0.3 ]]

Pivoted A =

[[ 0.3 -0.1 0. ]
[ 0. -0.2 -0.2 ]
[ 0. 0.06666667 -0.3 ]]

Final Upper Triangular Matrix A is

[[ 0.3 -0.1 0. ]
[ 0. -0.2 -0.2 ]
[ 0. 0. -0.36666667]]

Matrix B is

[[ 71.4 ]
[ 7.85 ]
[-64.32333333]]

�Matrix X�

[[ 0. ]
[ 0. ]
[175.42727273]]

Matrix X =

[[ 0. ]
[-214.67727273]
[ 175.42727273]]

9
Matrix X =

[[ 166.44090909]
[-214.67727273]
[ 175.42727273]]

---------------------------------------

Product of A and X =

[[ 7.85]
[-19.34]
[ 71.4 ]]

B Matrix =

[[ 7.85]
[-19.34]
[ 71.4 ]]

3.2

4 Gauss Jordan Elimination


[25]: import numpy as np

A = [
[3,-0.1,-0.2],
[0.1,7,-0.3],
[0.3,-0.2,-10]
]
A_=np.array(A).copy()

B = [
[7.85],
[-19.3],
[71.4]
]
B_=np.array(B).copy()

n,m = np.shape(np.array(A))

10
for k in range(n): # Notice I have changed the range of k from␣
↪(0,n-1) to (0,n) for norm. It will not affect j loop.

print(f"\nNormalization of Row {k+1} Pivot of Matrix A -\n") ␣


↪ # Normalization of Pivot Row

for pivot_row_element in range(k+1,n):


A[k][pivot_row_element] = A[k][pivot_row_element]/A[k][k]

B[k][0] = B[k][0]/A[k][k]
A[k][k] = A[k][k]/A[k][k]

print(np.array(A))
print("\n\nMatrix B -\n\n",np.array(B),"\n\
——————————————————————————————————————————\n\n")

for j in range(k+1,n): ␣
↪ # forward elimination
frac = A[j][k]/A[k][k]

for i in range(k,m):
A[j][i] = A[j][i]-frac*A[k][i]

B[j][0] = B[j][0]-frac*B[k][0]

print("\n\n�Matrix A�\n\n",np.array(A),
"\n\n�Matrix B�\n\n",np.array(B),
"\n----------------------------------------\n\n")

print("Backward Elimination of Matrix A -")


for p in range(n-1,-1,-1): ␣
↪ # backward elimination
for q in range(p-1,-1,-1):
fract = A[q][p]

for r in range(p,-1,-1):
A[q][r] = A[q][r] - fract*A[p][r]

B[q][0]=B[q][0]-fract*B[p][0]

print(f"\n{np.array(A)}")
print(f"\n\nMatrix B = Matrix X =\n\n{np.array(B)}\n")

X = B

11
C = np.dot(np.array(A_),np.array(X)) ␣
↪ # Check AX=B
print("\n=========================================\
\n\nProduct of A and X =\n\n",C,'\n\nB Matrix = \n\n',np.array(B_))

if (np.array(C)).all()==(np.array(B)).all():
print("\n ���")
else:
print("\n �")

Normalization of Row 1 Pivot of Matrix A -

[[ 1. -0.03333333 -0.06666667]
[ 0.1 7. -0.3 ]
[ 0.3 -0.2 -10. ]]

Matrix B -

[[ 2.61666667]
[-19.3 ]
[ 71.4 ]]
——————————————————————————————————————————

�Matrix A�

[[ 1. -0.03333333 -0.06666667]
[ 0. 7.00333333 -0.29333333]
[ 0.3 -0.2 -10. ]]

�Matrix B�

[[ 2.61666667]
[-19.56166667]
[ 71.4 ]]
----------------------------------------

�Matrix A�

12
[[ 1. -0.03333333 -0.06666667]
[ 0. 7.00333333 -0.29333333]
[ 0. -0.19 -9.98 ]]

�Matrix B�

[[ 2.61666667]
[-19.56166667]
[ 70.615 ]]
----------------------------------------

Normalization of Row 2 Pivot of Matrix A -

[[ 1. -0.03333333 -0.06666667]
[ 0. 1. -0.04188482]
[ 0. -0.19 -9.98 ]]

Matrix B -

[[ 2.61666667]
[-2.79319372]
[70.615 ]]
——————————————————————————————————————————

�Matrix A�

[[ 1. -0.03333333 -0.06666667]
[ 0. 1. -0.04188482]
[ 0. 0. -9.98795812]]

�Matrix B�

[[ 2.61666667]
[-2.79319372]
[70.08429319]]
----------------------------------------

Normalization of Row 3 Pivot of Matrix A -

[[ 1. -0.03333333 -0.06666667]

13
[ 0. 1. -0.04188482]
[ 0. 0. 1. ]]

Matrix B -

[[ 2.61666667]
[-2.79319372]
[-7.01687896]]
——————————————————————————————————————————

Backward Elimination of Matrix A -

[[ 1. -0.03333333 -0.06666667]
[ 0. 1. 0. ]
[ 0. 0. 1. ]]

[[ 1. -0.03333333 0. ]
[ 0. 1. 0. ]
[ 0. 0. 1. ]]

[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

Matrix B = Matrix X =

[[ 2.04597159]
[-3.08709441]
[-7.01687896]]

=========================================

Product of A and X =

[[ 7.85]
[-19.3 ]
[ 71.4 ]]

B Matrix =

[[ 7.85]
[-19.3 ]
[ 71.4 ]]

14
���

[ ]:

[ ]:

[ ]:

[ ]:

[ ]:

15

You might also like