Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.80 KB | None | 0 0
  1. import math
  2.  
  3. N = 1000
  4.  
  5. EPS = 1e-4
  6.  
  7. ALPHA = 0.01
  8. BETA = 10
  9.  
  10.  
  11. def mul(bottom, middle, top, x):
  12. ret = [0] * N
  13.  
  14. for i in range(N):
  15. ret[i] = middle[i] * x[i]
  16. if i > 0:
  17. ret[i] += bottom[i] * x[i - 1]
  18. if i < N - 1:
  19. ret[i] += top[i] * x[i + 1]
  20.  
  21. return ret
  22.  
  23.  
  24. def diff(u, v):
  25. return [u[i] - v[i] for i in range(N)]
  26.  
  27.  
  28. def norm(u):
  29. return math.sqrt(sum(x * x for x in u))
  30.  
  31.  
  32. def universal_solver(bottom, middle, top, f, x, tau=None):
  33. ret_e = []
  34. inv = [1.0 / w for w in middle]
  35. Ax = mul(bottom, middle, top, x)
  36. r0 = norm(diff(Ax, f))
  37. while True:
  38. if tau is not None:
  39. Ax = mul(bottom, middle, top, x)
  40. Ax = [tau * w for w in Ax]
  41. else:
  42. Ax = mul([0] * N, inv, [0] * N, mul(bottom, middle, top, x))
  43.  
  44. r = norm(diff(Ax, f))
  45. e = r / r0
  46.  
  47. ret_e.append(e)
  48. if e < EPS:
  49. break
  50.  
  51. x = [x[i] + (f[i] - Ax[i]) for i in range(N)]
  52.  
  53. return ret_e, x
  54.  
  55.  
  56. def draw(x, y):
  57. index_x = [i + 1 for i in range(len(x))]
  58. plt.plot(index_x, x)
  59. plt.show()
  60.  
  61. index_y = [i + 1 for i in range(len(y))]
  62. plt.plot(index_y, y)
  63. plt.show()
  64.  
  65.  
  66. def main():
  67. tau = 0.1651512666112257
  68. bottom = [-1] * N
  69. top = [-1] * N
  70. middle = [2 + ALPHA] * N
  71. middle[0] = 2 + BETA
  72. x = [0] * N
  73.  
  74. f = [1 if 494 <= i < 505 else 0 for i in range(N)]
  75. f_tau = [tau * w for w in f]
  76. inv_f = [1.0 / middle[i] if 494 <= i < 505 else 0 for i in range(N)]
  77.  
  78. mti_e, mti_x = universal_solver(bottom, middle, top, f_tau, [0] * N, tau)
  79. jacobi_e, jacobi_x = universal_solver(bottom, middle, top, inv_f, x)
  80.  
  81. draw(mti_e, mti_x)
  82. draw(jacobi_e, jacobi_x)
  83.  
  84.  
  85. if __name__ == '__main__':
  86. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement