Eliminasi Gauss-Jordan dengan Python
Eliminasi Gauss-Jordan dengan Python
Masukkan matrik A, dan vektor B beserta ukurannya n
Buat augmented matrik [A|B] namakan dengan A
Untuk baris ke i dimana i=1 s/d n, perhatikan apakah nilai ai,i =0 : Bila iya, maka tukarkan baris ke i dan baris ke i+k≤n, dimana ai+k ,i ≠0,
bila tidak ada berarti perhitungan tidak bisa dilanjutkan dan proses dihentikan dengan tanpa penyelesaian. Bila tidak, maka lanjutkan
Untuk baris ke j, dimana j = i+1 s/d n
Coding Python
#python 2.7.15
#Nama = Muhammad Ikhwan Fathulloh
#Kelas = TIF RP19C
#NPM = 19552011024
#Mata Kuliah = Metode Numerik
#Nama = Muhammad Ikhwan Fathulloh
#Kelas = TIF RP19C
#NPM = 19552011024
#Mata Kuliah = Metode Numerik
#Eliminasi Gauss Jordan
def idMatx(size):
id = []
for i in range(size):
id.append([0]*size)
for i in range(size):
id[i][i] = 1
return(id)
def idMatx(size):
id = []
for i in range(size):
id.append([0]*size)
for i in range(size):
id[i][i] = 1
return(id)
def tranMtx(inMtx):
tMtx = []
for row in range(0, len(inMtx[0])):
tRow = []
for col in range(0, len(inMtx)):
ele = inMtx[col][row]
tRow.append(ele)
tMtx.append(tRow)
return(tMtx)
tMtx = []
for row in range(0, len(inMtx[0])):
tRow = []
for col in range(0, len(inMtx)):
ele = inMtx[col][row]
tRow.append(ele)
tMtx.append(tRow)
return(tMtx)
def matxRound(matx, decPts=4):
for col in range(len(matx)):
for row in range(len(matx[0])):
matx[col][row] = round(matx[col][row], decPts)
for col in range(len(matx)):
for row in range(len(matx[0])):
matx[col][row] = round(matx[col][row], decPts)
#Pemecahan (Solver)
def gj_Solve(A, b=False, decPts=4):
""" A gauss-jordan method to solve an augmented matrix for
the unknown variables, x, in Ax = b.
The degree of rounding is 'tuned' by altering decPts = 4.
In the case where b is not supplied, b = ID matrix, and therefore
the output is the inverse of the A matrix.
"""
""" A gauss-jordan method to solve an augmented matrix for
the unknown variables, x, in Ax = b.
The degree of rounding is 'tuned' by altering decPts = 4.
In the case where b is not supplied, b = ID matrix, and therefore
the output is the inverse of the A matrix.
"""
if not b == False:
#pertama, tes untuk memastikan bahwa A dan b sudah sesuai
if (len(A) != len(b)):
print 'A dan b asinkron'
return
Ab = A[:]
Ab.append(b)
m = tranMtx(Ab)
else:
ii = idMatx(len(A))
Aa = A[:]
for col in range(len(ii)):
Aa.append(ii[col])
tAa = tranMtx(Aa)
m = tAa[:]
#pertama, tes untuk memastikan bahwa A dan b sudah sesuai
if (len(A) != len(b)):
print 'A dan b asinkron'
return
Ab = A[:]
Ab.append(b)
m = tranMtx(Ab)
else:
ii = idMatx(len(A))
Aa = A[:]
for col in range(len(ii)):
Aa.append(ii[col])
tAa = tranMtx(Aa)
m = tAa[:]
(eqns, colrange, augCol) = (len(A), len(A), len(m[0]))
# Permutasi Matrix - bawa angka terbesar ke diagonal
# Ambil baris pertama, asumsikan x [1,1] adalah yang terbesar, dan tukar jika itu tidak benar
for col in range(0, colrange):
bigrow = col
for row in range(col+1, colrange):
if abs(m[row][col]) > abs(m[bigrow][col]):
bigrow = row
(m[col], m[bigrow]) = (m[bigrow], m[col])
print 'Soal SPL = ', m
# Ambil baris pertama, asumsikan x [1,1] adalah yang terbesar, dan tukar jika itu tidak benar
for col in range(0, colrange):
bigrow = col
for row in range(col+1, colrange):
if abs(m[row][col]) > abs(m[bigrow][col]):
bigrow = row
(m[col], m[bigrow]) = (m[bigrow], m[col])
print 'Soal SPL = ', m
# Kurangi, sehingga baris terakhir paling banyak tidak diketahui
for rrcol in range(0, colrange):
for rr in range(rrcol+1, eqns):
cc = -(float(m[rr][rrcol])/float(m[rrcol][rrcol]))
for j in range(augCol):
m[rr][j] = m[rr][j] + cc*m[rrcol][j]
for rrcol in range(0, colrange):
for rr in range(rrcol+1, eqns):
cc = -(float(m[rr][rrcol])/float(m[rrcol][rrcol]))
for j in range(augCol):
m[rr][j] = m[rr][j] + cc*m[rrcol][j]
# Reduksi final - tes pertama menangkap sistem yang tidak ditentukan
# Ini dicirikan oleh beberapa persamaan yang semuanya nol
for rb in reversed(range(eqns)):
if ( m[rb][rb] == 0):
if m[rb][augCol-1] == 0:
continue
else:
print 'Sistem tidak bisa diselesaikan'
return
else:
# Mengulang kembali untuk menangkap sistem yang tidak ditentukan
for backCol in reversed(range(rb, augCol)):
m[rb][backCol] = float(m[rb][backCol]) / float(m[rb][rb])
# Knock-up (batalkan yang di atas untuk menghilangkan yang diketahui)
# Lagi, kita harus mengulang untuk menangkap sistem yang tidak ditentukan
if not (rb == 0):
for kup in reversed(range(rb)):
for kleft in reversed(range(rb, augCol)):
kk = -float(m[kup][rb]) / float(m[rb][rb])
m[kup][kleft] += kk*float(m[rb][kleft])
# Ini dicirikan oleh beberapa persamaan yang semuanya nol
for rb in reversed(range(eqns)):
if ( m[rb][rb] == 0):
if m[rb][augCol-1] == 0:
continue
else:
print 'Sistem tidak bisa diselesaikan'
return
else:
# Mengulang kembali untuk menangkap sistem yang tidak ditentukan
for backCol in reversed(range(rb, augCol)):
m[rb][backCol] = float(m[rb][backCol]) / float(m[rb][rb])
# Knock-up (batalkan yang di atas untuk menghilangkan yang diketahui)
# Lagi, kita harus mengulang untuk menangkap sistem yang tidak ditentukan
if not (rb == 0):
for kup in reversed(range(rb)):
for kleft in reversed(range(rb, augCol)):
kk = -float(m[kup][rb]) / float(m[rb][rb])
m[kup][kleft] += kk*float(m[rb][kleft])
matxRound(m, decPts)
if not b == False:
return m
else:
mOut = []
for row in range(len(m)):
rOut = []
for col in range(augCol/2, augCol):
rOut.append(m[row][col])
mOut.append(rOut)
return mOut
# Uji Soal SPL ini
return m
else:
mOut = []
for row in range(len(m)):
rOut = []
for col in range(augCol/2, augCol):
rOut.append(m[row][col])
mOut.append(rOut)
return mOut
# Uji Soal SPL ini
A = [[-1,2,1],
[1,2,1],
[2,1,-1]]
[1,2,1],
[2,1,-1]]
b = [5,5,1]
#Solusi
sol = gj_Solve(A, b)
print 'Solusi Gauss Jordan = ', sol
sol = gj_Solve(A, b)
print 'Solusi Gauss Jordan = ', sol
1 1 -1 1
2 2 1 5
-1 1 2 5
Output SPL Gauss Jordan
Soal SPL = [[2, 2, 1, 5], [-1, 1, 2, 5], [1, 1, -1, 1]]
Solusi Gauss Jordan = [[1.0, 0.0, 0.0, -0.5], [0.0, 1.0, 0.0, 2.5], [0.0, 0.0, 1.0, 1.0]]
Komentar
Posting Komentar