Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 3

import numpy as np

import copy
def readfile(file):
f =open(file, "r")
matrix=[]
for line in f:
matrix.append([int (element) for element in line.split()])
f.close()
return matrix
#check the most suitable norm
def appropriate_norm (alpha):
norm_list = []
norm_list.append(np.linalg.norm(alpha, np.inf))
norm_list.append(np.linalg.norm(alpha, 1))
norm_list.append(np.linalg.norm(alpha, 2))
if min (norm_list) >= 1:
return None
else:
for i in range(len(norm_list)):
if norm_list[i]==min (norm_list):
if i == 0:
return np.inf
else:
return i
#check row diagonal dominant
def is_row(array):
x = 1
for i in range(len(array)):
sum_row=0
for j in range(len(array)):
sum_row =sum_row + np.abs(array[i, j])
sum_row=sum_row- array [i,i]
if np.abs(array[i,i]) <= sum_row:
x = 0
return x
# check column diagonal dominant
def is_col ( array ):
x = 1
for j in range (len( array )):
sum_col = 0
for i in range (len( array )):
sum_col = sum_col + np.abs( array [i,j])
sum_col = sum_col - array [j,j]
if np.abs( array [j,j]) <= sum_col :
x = 0
return x

def jacobi (A, b, x0 , epsilon ,x1):


k = 0
A1 = copy. deepcopy (A)
b1 = copy. deepcopy (b)
if ( is_row (A) == 0) and ( is_col (A) == 0):
print (" Ma tran khong co tinh cheo troi")
elif ( is_row (A) != 0):
print ("Ma tran cheo troi hang")
for i in range (len(A)):
temp = A[i,i]
A[i ,:] = A[i ,:] / temp
b[i] = b[i] / temp
alpha = np.eye(len(A)) - A
beta = b
p = appropriate_norm ( alpha )
q = np.linalg.norm(alpha , p)
print ("chuan ",p,"=",q)
delta2 = 0
continue_loop = True
while continue_loop is True:
k = k + 1
x = alpha@x0 + beta
delta2 += np. linalg .norm ((x-alpha@x0 -beta), p)
if q*np. linalg .norm ((x-x0),p)/(1 -q) < epsilon :
continue_loop = False
else:
x0 = x
print ("Alpha = ",alpha )
print ("Beta = ",beta)
print ("x = ",x)
print ("loop =",k)
delta = np. linalg .norm ((x-x1), p)
print ("delta =",delta )
print ("delta2 =",delta2 )
print ("Ax -b = ",A1 @ x - b1)
else:
print ("Ma tran cheo troi cot")
diag = []
for j in range (len(A)):
diag. append (A[j,j])
A[:,j] = A[:,j] / diag[j]
alpha = np.eye(len(A)) - A
beta = b
p = 1
q = np. linalg .norm(alpha , p)
print (" chuan ",p,"=",q)
delta2 = 0
continue_loop = True
epsilon = epsilon *min(diag [:])
while continue_loop is True:
k = k + 1
x = alpha@x0 + beta
delta2 += np. linalg .norm ((x-alpha@x0 -beta), p)
if q*np. linalg .norm ((x-x0), np.inf)/(1 -q) <epsilon :
continue_loop = False
else:
x0 = x
for j in range (len(diag)):
x[j] = x[j]/ diag[j]
print ("Alpha = ",alpha )
print ("Beta = ",beta)
print ("x = ",x)
print ("loop =",k)
delta = np. linalg .norm ((x-x1), p)
print ("delta =",delta )
print ("delta2 =",delta2 )
print ("Ax -b =",A1 @ x - b1)
A = np.array ([[3.34 , 0.7 , 0.05] ,[0.66 , 3.03 , 0.1] ,[0.17 , 0.28 , 3.8]])
b = np. array ([[ -0.27] ,[0.14] ,[0.5]])
x0 = np. zeros ((3 ,1))
x1 = np. array ([[ -0.09595955526] ,[0.06277513949] ,[0.1312463382]])
epsilon = 1*1e-3
jacobi (A,b,x0 ,epsilon ,x1)

You might also like