Advertisement
myloyo

№9 Разностный метод решения краевой задачи для ОДУ 2-го порядка

Dec 12th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.85 KB | None | 0 0
  1. import math
  2. def f(x):
  3.     V = 8
  4.     return 4 * pow(x, 4) - 3 * V * pow(x, 3) + 6 * x - 2 * V
  5.  
  6. def p(x):
  7.     return x * x
  8.  
  9. def q(x):
  10.     return x
  11.  
  12. def check_y(x):
  13.     V = 8
  14.     return x * x * (x - V)
  15.  
  16. def tridiagonal_algorithm(a, b, c, d):
  17.     n = len(a)
  18.     p = [0] * (n + 1)
  19.     q = [0] * (n + 1)
  20.     for i in range(n):
  21.         p[i + 1] = c[i] / (b[i] - a[i] * p[i])
  22.         q[i + 1] = (a[i] * q[i] - d[i]) / (b[i] - a[i] * p[i])
  23.  
  24.     res = [0] * n
  25.     res[n - 1] = q[n]
  26.     for i in range(n - 2, -1, -1):
  27.         res[i] = p[i + 1] * res[i + 1] + q[i + 1]
  28.  
  29.     return res
  30.  
  31. def print_result(vx, vy):
  32.     k = 10
  33.     for i in range(0, len(vx), k):
  34.         m = min(i + k, len(vx))
  35.         for j in range(i, m):
  36.             print(f"{vx[j]:.5f}", end="\t")
  37.         print()
  38.         for j in range(i, m):
  39.             print(f"{vy[j]:.5f}", end="\t")
  40.         print()
  41.         for j in range(i, m):
  42.             print(f"{check_y(vx[j]):.5f}", end="\t")
  43.         print()
  44.         for j in range(i, m):
  45.             print(f"{vy[j] - check_y(vx[j]):.5f}", end="\t")
  46.         print()
  47.         print()
  48.  
  49.     mx = 0
  50.     for i in range(len(vy)):
  51.         mx = max(mx, abs(vy[i] - check_y(vx[i])))
  52.     print(f"Максимальное отклонение: {mx:.5f}")
  53.  
  54. def solve():
  55.     n = 6
  56.     l, r = 0, 16  # T = V = 16
  57.     h = (r - l) / n
  58.  
  59.     vx = [l + i * h for i in range(n + 1)]
  60.  
  61.     a = [0] * (n - 1)
  62.     b = [0] * (n - 1)
  63.     c = [0] * (n - 1)
  64.     d = [0] * (n - 1)
  65.  
  66.     for i in range(n - 1):
  67.         x = vx[i + 1]
  68.         a[i] = (1 / h / h - p(x) / 2 / h)
  69.         b[i] = -(-2 / h / h + q(x))
  70.         c[i] = (1 / h / h + p(x) / 2 / h)
  71.         d[i] = f(x)
  72.  
  73.     a[0] = 0
  74.     c[-1] = 0
  75.  
  76.     vy = tridiagonal_algorithm(a, b, c, d)
  77.     vy.insert(0, 0)
  78.     vy.append(0)
  79.  
  80.     print_result(vx, vy)
  81.  
  82.  
  83. if __name__ == "__main__":
  84.     solve()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement