Advertisement
575

numlab2

575
Mar 7th, 2023 (edited)
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.24 KB | None | 0 0
  1. import numpy as np, matplotlib.pyplot as plt
  2.  
  3. def analytic_func(x, t):
  4.     return np.exp(-t - x) * np.sin(x) * np.sin(2 * t)
  5.  
  6. def first_border(x, t):
  7.     return 0
  8.  
  9. def second_border(x, t):
  10.     return 0
  11.  
  12. def tridiagonal_alg(a, b, c, d, s):
  13.     P = np.zeros(s + 1)
  14.     Q = np.zeros(s + 1)
  15.  
  16.     P[0] = -c[0] / b[0]
  17.     Q[0] = d[0] / b[0]
  18.  
  19.     k = s - 1
  20.     for i in range(1, s):
  21.         P[i] = -c[i] / (b[i] + a[i] * P[i - 1])
  22.         Q[i] = (d[i] - a[i] * Q[i - 1]) / (b[i] + a[i] * P[i - 1])
  23.     P[k] = 0
  24.     Q[k] = (d[k] - a[k] * Q[k - 1]) / (b[k] + a[k] * P[k - 1])
  25.  
  26.     x = np.zeros(s)
  27.     x[k] = Q[k]
  28.  
  29.     for i in range(s - 2, -1, -1):
  30.         x[i] = P[i] * x[i + 1] + Q[i]
  31.  
  32.     return x
  33.  
  34. def implicit(K, t, tau, h, x):
  35.     N = len(x)
  36.     U = np.zeros((K, N))
  37.     t += tau
  38.     sigma = (tau/h) ** 2
  39.     for j in range(N):
  40.         U[0, j] = 0
  41.         U[1, j] = tau * 2 * np.exp(-x[j]) * np.sin(x[j])
  42.  
  43.     for k in range(1, K - 1):
  44.         a = np.zeros(N)
  45.         b = np.zeros(N)
  46.         c = np.zeros(N)
  47.         d = np.zeros(N)
  48.         t += tau
  49.  
  50.         for j in range(1, N - 1):
  51.             a[j] = (1-h) * tau**2
  52.             b[j] = -(2 + 3 * h**2) * tau**2 - (1 + tau) * h**2
  53.             c[j] = (1+h) * tau**2
  54.             d[j] = (U[k-1, j] - 2 * U[k, j] - tau * U[k-1, j]) * h**2
  55.  
  56.             b[0] = -(2 + 3 * h**2) * tau**2 - (1 + tau) * h**2
  57.             c[0] = (1+h) * tau**2
  58.             d[0] = first_border(x[j], t)
  59.  
  60.             a[N - 1] = (1-h) * tau**2
  61.             b[N - 1] = -(2 + 3 * h**2) * tau**2 - (1 + tau) * h**2
  62.             d[N - 1] = second_border(x[j], t)
  63.  
  64.         u_new = tridiagonal_alg(a, b, c, d, N)
  65.         for i in range(N):
  66.             U[k + 1, i] = u_new[i]
  67.  
  68.     return U
  69.  
  70. def explicit(K, t, tau, h, x, a, b, c, d):
  71.     N = len(x)
  72.     U = np.zeros((K, N))
  73.     t += tau
  74.     for j in range(N):
  75.         U[0, j] = 0
  76.         U[1][j] = tau * 2 * np.exp(-x[j]) * np.sin(x[j])
  77.  
  78.     for k in range(1, K - 1):
  79.         t += tau
  80.         for j in range(1, N - 1):
  81.             U[k + 1, j] = ((2 + a * tau) * U[k, j] - U[k - 1, j] +
  82.                            tau ** 2 * (b * (U[k, j + 1] - 2 * U[k, j] + U[k, j - 1]) / h ** 2 + c * (
  83.                             U[k, j + 1] - U[k, j - 1]) / (2 * h) + d * U[k, j])) \
  84.                           / (1 + a * tau)
  85.  
  86.             U[k + 1, 0] = first_border(x[0], t)
  87.             U[k + 1, N - 1] = second_border(x[N - 1], t)
  88.  
  89.     return U
  90.  
  91. def main(N, K, time):
  92.     a = 2
  93.     b = 1
  94.     c = 2
  95.     d = -3
  96.     h = np.pi / N
  97.     tau = time / K
  98.     x = np.arange(0, np.pi + h / 2 - 1e-4, h)
  99.     T = np.arange(0, time, tau)
  100.     t = 0
  101.     U = explicit(K, t, tau, h, x, a, b, c, d)
  102.     #U = implicit(K, t, tau, h, x)
  103.     dt = int(input("Введите момент времени:"))
  104.     U_analytic = analytic_func(x, T[dt])
  105.     plt.title("График точного и численного решения задачи")
  106.     plt.plot(x, U_analytic, label="Точное решение", color="red")
  107.     plt.scatter(x, U[dt, :], label="Численное решение")
  108.     error = abs(U_analytic - U[dt, :])
  109.     plt.xlabel("x")
  110.     plt.ylabel("U")
  111.     plt.text(0.2, -0.25, "Максимальная ошибка метода: " + str(max(error)))
  112.     plt.axis([-0.2, 3.3, -1, 1])
  113.     plt.grid()
  114.     plt.legend()
  115.     plt.show()
  116.  
  117.     plt.title("График ошибки по шагам")
  118.     error_time = np.zeros(len(T))
  119.     for i in range(len(T)):
  120.         error_time[i] = max(abs(analytic_func(x, T[i]) - U[i, :]))
  121.     plt.plot(T, error_time, label="По времени")
  122.     plt.legend()
  123.     plt.grid()
  124.     plt.show()
  125.  
  126.     h = []
  127.     for i in range(0, 40):
  128.         h.append(np.pi / (50 - i))
  129.     er_ex = np.zeros(len(h))
  130.     tau = time / K
  131.  
  132.     for i in range(len(h)):
  133.         x = np.arange(0, np.pi + h[i] / 2 - 1e-4, h[i])
  134.  
  135.         if a * tau / h[i] ** 2 <= 0.5:
  136.             Uex_1 = explicit(K, t, tau, h[i], x, a, b, c, d)
  137.  
  138.         er_ex[i] = max(abs(analytic_func(x, T[dt]) - Uex_1[dt, :]))
  139.  
  140.     print(er_ex)
  141.  
  142.     plt.title('Ошибка явной схемы')
  143.     plt.xlabel('h')
  144.     plt.ylabel('error')
  145.     plt.plot(h, er_ex)
  146.     plt.show()
  147.     return 0
  148.  
  149. if __name__ == '__main__':
  150.     N = 50
  151.     K = 7000
  152.     time = 3
  153.     main(N, K, time)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement