Advertisement
PrincePepper

Untitled

Jan 18th, 2022
632
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import math
  2. from random import randint
  3. import matplotlib.pyplot as plt
  4.  
  5. # граничные значения
  6. x_max = 30
  7. t_max = 150
  8. # размер матрицы
  9. x_n = 300
  10. t_n = 1000
  11. # Шаг по координате, по времени и список просчитанных шагов
  12. h = x_max / x_n
  13. print("Шаг:", h)
  14. tau = t_max / t_n
  15. print("tau:", h)
  16. # Скорость
  17. v = 0.05
  18. print('u * tau / h:', v * tau / h)
  19.  
  20.  
  21. def draw(c, t_i, list_boarder, method):
  22.     plt.figure(figsize=(12, 4))
  23.     plt.grid(True)
  24.     plt.xlabel('X')
  25.     plt.ylabel('C, концентрация')
  26.     plt.xlim(list_boarder[0:2])
  27.     plt.ylim(list_boarder[2:4])
  28.     plt.title(f'Метод: {method}')
  29.     x_i = [i * h for i in range(x_n + 1)]
  30.     # сортировка tau и его графика по возрастанию
  31.     x = zip(c, t_i)
  32.     xs = sorted(x, key=lambda tup: tup[1])
  33.     c = [x[0] for x in xs]
  34.     tau = [x[1] for x in xs]
  35.     for t in range(len(c)):
  36.         plt.plot(x_i, c[t])
  37.     plt.legend([f't={t}' for t in tau])
  38.     plt.savefig(f'Figure_{method}.png')
  39.     plt.show()
  40.  
  41.  
  42. # гладкая функция
  43. def f1(x):
  44.     return math.sin(x)
  45.  
  46.  
  47. # негладкая функция
  48. def f2(x):
  49.     if x < x_max / 3:
  50.         return 0.8
  51.     return 0.0
  52.  
  53.  
  54. def get_grid(f):
  55.     x = [i * h for i in range(0, x_n + 1)]
  56.     c = [[0 for _ in range(x_n + 1)] for _ in range(t_n + 1)]
  57.     c[0] = list(map(f, x))
  58.     return c
  59.  
  60.  
  61. # метод конечных разностей
  62. def MethodFinite(f):
  63.     c = get_grid(f)
  64.     for t in range(len(c) - 1):
  65.         for x in range(1, len(c[t]) - 1):
  66.             c[t + 1][x] = c[t][x] - (tau * v / h) * (c[t][x] - c[t][x - 1])
  67.     return c
  68.  
  69.  
  70. # метод чахорды
  71. def MethodLeapfrog(f):
  72.     c = get_grid(f)
  73.     for x in range(1, x_n - 1):
  74.         c[1][x] = c[0][x] - (tau * v / h) * (c[0][x] - c[0][x - 1])
  75.     for t in range(1, t_n - 1):
  76.         for x in range(1, x_n - 1):
  77.             c[t + 1][x] = c[t - 1][x] - (tau * v / h) * (c[t][x + 1] - c[t][x - 1])
  78.     return c
  79.  
  80.  
  81. # метод центральных разностей
  82. def MethodCentral(f):
  83.     c = get_grid(f)
  84.     for t in range(t_n - 1):
  85.         for x in range(1, x_n - 1):
  86.             c[t + 1][x] = c[t][x] - ((tau * v) / (2 * h)) * (c[t][x + 1] - c[t][x - 1])
  87.     return c
  88.  
  89.  
  90. def render(f, method: int, list_boarder: list, n_graph=0):
  91.     if method == 0:
  92.         c = MethodFinite(f)
  93.         name = 'конечных разностей'
  94.     elif method == 1:
  95.         c = MethodLeapfrog(f)
  96.         name = 'чихарда'
  97.     else:
  98.         c = MethodCentral(f)
  99.         name = 'центральных разностей'
  100.     if n_graph == 0:
  101.         draw(c[::int(t_n / 4)], [int(i * t_max / 4) for i in range(4)], list_boarder,
  102.              name)
  103.     else:
  104.         # кол-во графиков в отрисовке через рандомайзер
  105.         val_i = [randint(0, x_n) for i in range(n_graph - 1)]
  106.         print('Шаг:', h)
  107.         c_i = [c[0]]
  108.         t_i = [0]
  109.         for i in val_i:
  110.             c_i.append(c[i])
  111.             t_i.append(i * t_max / t_n)
  112.         draw(c_i, t_i, list_boarder, name)
  113.  
  114.  
  115. render(f1, 0, [0, x_max, -1.1, 1.1])
  116. render(f1, 1, [0, x_max, -1.1, 1.1])
  117. render(f1, 2, [0, x_max, -1.1, 1.1])
  118. render(f2, 0, [0, x_max, -0.5, 1.3])
  119. render(f2, 1, [0, x_max, -0.5, 1.3])
  120. render(f2, 2, [0, x_max, -0.5, 1.3])
  121.  
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement