Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.32 KB | None | 0 0
  1. __author__ = 'true'
  2. import numpy as np
  3. import scipy as sp
  4.  
  5.  
  6. def lu_decomposition(a):
  7.     m, n = a.shape
  8.     l = np.zeros((m, m))
  9.     u = np.zeros((m, m))
  10.     for i in range(n):
  11.         for j in range(n):
  12.             u[i][j] = a[i][j]
  13.  
  14.     for i in range(n):
  15.         for j in range(i, n):
  16.             try:
  17.                 l[j][i] = u[j][i] / u[i][i]
  18.             except ZeroDivisionError:
  19.                 print("Деление на ноль!")
  20.  
  21.     for k in range(1, n):
  22.         for i in range(k - 1, n):
  23.             for j in range(i, n):
  24.                 try:
  25.                     l[j][i] = u[j][i] / u[i][i]
  26.                 except ZeroDivisionError:
  27.                     print("Деление на ноль")
  28.         for i in range(k, n):
  29.             for j in range(k - 1, n):
  30.                 u[i][j] -= l[i][k - 1] * u[k - 1][j]
  31.  
  32.     return l, u
  33.  
  34.  
  35. def lu_solve(a, b):
  36.     if a.shape[0] != len(b):
  37.         raise ValueError("Размеры входных массивов не совпадают!")
  38.     l, u = lu_decomposition(a)
  39.     n = a.shape[0]
  40.     y = np.zeros(n)
  41.     for i in range(n):
  42.         y[i] = b[i]
  43.         for j in range(i):
  44.             y[i] -= y[j] * l[i][j]
  45.     x = np.zeros(n)
  46.     for i in reversed(range(n)):
  47.         x[i] = y[i]
  48.         for j in range(i + 1, n):
  49.             x[i] -= u[i][j] * x[j]
  50.         x[i] /= u[i][i]
  51.     return x
  52.  
  53.  
  54. # A = np.array([[12, -51, 4], [6, 167, -68], [-4, 24, -41]])
  55. A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
  56.  
  57. Q, R = np.linalg.qr(A)
  58.  
  59. print("numpy QR")
  60. print("Q:")
  61. print(Q)
  62. print("R:")
  63. print(R)
  64.  
  65.  
  66. def house(x):
  67.     n = len(x)
  68.     mu = np.linalg.norm(x, 2)
  69.     result = np.zeros(n)
  70.     np.copyto(result, x)
  71.     if mu != 0:
  72.         beta = x[0] + np.sign(x[0]) * mu
  73.         result[1:n] = result[1:n] / beta
  74.     result[0] = 1
  75.     print("HOUSE:", result)
  76.     return result
  77.  
  78.  
  79. def row_house(a, v):
  80.     beta = -2 / np.dot(v.T, v)
  81.     print("BETA", beta)
  82.     w = beta * np.dot(a.T, v)
  83.     print("W:", w)
  84.     print("ADDITION:", np.dot(v, w.T))
  85.     return a + np.dot(v, w.T)
  86.  
  87.  
  88. m, n = A.shape
  89.  
  90. V = np.zeros(m)
  91. for j in range(n):
  92.     V[j:m] = house(A[j:m, j])
  93.     A[j:m, j:n] = row_house(A[j:m, j:n], V[j:m])
  94.     if j < m:
  95.         A[j + 1:m, j] = V[j + 1:m]
  96.     print("j:",j)
  97.     print("A:")
  98.     print(A)
  99.  
  100. print("\nГолуб:")
  101. print(A)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement