Advertisement
Guest User

Untitled

a guest
Dec 14th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. from numpy import *
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. from matplotlib import cm
  5.  
  6. h = 0.1 # шаг
  7. tau = 0.004 # шаг по времени
  8. begin_t = 0 # начало по времени
  9. end_t = 1 # конец по времени
  10. begin_x = 0 # начало по х
  11. exp = 1 # экспонента
  12.  
  13. H, T = meshgrid(arange(begin_x, exp, h), arange(begin_t, end_t, tau)) # для построения графика
  14.  
  15. t = tau
  16. temp = 0
  17.  
  18. yavn_s = [[i + sin(pi*i) for i in arange(begin_x, exp, h)]]
  19. size = len(yavn_s[0]) # первая строчка массива
  20. sig = tau / (h ** 2) # сигма
  21. grid = math.ceil((end_t - t) / tau) # задание размеров сетки
  22. for i in range(grid):
  23. yavn_s.append([0] * size)
  24. for j in range(1, size - 1):
  25. yavn_s[temp + 1][j] = sig * yavn_s[temp][j - 1] + (1 - 2 * sig) * yavn_s[temp][j] + sig * yavn_s[temp][j + 1]
  26. yavn_s[temp + 1][0] = 0
  27. yavn_s[temp + 1][size - 1] = 1
  28. t += tau
  29. temp += 1
  30.  
  31. #Обнуляем переменные для следующей схемы
  32. temp = 0
  33. t = tau
  34.  
  35. #На каждом шаге
  36. neyavn_s = [[i + sin(pi*i) for i in arange(begin_x, exp, h)]]
  37. for k in range(grid):
  38. matrx = [[1, 0] + [0 for i in range(size - 2)]]
  39. b = [0] # правая часть матрицы
  40. l = 1
  41. for i in range(size - 2):
  42. matrx += [[0 for k in range(size)]]
  43. matrx[l][i] = -sig
  44. matrx[l][i + 1] = 1 + 2 * sig
  45. matrx[l][i + 2] = -sig
  46. b += [neyavn_s[temp][i + 1]]
  47. l += 1
  48. matrx += [[0 for i in range(size - 2)] + [0, 1]]
  49. b += [1]
  50. neyavn_s.append(list(linalg.solve(matrx, b)))
  51. temp += 1
  52. t += tau
  53.  
  54. #Обнуляем переменные для следующей схемы
  55. temp = 0
  56. t = tau
  57.  
  58.  
  59. krank = [[i + sin(pi*i) for i in arange(begin_x, exp, h)]]
  60. for k in range(grid):
  61. matrx = [[1, 0] + [0 for i in range(size - 2)]]
  62. b = [0]
  63. l = 1
  64. for i in range(size - 2):
  65. matrx += [[0 for k in range(size)]]
  66. matrx[l][i] = -sig / 2
  67. matrx[l][i + 1] = 1 + sig
  68. matrx[l][i + 2] = -sig / 2
  69. b += [krank[temp][i + 1]]
  70. l += 1
  71. matrx += [[0 for i in range(size - 2)] + [0, 1]]
  72. b += [1]
  73. krank.append(list(linalg.solve(matrx, b)))
  74. temp += 1
  75. t += tau
  76.  
  77.  
  78.  
  79. #Построение графиков
  80.  
  81. figure1 = plt.figure("Явная схема")
  82. axes1 = Axes3D(figure1)
  83. axes1.view_init(30, 60)
  84. axes1.plot_surface(H, T, array(yavn_s), cmap=cm.jet)
  85. plt.show()
  86.  
  87. figure2 = plt.figure("Неявная схема")
  88. axes2 = Axes3D(figure2)
  89. axes2.view_init(30, 60)
  90. axes2.plot_surface(H, T, array(neyavn_s), cmap=cm.jet)
  91. plt.show()
  92.  
  93. figure3 = plt.figure("Схема Кранка-Николсона")
  94. axes3 = Axes3D(figure3)
  95. axes3.view_init(30, 60)
  96. axes3.plot_surface(H, T, array(krank), cmap=cm.jet)
  97. plt.show()
  98.  
  99. real = H + exp(-pi**2*T)*sin(pi*H)
  100. figure4 = plt.figure("Настоящая")
  101. axes4 = Axes3D(figure1)
  102. axes4.view_init(30, 60)
  103. axes4.plot_surface(H, T, array(real), cmap=cm.jet)
  104. plt.show()
  105.  
  106.  
  107.  
  108. #Вывод погрешностей
  109.  
  110. print("Погрешность явной схемы: ")
  111. for i in range(len(real)):
  112. for j in range(len(real[i])):
  113. print('{0:.4f}'.format(fabs(real[i][j] - yavn_s[i][j])), end=' ')
  114. print()
  115.  
  116. print("Погрешность неявной схемы: ")
  117. for i in range(len(real)):
  118. for j in range(len(real[i])):
  119. print('{0:.4f}'.format(fabs(real[i][j] - neyavn_s[i][j])), end=' ')
  120. print()
  121.  
  122. print("Погрешность схемы Кранка-Николсона: ")
  123. for i in range(len(real)):
  124. for j in range(len(real[i])):
  125. print('{0:.4f}'.format(fabs(real[i][j] - krank[i][j])), end=' ')
  126. print()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement