Advertisement
pochti_da

Untitled

Dec 20th, 2020
613
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.02 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. from copy import deepcopy
  4. from math import sqrt
  5.  
  6. def Gauss(A, f):
  7.     n = len(A)
  8.  
  9.     for i in range(n):
  10.         for j in range(i, n):
  11.             if (A[j][i] != 0):
  12.                 A[i], A[j] = A[j][:], A[i][:]
  13.                 f[i], f[j] = f[j], f[i]
  14.                 break
  15.  
  16.         for k in range(i + 1, n):
  17.             A[i][k] /= A[i][i]
  18.         f[i] /= A[i][i]
  19.         A[i][i] = 1
  20.  
  21.         for j in range(i + 1, n):
  22.             for k in range(i + 1, n):
  23.                 A[j][k] -= A[i][k] * A[j][i]
  24.             f[j] -= f[i] * A[j][i]
  25.             A[j][i] = 0
  26.  
  27.     for i in range(n - 1, -1, -1):
  28.         for j in range(i - 1, -1, -1):
  29.             f[j] -= f[i] * A[j][i]
  30.             A[j][i] = 0
  31.  
  32. def GaussMax(A, f):
  33.     n = len(A)
  34.     permutations = []
  35.  
  36.     for i in range(n):
  37.         max_ind = i
  38.         for j in range(i, n):
  39.             if (abs(A[i][j]) > abs(A[i][max_ind])):
  40.                 max_ind = i
  41.  
  42.         for k in range(n):
  43.             A[k][i], A[k][max_ind] = A[k][max_ind], A[k][i]
  44.         permutations.append([i, max_ind])
  45.  
  46.         for k in range(i + 1, n):
  47.             A[i][k] /= A[i][i]
  48.             f[i] /= A[i][i]
  49.         A[i][i] = 1
  50.  
  51.         for j in range(i + 1, n):
  52.             for k in range(i + 1, n):
  53.                 A[j][k] -= A[i][k] * A[j][i]
  54.             f[j] -= f[i] * A[j][i]
  55.             A[j][i] = 0
  56.  
  57.     for i in range(n - 1, -1, -1):
  58.         for j in range(i - 1, -1, -1):
  59.             f[j] -= f[i] * A[j][i]
  60.             A[j][i] = 0
  61.  
  62.     for perm in permutations:
  63.         f[perm[0]], f[perm[1]] = f[perm[1]], f[perm[0]]
  64.  
  65. def Det(A_orig):
  66.     n = len(A_orig)
  67.     A = deepcopy(A_orig)
  68.  
  69.     for i in range(n):
  70.         for j in range(i, n):
  71.             if (A[j][i] != 0):
  72.                 A[i], A[j] = A[j][:], A[i][:]
  73.                 break
  74.  
  75.         for j in range(i + 1, n):
  76.             for k in range(i + 1, n):
  77.                 A[j][k] = A[j][k] * A[i][i] - A[i][k] * A[j][i]
  78.             A[j][i] = 0
  79.  
  80.     res = 1
  81.     for i in range(n):
  82.         res *= A[i][i]
  83.  
  84.     return res
  85.  
  86. def MakeI(n):
  87.     I = [0] * n
  88.     for i in range(n):
  89.         I[i] = [0] * n
  90.         I[i][i] = 1
  91.  
  92.     return I
  93.  
  94. def Inv(A_orig):
  95.     n = len(A_orig)
  96.     A, I = deepcopy(A_orig), MakeI(n)
  97.  
  98.     for i in range(n):
  99.         for j in range(i, n):
  100.             if (A[j][i] != 0):
  101.                 A[i], A[j] = A[j][:], A[i][:]
  102.                 I[i], I[j] = I[j][:], I[i][:]
  103.                 break
  104.  
  105.         for k in range(i + 1, n):
  106.             A[i][k] /= A[i][i]
  107.         for k in range(n):
  108.             I[i][k] /= A[i][i]
  109.         A[i][i] = 1
  110.  
  111.         for j in range(i + 1, n):
  112.             for k in range(i + 1, n):
  113.                 A[j][k] -= A[i][k] * A[j][i]
  114.             for k in range(n):
  115.                 I[j][k] -= I[i][k] * A[j][i]
  116.             A[j][i] = 0
  117.  
  118.     for i in range(n - 1, -1, -1):
  119.         for j in range(i - 1, -1, -1):
  120.             for k in range(n):
  121.                 I[j][k] -= I[i][k] * A[j][i]
  122.             A[j][i] = 0
  123.  
  124.     return I
  125.  
  126. def MatrixNorm(A):
  127.     n = 0
  128.    
  129.     for i in range(len(A)):
  130.         for j in range(len(A[i])):
  131.             n += a[i][j]**2
  132.    
  133.     return sqrt(n)
  134.  
  135. def ConditionNumber(A):
  136.     return MatrixNorm(A) * MatrixNorm(Inv(A))
  137.  
  138. def IterMethod(A, f, w, EPS):
  139.     n = len(A)
  140.     x = [0] * n
  141.  
  142.     invANorm = MatrixNorm(Inv(A))
  143.     iterCnt = 0
  144.  
  145.     while (True):
  146.         for i in range(n):
  147.             sum = 0
  148.             for j in range(n):
  149.                 sum += A[i][j] * x[j]
  150.  
  151.             sum = w * (sum - f[i]) / A[i][i]
  152.             x[i] -= sum
  153.  
  154.         nev = [0] * n
  155.         for i in range(n):
  156.             for j in range(n):
  157.                 nev[i] += A[i][j] * x[j]
  158.             nev[i] -= f[i]
  159.  
  160.         nevNorm = 0
  161.         for i in range(n):
  162.             nevNorm += nev[i]**2
  163.         nevNorm = sqrt(nevNorm)
  164.  
  165.         iterCnt += 1
  166.         err = invANorm * nevNorm
  167.         if (err < EPS):
  168.             return x, iterCnt
  169.  
  170. a = [[1, -1], [1, 1]]
  171. f = [-1, 1]
  172.  
  173. print(IterMethod(a, f, 0.5, 0.0001))
  174.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement