Eliminasi Gauss-Jordan dengan Python

Eliminasi Gauss-Jordan dengan Python


Algoritma
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
#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 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)
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)
#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.
  """
  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[:]
  (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
  # 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]
  # 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])
  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
A = [[-1,2,1],
     [1,2,1],
     [2,1,-1]]
b = [5,5,1]
#Solusi
sol = gj_Solve(A, b)
print 'Solusi Gauss Jordan = ', sol

Soal SPL
 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

Trendingkanlah

"Aplikasi data anggota perpustakaan serta transaksi peminjaman dengan RFID dan Wemos ESP8266 berbasis Internet of Things."

Aplikasi Pendataan Status Covid19 pada Masyarakat Bandung | Dengan java gui Arraylist | tanpa database

Menjadi Agen Pembangunan dengan pendekatan Rumus Fisika Energi Mekanik

Kebenaran yang bersifat Aksioma