Exemple #1
0
def gaussian_elimination(m):
  """
  Parameters
  ----------
  m  : list of list of floats (matrix)

  Returns
  -------  
  list of floats
      solution to the system of linear equation
  
  Raises
  ------
  ValueError
      no unique solution
  """
  # forward elimination
  n = height(m)
  for i in range(n):
    for j in range(i+1, n):
      m[j] = [m[j][k] - m[i][k]*m[j][i]/m[i][i] for k in range(n+1)]

  if m[n-1][n-1] == 0: raise ValueError('No unique solution')

  # backward substitution
  x = [0] * n
  for i in range(n-1, -1, -1):  # for i in reversed(range(n)):
    s = sum(m[i][j] * x[j] for j in range(i, n))
    x[i] = (m[i][n] - s) / m[i][i]
  return x
Exemple #2
0
def gaussian_elimination_with_pivot(m):
    """
  Parameters
  ----------
  m  : list of list of floats (matrix)

  Returns
  -------  
  list of floats
      solution to the system of linear equation
  
  Raises
  ------
  ValueError
      no unique solution
  """
    # forward elimination
    n = height(m)
    for i in range(n):
        pivot(m, n, i)
        for j in range(i + 1, n):
            m[j] = [
                m[j][k] - m[i][k] * m[j][i] / m[i][i] for k in range(n + 1)
            ]

    if m[n - 1][n - 1] == 0: raise ValueError('No unique solution')

    # backward substitution
    x = [0] * n
    for i in range(n - 1, -1, -1):
        s = sum(m[i][j] * x[j] for j in range(i, n))
        x[i] = (m[i][n] - s) / m[i][i]
    return x
Exemple #3
0
def jacobi(m, x0=None, eps=1e-5, max_iteration=100):
    n = height(m)
    x0 = [0] * n if x0 == None else x0
    x1 = [None] * n

    for __ in range(max_iteration):
        for i in range(n):
            s = sum(-m[i][j] * x0[j] for j in range(n) if i != j)
            x1[i] = (m[i][n] + s) / m[i][i]
        if all(abs(x1[i] - x0[i]) < eps for i in range(n)):
            return x1
        x0, x1 = x1, x0
    raise ValueError('Solution does not converge')
Exemple #4
0
def gauss_seidel(m, x0=None, eps=1e-5, max_iteration=100):
    n = height(m)
    x0 = [0] * n if x0 == None else x0
    x1 = x0[:]

    for __ in range(max_iteration):
        for i in range(n):
            s = sum(-m[i][j] * x1[j] for j in range(n) if i != j)
            x1[i] = (m[i][n] + s) / m[i][i]
        if all(abs(x1[i] - x0[i]) < eps for i in range(n)):
            return x1
        x0 = x1[:]
    raise ValueError("Solution does not converge")
Exemple #5
0
def jacobi(m, x0=None, eps=1e-5, max_iteration=100):
  n  = height(m)
  x0 = [0] * n if x0 == None else x0
  x1 = [None] * n
  
  for __ in range(max_iteration):
    for i in range(n):
      s = sum(-m[i][j] * x0[j] for j in range(n) if i != j)
      x1[i] = (m[i][n] + s) / m[i][i]
    if all(abs(x1[i]-x0[i]) < eps for i in range(n)):
      return x1 
    x0, x1 = x1, x0
  raise ValueError('Solution does not converge')